99import java .util .Arrays ;
1010import java .util .Collections ;
1111import java .util .HashMap ;
12+ import java .util .List ;
1213import java .util .Map ;
1314import java .util .Optional ;
1415import org .junit .jupiter .api .DisplayName ;
@@ -89,6 +90,32 @@ void shouldAlwaysCallGenericHook(FlagValueType flagValueType) {
8990 verify (genericHook ).error (any (), any (), any ());
9091 }
9192
93+ @ ParameterizedTest
94+ @ EnumSource (value = FlagValueType .class )
95+ @ DisplayName ("should pass hook data only between stages" )
96+ void shouldPassHookDataBetweenStages (FlagValueType flagValueType ) {
97+ HookSupport hookSupport = new HookSupport ();
98+ EvaluationContext baseContext = new ImmutableContext ();
99+ HookContext <Object > hookContext = HookContext .<Object >builder ()
100+ .flagKey ("flagKey" )
101+ .type (flagValueType )
102+ .defaultValue (createDefaultValue (flagValueType ))
103+ .ctx (baseContext )
104+ .clientMetadata (() -> "client" )
105+ .providerMetadata (() -> "provider" )
106+ .build ();
107+
108+ TestHook testHook1 = new TestHook ("test-key" , "value-1" );
109+ TestHook testHook2 = new TestHook ("test-key" , 2 );
110+
111+ hookSupport .beforeHooks (flagValueType , hookContext , List .of (testHook1 , testHook2 ), Collections .emptyMap ());
112+
113+ hookSupport .afterAllHooks (flagValueType , hookContext , new FlagEvaluationDetails <>(), List .of (testHook1 , testHook2 ), Collections .emptyMap ());
114+
115+ assertThat (testHook1 .onFinallyAfterValue ).isEqualTo ("value-1" );
116+ assertThat (testHook2 .onFinallyAfterValue ).isEqualTo (2 );
117+ }
118+
92119 private Object createDefaultValue (FlagValueType flagValueType ) {
93120 switch (flagValueType ) {
94121 case INTEGER :
@@ -113,32 +140,29 @@ private EvaluationContext evaluationContextWithValue(String key, String value) {
113140 return baseContext ;
114141 }
115142
116- private static class TestHook implements Hook <String > {
117- boolean beforeCalled = false ;
118- boolean afterCalled = false ;
119- boolean errorCalled = false ;
120- boolean finallyCalled = false ;
143+ private static class TestHook implements Hook {
121144
122- @ Override
123- public Optional <EvaluationContext > before (HookContext <String > ctx , Map <String , Object > hints ) {
124- beforeCalled = true ;
125- return Optional .empty ();
126- }
145+ private final String key ;
146+ private final Object value ;
127147
128- @ Override
129- public void after (HookContext <String > ctx , FlagEvaluationDetails <String > details , Map <String , Object > hints ) {
130- afterCalled = true ;
148+ Object onAfterValue ;
149+ Object onErrorValue ;
150+ Object onFinallyAfterValue ;
151+
152+ TestHook (String key , Object value ) {
153+ this .key = key ;
154+ this .value = value ;
131155 }
132156
133157 @ Override
134- public void error (HookContext <String > ctx , Exception error , Map <String , Object > hints ) {
135- errorCalled = true ;
158+ public Optional <EvaluationContext > before (HookContext ctx , Map hints ) {
159+ ctx .getHookData ().set (key , value );
160+ return Optional .empty ();
136161 }
137162
138163 @ Override
139- public void finallyAfter (
140- HookContext <String > ctx , FlagEvaluationDetails <String > details , Map <String , Object > hints ) {
141- finallyCalled = true ;
164+ public void finallyAfter (HookContext ctx , FlagEvaluationDetails details , Map hints ) {
165+ onFinallyAfterValue = ctx .getHookData ().get (key );
142166 }
143167 }
144168}
0 commit comments