@@ -433,6 +433,41 @@ public async Task When_Exception_Occurs_During_Evaluation_Should_Return_Error()
433433 _ = featureProviderMock . Received ( 1 ) . ResolveStructureValueAsync ( flagName , defaultValue , Arg . Any < EvaluationContext > ( ) ) ;
434434 }
435435
436+ [ Fact ]
437+ public async Task When_Error_Is_Returned_From_Provider_Should_Not_Run_After_Hook_But_Error_Hook ( )
438+ {
439+ var fixture = new Fixture ( ) ;
440+ var domain = fixture . Create < string > ( ) ;
441+ var clientVersion = fixture . Create < string > ( ) ;
442+ var flagName = fixture . Create < string > ( ) ;
443+ var defaultValue = fixture . Create < Value > ( ) ;
444+ const string testMessage = "Couldn't parse flag data." ;
445+
446+ var featureProviderMock = Substitute . For < FeatureProvider > ( ) ;
447+ featureProviderMock . ResolveStructureValueAsync ( flagName , defaultValue , Arg . Any < EvaluationContext > ( ) )
448+ . Returns ( Task . FromResult ( new ResolutionDetails < Value > ( flagName , defaultValue , ErrorType . ParseError ,
449+ "ERROR" , null , testMessage ) ) ) ;
450+ featureProviderMock . GetMetadata ( ) . Returns ( new Metadata ( fixture . Create < string > ( ) ) ) ;
451+ featureProviderMock . GetProviderHooks ( ) . Returns ( ImmutableList < Hook > . Empty ) ;
452+
453+ await Api . Instance . SetProviderAsync ( featureProviderMock ) ;
454+ var client = Api . Instance . GetClient ( domain , clientVersion ) ;
455+ var testHook = new TestHook ( ) ;
456+ client . AddHooks ( testHook ) ;
457+ var response = await client . GetObjectDetailsAsync ( flagName , defaultValue ) ;
458+
459+ response . ErrorType . Should ( ) . Be ( ErrorType . ParseError ) ;
460+ response . Reason . Should ( ) . Be ( Reason . Error ) ;
461+ response . ErrorMessage . Should ( ) . Be ( testMessage ) ;
462+ _ = featureProviderMock . Received ( 1 )
463+ . ResolveStructureValueAsync ( flagName , defaultValue , Arg . Any < EvaluationContext > ( ) ) ;
464+
465+ Assert . Equal ( 1 , testHook . BeforeCallCount ) ;
466+ Assert . Equal ( 0 , testHook . AfterCallCount ) ;
467+ Assert . Equal ( 1 , testHook . ErrorCallCount ) ;
468+ Assert . Equal ( 1 , testHook . FinallyCallCount ) ;
469+ }
470+
436471 [ Fact ]
437472 public async Task Cancellation_Token_Added_Is_Passed_To_Provider ( )
438473 {
@@ -454,6 +489,7 @@ public async Task Cancellation_Token_Added_Is_Passed_To_Provider()
454489 {
455490 await Task . Delay ( 10 ) ; // artificially delay until cancelled
456491 }
492+
457493 return new ResolutionDetails < string > ( flagName , defaultString , ErrorType . None , cancelledReason ) ;
458494 } ) ;
459495 featureProviderMock . GetMetadata ( ) . Returns ( new Metadata ( fixture . Create < string > ( ) ) ) ;
0 commit comments