11package com .devcycle .sdk .server .openfeature ;
22
3- import com .devcycle .sdk .server .common .api .IDevCycleClient ;
4- import com .devcycle .sdk .server .common .model .Variable ;
5- import dev .openfeature .sdk .*;
6- import dev .openfeature .sdk .exceptions .ProviderNotReadyError ;
7- import dev .openfeature .sdk .exceptions .TargetingKeyMissingError ;
8- import dev .openfeature .sdk .exceptions .TypeMismatchError ;
3+ import static org .mockito .ArgumentMatchers .any ;
4+ import static org .mockito .Mockito .mock ;
5+ import static org .mockito .Mockito .when ;
6+
7+ import java .util .ArrayList ;
8+ import java .util .HashMap ;
9+ import java .util .LinkedHashMap ;
10+ import java .util .List ;
11+ import java .util .Map ;
12+
913import org .junit .Assert ;
1014import org .junit .Test ;
1115import org .junit .runner .RunWith ;
1216import org .mockito .junit .MockitoJUnitRunner ;
1317
14- import java .util .*;
18+ import com .devcycle .sdk .server .common .api .IDevCycleClient ;
19+ import com .devcycle .sdk .server .common .model .EvalReason ;
20+ import com .devcycle .sdk .server .common .model .Variable ;
1521
16- import static org .mockito .Mockito .*;
22+ import dev .openfeature .sdk .ErrorCode ;
23+ import dev .openfeature .sdk .ImmutableContext ;
24+ import dev .openfeature .sdk .ProviderEvaluation ;
25+ import dev .openfeature .sdk .Reason ;
26+ import dev .openfeature .sdk .Structure ;
27+ import dev .openfeature .sdk .Value ;
28+ import dev .openfeature .sdk .exceptions .ProviderNotReadyError ;
29+ import dev .openfeature .sdk .exceptions .TargetingKeyMissingError ;
30+ import dev .openfeature .sdk .exceptions .TypeMismatchError ;
1731
1832@ RunWith (MockitoJUnitRunner .class )
1933public class DevCycleProviderTest {
@@ -90,7 +104,7 @@ public void testResolveVariableDefaulted() {
90104 IDevCycleClient dvcClient = mock (IDevCycleClient .class );
91105 when (dvcClient .isInitialized ()).thenReturn (true );
92106
93- when (dvcClient .variable (any (), any (), any ())).thenReturn (Variable .builder ().key ("some-flag" ).value ("unused value 1" ).defaultValue ("default value" ).isDefaulted (true ).type (Variable .TypeEnum .STRING ).build ());
107+ when (dvcClient .variable (any (), any (), any ())).thenReturn (Variable .builder ().key ("some-flag" ).value ("unused value 1" ).defaultValue ("default value" ).isDefaulted (true ).type (Variable .TypeEnum .STRING ).eval ( EvalReason . defaultReason ( EvalReason . DefaultReasonDetailsEnum . USER_NOT_TARGETED )). build ());
94108
95109 DevCycleProvider provider = new DevCycleProvider (dvcClient );
96110
@@ -99,6 +113,8 @@ public void testResolveVariableDefaulted() {
99113 Assert .assertEquals (result .getValue (), "default value" );
100114 Assert .assertEquals (result .getReason (), Reason .DEFAULT .toString ());
101115 Assert .assertNull (result .getErrorCode ());
116+ Assert .assertNotNull (result .getFlagMetadata ());
117+ Assert .assertEquals (result .getFlagMetadata ().getString ("evalReasonDetails" ), EvalReason .DefaultReasonDetailsEnum .USER_NOT_TARGETED .getValue ());
102118 }
103119
104120 @ Test
@@ -117,6 +133,25 @@ public void testResolveBooleanVariable() {
117133 Assert .assertNull (result .getErrorCode ());
118134 }
119135
136+ @ Test
137+ public void testResolveBooleanVariableWithDevCycleEvalReason () {
138+ IDevCycleClient dvcClient = mock (IDevCycleClient .class );
139+ when (dvcClient .isInitialized ()).thenReturn (true );
140+
141+ when (dvcClient .variable (any (), any (), any ())).thenReturn (Variable .builder ().key ("some-flag" ).value (true ).defaultValue (false ).type (Variable .TypeEnum .BOOLEAN ).eval (new EvalReason ("SPLIT" , "User ID" , "bool_target_id" )).build ());
142+
143+ DevCycleProvider provider = new DevCycleProvider (dvcClient );
144+
145+ ProviderEvaluation <Boolean > result = provider .resolvePrimitiveVariable ("some-flag" , false , new ImmutableContext ("user-1234" ));
146+ Assert .assertNotNull (result );
147+ Assert .assertEquals (result .getValue (), true );
148+ Assert .assertEquals (result .getReason (), "SPLIT" );
149+ Assert .assertNull (result .getErrorCode ());
150+ Assert .assertNotNull (result .getFlagMetadata ());
151+ Assert .assertEquals (result .getFlagMetadata ().getString ("evalReasonDetails" ), "User ID" );
152+ Assert .assertEquals (result .getFlagMetadata ().getString ("evalReasonTargetId" ), "bool_target_id" );
153+ }
154+
120155 @ Test
121156 public void testResolveIntegerVariable () {
122157 IDevCycleClient dvcClient = mock (IDevCycleClient .class );
@@ -249,4 +284,38 @@ public void testGetObjectEvaluation() {
249284 Assert .assertEquals (result .getReason (), Reason .TARGETING_MATCH .toString ());
250285 Assert .assertNull (result .getErrorCode ());
251286 }
287+
288+ @ Test
289+ public void testGetObjectEvaluationWithDevCycleEvalReason () {
290+ Map <String , Object > jsonData = new LinkedHashMap <>();
291+ jsonData .put ("strVal" , "some string" );
292+ jsonData .put ("boolVal" , true );
293+ jsonData .put ("numVal" , 123 );
294+
295+ Map <String , Object > defaultJsonData = new LinkedHashMap <>();
296+
297+ IDevCycleClient dvcClient = mock (IDevCycleClient .class );
298+ when (dvcClient .isInitialized ()).thenReturn (true );
299+ when (dvcClient .variable (any (), any (), any ())).thenReturn (Variable .builder ().key ("some-flag" ).value (jsonData ).defaultValue (defaultJsonData ).type (Variable .TypeEnum .JSON ).eval (new EvalReason ("SPLIT" , "User ID" , "json_target_id" )).build ());
300+
301+ DevCycleProvider provider = new DevCycleProvider (dvcClient );
302+
303+ Value defaultValue = new Value (Structure .mapToStructure (defaultJsonData ));
304+
305+ ProviderEvaluation <Value > result = provider .getObjectEvaluation ("some-flag" , defaultValue , new ImmutableContext ("user-1234" ));
306+ Assert .assertNotNull (result );
307+ Assert .assertNotNull (result .getValue ());
308+ Assert .assertTrue (result .getValue ().isStructure ());
309+
310+ result .getValue ().asStructure ().asObjectMap ().forEach ((k , v ) -> {
311+ Assert .assertTrue (jsonData .containsKey (k ));
312+ Assert .assertEquals (jsonData .get (k ), v );
313+ });
314+
315+ Assert .assertEquals (result .getReason (), "SPLIT" );
316+ Assert .assertNull (result .getErrorCode ());
317+ Assert .assertNotNull (result .getFlagMetadata ());
318+ Assert .assertEquals (result .getFlagMetadata ().getString ("evalReasonDetails" ), "User ID" );
319+ Assert .assertEquals (result .getFlagMetadata ().getString ("evalReasonTargetId" ), "json_target_id" );
320+ }
252321}
0 commit comments