11package com .flagsmith .flagengine ;
22
3- import com .fasterxml .jackson .core .type .TypeReference ;
3+ import com .fasterxml .jackson .core .json .JsonReadFeature ;
4+ import com .fasterxml .jackson .databind .json .JsonMapper ;
45import com .fasterxml .jackson .databind .JsonNode ;
5- import com .flagsmith .MapperFactory ;
6- import com .flagsmith .mappers .EngineMappers ;
7- import com .flagsmith .models .FeatureStateModel ;
8- import com .flagsmith .models .Flags ;
9-
10- import groovy .util .Eval ;
11- import com .fasterxml .jackson .databind .ObjectMapper ;
12- import org .junit .BeforeClass ;
6+ import java .io .BufferedReader ;
7+ import java .io .IOException ;
8+ import java .nio .file .Files ;
9+ import java .nio .file .Path ;
10+ import java .nio .file .Paths ;
11+ import java .util .stream .Stream ;
12+ import org .assertj .core .api .recursive .comparison .RecursiveComparisonConfiguration ;
1313import org .junit .jupiter .params .ParameterizedTest ;
1414import org .junit .jupiter .params .provider .Arguments ;
1515import org .junit .jupiter .params .provider .MethodSource ;
16- import java .io .File ;
17- import java .util .ArrayList ;
18- import java .util .HashMap ;
19- import java .util .List ;
20- import java .util .Map ;
21- import java .util .Optional ;
22- import java .util .stream .Collectors ;
23- import java .util .stream .Stream ;
24- import java .util .stream .StreamSupport ;
25- import static org .junit .jupiter .api .Assertions .assertEquals ;
16+ import static org .assertj .core .api .Assertions .assertThat ;
2617
2718public class EngineTest {
28- private static final String ENVIRONMENT_JSON_FILE_LOCATION =
29- "src/test/java/com/flagsmith/flagengine/enginetestdata/" +
30- "data/environment_n9fbf9h3v4fFgH3U3ngWhb.json" ;
31- private static ObjectMapper objectMapper = MapperFactory .getMapper ();
32-
33- private static Stream <Arguments > engineTestData () {
34- try {
35- JsonNode engineTestData = objectMapper .readTree (new File (ENVIRONMENT_JSON_FILE_LOCATION ));
36-
37- JsonNode environmentDocument = engineTestData .get ("environment" );
38- JsonNode identitiesAndResponses = engineTestData .get ("identities_and_responses" );
39-
40- EvaluationContext baseEvaluationContext = EngineMappers .mapEnvironmentDocumentToContext (environmentDocument );
41-
42- List <Arguments > returnValues = new ArrayList <>();
43-
44- if (identitiesAndResponses .isArray ()) {
45- for (JsonNode identityAndResponse : identitiesAndResponses ) {
46- JsonNode identity = identityAndResponse .get ("identity" );
47- Map <String , Object > traits = Optional .ofNullable (identity .get ("identity_traits" ))
48- .filter (JsonNode ::isArray )
49- .map (node -> StreamSupport .stream (node .spliterator (), false )
50- .filter (trait -> trait .hasNonNull ("trait_key" ))
51- .collect (Collectors .toMap (
52- trait -> trait .get ("trait_key" ).asText (),
53- trait -> objectMapper .convertValue (trait .get ("trait_value" ), Object .class ))))
54- .orElseGet (HashMap ::new );
55-
56- EvaluationContext evaluationContext = EngineMappers .mapContextAndIdentityDataToContext (
57- baseEvaluationContext , identity .get ("identifier" ).asText (), traits );
58-
59- if (identity .hasNonNull ("django_id" )) {
60- evaluationContext .getIdentity ().setKey (identity .get ("django_id" ).asText ());
61- }
62-
63- JsonNode expectedResponse = identityAndResponse .get ("response" );
64-
65- returnValues .add (Arguments .of (evaluationContext , expectedResponse ));
66-
67- }
68- }
69-
70- return returnValues .stream ();
71-
72- } catch (Exception e ) {
73- System .out .println ("Exception in engineTestData: " + e .getMessage ());
74- e .printStackTrace ();
19+ private static final Path testCasesPath = Paths
20+ .get ("src/test/java/com/flagsmith/flagengine/enginetestdata/test_cases" );
21+ private static JsonMapper mapper = JsonMapper .builder ()
22+ .enable (JsonReadFeature .ALLOW_JAVA_COMMENTS .mappedFeature ())
23+ .build ();
24+ RecursiveComparisonConfiguration recursiveComparisonConfig = RecursiveComparisonConfiguration .builder ()
25+ .build ();
26+
27+ private static Arguments engineTestDataFromFile (Path path ) {
28+ try (BufferedReader reader = Files .newBufferedReader (path )) {
29+ JsonNode root = mapper .readTree (reader );
30+ return Arguments .of (
31+ mapper .treeToValue (root .get ("context" ), EvaluationContext .class ),
32+ mapper .treeToValue (root .get ("result" ), EvaluationResult .class ));
33+ } catch (IOException e ) {
34+ throw new RuntimeException ("Failed to read test data from file: " + path , e );
7535 }
76- return null ;
36+ }
37+
38+ private static Stream <Arguments > engineTestData () throws IOException {
39+ return Files .walk (testCasesPath )
40+ .filter (Files ::isRegularFile )
41+ .filter (p -> {
42+ String n = p .getFileName ().toString ();
43+ return n .endsWith (".json" ) || n .endsWith (".jsonc" );
44+ })
45+ .map (EngineTest ::engineTestDataFromFile );
7746 }
7847
7948 @ ParameterizedTest ()
8049 @ MethodSource ("engineTestData" )
81- public void testEngine (EvaluationContext evaluationContext , JsonNode expectedResponse ) {
50+ public void testEngine (EvaluationContext evaluationContext , EvaluationResult expectedResult ) {
8251 EvaluationResult evaluationResult = Engine .getEvaluationResult (evaluationContext );
8352
84- List <FeatureStateModel > flags = objectMapper .convertValue (
85- expectedResponse .get ("flags" ),
86- new TypeReference <List <FeatureStateModel >>() {});
87-
88- flags .sort ((fsm1 , fsm2 ) -> fsm1 .getFeature ().getName ().compareTo (fsm2 .getFeature ().getName ()));
89- List <FlagResult > sortedResults = evaluationResult .getFlags ().stream ()
90- .sorted ((fr1 , fr2 ) -> fr1 .getName ().compareTo (fr2 .getName ()))
91- .collect (Collectors .toList ());
92-
93- assertEquals (flags .size (), sortedResults .size ());
94- for (int i = 0 ; i < flags .size (); i ++) {
95- FeatureStateModel fsm = flags .get (i );
96- FlagResult fr = sortedResults .get (i );
97-
98- assertEquals (fsm .getFeature ().getName (), fr .getName ());
99- assertEquals (fsm .getEnabled (), fr .getEnabled ());
100- assertEquals (fsm .getValue (), fr .getValue ());
101- }
53+ assertThat (evaluationResult )
54+ .usingRecursiveComparison (recursiveComparisonConfig )
55+ .ignoringAllOverriddenEquals ()
56+ .isEqualTo (expectedResult );
10257 }
10358}
0 commit comments