@@ -413,6 +413,7 @@ from dtoOption in Generator.JsonObject.OptionOf()
413413 from fixture in Fixture . Generate ( )
414414 select ( resourceKey , putCalls , fixture with
415415 {
416+ IsDryRun = ( ) => false ,
416417 GetDto = async ( _ , _ , _ , _ ) =>
417418 {
418419 await ValueTask . CompletedTask ;
@@ -458,6 +459,7 @@ public async Task Dto_resources_without_a_dto_are_not_put()
458459 from fixture in Fixture . Generate ( )
459460 select ( resourceKey , putCalls , fixture with
460461 {
462+ IsDryRun = ( ) => false ,
461463 GetDto = async ( _ , _ , _ , _ ) =>
462464 {
463465 await ValueTask . CompletedTask ;
@@ -506,6 +508,7 @@ from dto in Generator.JsonObject
506508 from fixture in Fixture . Generate ( )
507509 select ( resourceKey , dto , putApis , putWorkspaceApis , putOthers , fixture with
508510 {
511+ IsDryRun = ( ) => false ,
509512 GetDto = async ( _ , _ , _ , _ ) =>
510513 {
511514 await ValueTask . CompletedTask ;
@@ -562,8 +565,56 @@ await Assert.That(putOthers)
562565 } ) ;
563566 }
564567
568+ [ Test ]
569+ public async Task Resources_are_not_put_in_dry_run ( )
570+ {
571+ var gen = from resourceKey in Generator . GenerateResourceKey ( resource => resource is IResourceWithDto )
572+ from dto in Generator . JsonObject
573+ let putCalls = new ConcurrentBag < byte > ( )
574+ from fixture in Fixture . Generate ( )
575+ select ( resourceKey , putCalls , fixture with
576+ {
577+ IsDryRun = ( ) => true ,
578+ GetDto = async ( _ , _ , _ , _ ) =>
579+ {
580+ await ValueTask . CompletedTask ;
581+ return dto ;
582+ } ,
583+ PutApi = async ( _ , _ , _ ) =>
584+ {
585+ await ValueTask . CompletedTask ;
586+ putCalls . Add ( 0 ) ;
587+ } ,
588+ PutWorkspaceApi = async ( _ , _ , _ , _ ) =>
589+ {
590+ await ValueTask . CompletedTask ;
591+ putCalls . Add ( 0 ) ;
592+ } ,
593+ PutResourceInApim = async ( _ , _ , _ , _ , _ ) =>
594+ {
595+ await ValueTask . CompletedTask ;
596+ putCalls . Add ( 0 ) ;
597+ }
598+ } ) ;
599+
600+ await gen . SampleAsync ( async tuple =>
601+ {
602+ // Arrange
603+ var ( resourceKey , putCalls , fixture ) = tuple ;
604+ var putResource = fixture . Resolve ( ) ;
605+
606+ // Act
607+ await putResource ( resourceKey , CancellationToken ) ;
608+
609+ // Assert that no put methods were called
610+ await Assert . That ( putCalls )
611+ . IsEmpty ( ) ;
612+ } ) ;
613+ }
614+
565615 private sealed record Fixture
566616 {
617+ public required IsDryRun IsDryRun { get ; init ; }
567618 public required GetDto GetDto { get ; init ; }
568619 public required PutApi PutApi { get ; init ; }
569620 public required PutWorkspaceApi PutWorkspaceApi { get ; init ; }
@@ -573,7 +624,8 @@ public PutResource Resolve()
573624 {
574625 var services = new ServiceCollection ( ) ;
575626
576- services . AddSingleton ( GetDto )
627+ services . AddSingleton ( IsDryRun )
628+ . AddSingleton ( GetDto )
577629 . AddSingleton ( PutApi )
578630 . AddSingleton ( PutWorkspaceApi )
579631 . AddSingleton ( PutResourceInApim )
@@ -587,8 +639,10 @@ public PutResource Resolve()
587639
588640 public static Gen < Fixture > Generate ( ) =>
589641 from dtoOption in Generator . JsonObject . OptionOf ( )
642+ from isDryRun in Gen . Bool
590643 select new Fixture
591644 {
645+ IsDryRun = ( ) => isDryRun ,
592646 GetDto = async ( _ , _ , _ , _ ) =>
593647 {
594648 await ValueTask . CompletedTask ;
@@ -625,6 +679,7 @@ public async Task Proper_delegate_is_called()
625679 from fixture in Fixture . Generate ( )
626680 select ( resourceKey , deletedApis , deletedWorkspaceApis , deletedOthers , fixture with
627681 {
682+ IsDryRun = ( ) => false ,
628683 DeleteApi = async ( name , _ ) =>
629684 {
630685 await ValueTask . CompletedTask ;
@@ -676,8 +731,50 @@ await Assert.That(deletedOthers)
676731 } ) ;
677732 }
678733
734+ [ Test ]
735+ public async Task Resources_are_not_deleted_in_dry_run ( )
736+ {
737+ var gen = from resourceKey in Generator . ResourceKey
738+ let deleteCalls = new ConcurrentBag < byte > ( )
739+ from fixture in Fixture . Generate ( )
740+ select ( resourceKey , deleteCalls , fixture with
741+ {
742+ IsDryRun = ( ) => true ,
743+ DeleteApi = async ( _ , _ ) =>
744+ {
745+ await ValueTask . CompletedTask ;
746+ deleteCalls . Add ( 0 ) ;
747+ } ,
748+ DeleteWorkspaceApi = async ( _ , _ , _ ) =>
749+ {
750+ await ValueTask . CompletedTask ;
751+ deleteCalls . Add ( 0 ) ;
752+ } ,
753+ DeleteResourceFromApim = async ( _ , _ , _ , _ ) =>
754+ {
755+ await ValueTask . CompletedTask ;
756+ deleteCalls . Add ( 0 ) ;
757+ }
758+ } ) ;
759+
760+ await gen . SampleAsync ( async tuple =>
761+ {
762+ // Arrange
763+ var ( resourceKey , deleteCalls , fixture ) = tuple ;
764+ var deleteResource = fixture . Resolve ( ) ;
765+
766+ // Act
767+ await deleteResource ( resourceKey , CancellationToken ) ;
768+
769+ // Assert that no delete methods were called
770+ await Assert . That ( deleteCalls )
771+ . IsEmpty ( ) ;
772+ } ) ;
773+ }
774+
679775 private sealed record Fixture
680776 {
777+ public required IsDryRun IsDryRun { get ; init ; }
681778 public required DeleteApi DeleteApi { get ; init ; }
682779 public required DeleteWorkspaceApi DeleteWorkspaceApi { get ; init ; }
683780 public required DeleteResourceFromApim DeleteResourceFromApim { get ; init ; }
@@ -686,7 +783,8 @@ public DeleteResource Resolve()
686783 {
687784 var services = new ServiceCollection ( ) ;
688785
689- services . AddSingleton ( DeleteApi )
786+ services . AddSingleton ( IsDryRun )
787+ . AddSingleton ( DeleteApi )
690788 . AddSingleton ( DeleteWorkspaceApi )
691789 . AddSingleton ( DeleteResourceFromApim )
692790 . AddTestActivitySource ( )
@@ -698,9 +796,10 @@ public DeleteResource Resolve()
698796 }
699797
700798 public static Gen < Fixture > Generate ( ) =>
701- from dtoOption in Generator . JsonObject . OptionOf ( )
799+ from isDryRun in Gen . Bool
702800 select new Fixture
703801 {
802+ IsDryRun = ( ) => isDryRun ,
704803 DeleteApi = async ( _ , _ ) =>
705804 {
706805 await ValueTask . CompletedTask ;
0 commit comments