@@ -307,4 +307,120 @@ public async Task ExceptionGetsPropagatedCorrectly()
307307 var ex = await Assert . ThrowsAsync < InvalidOperationException > ( async ( ) => await responseTask ) ;
308308 Assert . Equal ( "Test Exception 1" , ex . Message ) ;
309309 }
310+
311+ [ Test ]
312+ public async Task TransformWorksWhenNoValueCachedInitially ( )
313+ {
314+ var request = new DelayGetValue . Query ( )
315+ {
316+ Value = 1 ,
317+ Name = "Request1" ,
318+ } ;
319+ request . WaitForTestToContinueOperation . SetResult ( ) ;
320+
321+ var cache = _serviceProvider . GetRequiredService < DelayGetValueCache > ( ) ;
322+
323+ var transformation = new DelayGetValueCache . TransformParameters { Adder = 5 } ;
324+ transformation . WaitForTestToContinueOperation . SetResult ( ) ;
325+ var transformedResponse = await cache . TransformResult ( request , transformation ) ;
326+
327+ Assert . Equal ( 6 , transformedResponse . Value ) ;
328+ Assert . Equal ( 1 , transformation . TimesExecuted ) ;
329+
330+ var cachedResponse = await cache . GetValue ( request ) ;
331+ Assert . Equal ( 6 , cachedResponse . Value ) ;
332+
333+ Assert . True ( cachedResponse . RandomValue == transformedResponse . RandomValue ) ;
334+ }
335+
336+ [ Test ]
337+ public async Task TransformWorksWhenValueCachedInitially ( )
338+ {
339+ var request = new DelayGetValue . Query ( )
340+ {
341+ Value = 1 ,
342+ Name = "Request1" ,
343+ } ;
344+ request . WaitForTestToContinueOperation . SetResult ( ) ;
345+
346+ var cache = _serviceProvider . GetRequiredService < DelayGetValueCache > ( ) ;
347+
348+ var cachedResponse = await cache . GetValue ( request ) ;
349+ Assert . Equal ( 1 , cachedResponse . Value ) ;
350+
351+ var transformation = new DelayGetValueCache . TransformParameters { Adder = 5 } ;
352+ transformation . WaitForTestToContinueOperation . SetResult ( ) ;
353+ var transformedResponse = await cache . TransformResult ( request , transformation ) ;
354+
355+ Assert . Equal ( 6 , transformedResponse . Value ) ;
356+ Assert . Equal ( 1 , transformation . TimesExecuted ) ;
357+
358+ cachedResponse = await cache . GetValue ( request ) ;
359+ Assert . Equal ( 6 , cachedResponse . Value ) ;
360+
361+ Assert . True ( cachedResponse . RandomValue == transformedResponse . RandomValue ) ;
362+ }
363+
364+ [ Test ]
365+ public async Task TransformWorksWhenValueChanges ( )
366+ {
367+ var request = new DelayGetValue . Query ( )
368+ {
369+ Value = 1 ,
370+ Name = "Request1" ,
371+ } ;
372+ request . WaitForTestToContinueOperation . SetResult ( ) ;
373+
374+ var cache = _serviceProvider . GetRequiredService < DelayGetValueCache > ( ) ;
375+
376+ var cachedResponse = await cache . GetValue ( request ) ;
377+ Assert . Equal ( 1 , cachedResponse . Value ) ;
378+
379+ var transformation = new DelayGetValueCache . TransformParameters { Adder = 5 } ;
380+ var transformedResponseTask = cache . TransformResult ( request , transformation ) ;
381+ await transformation . WaitForTestToStartExecuting . Task ;
382+
383+ cache . SetValue ( request , new ( 4 , ExecutedHandler : false , Guid . NewGuid ( ) ) ) ;
384+ transformation . WaitForTestToContinueOperation . SetResult ( ) ;
385+
386+ var transformedResponse = await transformedResponseTask ;
387+ Assert . Equal ( 9 , transformedResponse . Value ) ;
388+ Assert . Equal ( 2 , transformation . TimesExecuted ) ;
389+
390+ cachedResponse = await cache . GetValue ( request ) ;
391+ Assert . Equal ( 9 , cachedResponse . Value ) ;
392+
393+ Assert . True ( cachedResponse . RandomValue == transformedResponse . RandomValue ) ;
394+ }
395+
396+ [ Test ]
397+ public async Task TransformWorksWhenMultipleSimultaneous ( )
398+ {
399+ var request = new DelayGetValue . Query ( )
400+ {
401+ Value = 1 ,
402+ Name = "Request1" ,
403+ } ;
404+ request . WaitForTestToContinueOperation . SetResult ( ) ;
405+
406+ var cache = _serviceProvider . GetRequiredService < DelayGetValueCache > ( ) ;
407+
408+ var transformation1 = new DelayGetValueCache . TransformParameters { Adder = 5 } ;
409+ var transformedResponseTask1 = cache . TransformResult ( request , transformation1 ) ;
410+ await transformation1 . WaitForTestToStartExecuting . Task ;
411+
412+ var transformation2 = new DelayGetValueCache . TransformParameters { Adder = 6 } ;
413+ var transformedResponseTask2 = cache . TransformResult ( request , transformation2 ) ;
414+ await transformation2 . WaitForTestToStartExecuting . Task ;
415+
416+ transformation1 . WaitForTestToContinueOperation . SetResult ( ) ;
417+ var transformedResponse1 = await transformedResponseTask1 ;
418+ Assert . Equal ( 6 , transformedResponse1 . Value ) ;
419+ Assert . Equal ( 1 , transformation1 . TimesExecuted ) ;
420+
421+ transformation2 . WaitForTestToContinueOperation . SetResult ( ) ;
422+ var transformedResponse2 = await transformedResponseTask2 ;
423+ Assert . Equal ( 12 , transformedResponse2 . Value ) ;
424+ Assert . Equal ( 2 , transformation2 . TimesExecuted ) ;
425+ }
310426}
0 commit comments