Skip to content

Commit 01410f9

Browse files
feat: add hook support test to check if data is passed between stages
1 parent cb7b48d commit 01410f9

File tree

1 file changed

+42
-18
lines changed

1 file changed

+42
-18
lines changed

src/test/java/dev/openfeature/sdk/HookSupportTest.java

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.Arrays;
1010
import java.util.Collections;
1111
import java.util.HashMap;
12+
import java.util.List;
1213
import java.util.Map;
1314
import java.util.Optional;
1415
import 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

Comments
 (0)