9
9
import java .util .Arrays ;
10
10
import java .util .Collections ;
11
11
import java .util .HashMap ;
12
+ import java .util .List ;
12
13
import java .util .Map ;
13
14
import java .util .Optional ;
14
15
import org .junit .jupiter .api .DisplayName ;
@@ -89,6 +90,32 @@ void shouldAlwaysCallGenericHook(FlagValueType flagValueType) {
89
90
verify (genericHook ).error (any (), any (), any ());
90
91
}
91
92
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
+
92
119
private Object createDefaultValue (FlagValueType flagValueType ) {
93
120
switch (flagValueType ) {
94
121
case INTEGER :
@@ -113,32 +140,29 @@ private EvaluationContext evaluationContextWithValue(String key, String value) {
113
140
return baseContext ;
114
141
}
115
142
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 {
121
144
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 ;
127
147
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 ;
131
155
}
132
156
133
157
@ 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 ();
136
161
}
137
162
138
163
@ 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 );
142
166
}
143
167
}
144
168
}
0 commit comments