From 516c6a02312e6b5536938744024941f6fbf88cec Mon Sep 17 00:00:00 2001 From: Liam Hughes Date: Thu, 19 Mar 2026 13:18:20 +1100 Subject: [PATCH 1/3] JSON deserialisation tests --- ...eToggleEvaluationDeserializationTests.java | 71 +++++++++++++++++++ .../openfeature/provider/toggle-disabled.json | 6 ++ .../provider/toggle-enabled-no-segments.json | 6 ++ .../openfeature/provider/toggle-list.json | 14 ++++ .../provider/toggle-missing-segments.json | 5 ++ .../provider/toggle-with-segments.json | 9 +++ 6 files changed, 111 insertions(+) create mode 100644 src/test/java/com/octopus/openfeature/provider/FeatureToggleEvaluationDeserializationTests.java create mode 100644 src/test/resources/com/octopus/openfeature/provider/toggle-disabled.json create mode 100644 src/test/resources/com/octopus/openfeature/provider/toggle-enabled-no-segments.json create mode 100644 src/test/resources/com/octopus/openfeature/provider/toggle-list.json create mode 100644 src/test/resources/com/octopus/openfeature/provider/toggle-missing-segments.json create mode 100644 src/test/resources/com/octopus/openfeature/provider/toggle-with-segments.json diff --git a/src/test/java/com/octopus/openfeature/provider/FeatureToggleEvaluationDeserializationTests.java b/src/test/java/com/octopus/openfeature/provider/FeatureToggleEvaluationDeserializationTests.java new file mode 100644 index 0000000..7263dac --- /dev/null +++ b/src/test/java/com/octopus/openfeature/provider/FeatureToggleEvaluationDeserializationTests.java @@ -0,0 +1,71 @@ +package com.octopus.openfeature.provider; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; + +import java.io.InputStream; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class FeatureToggleEvaluationDeserializationTests { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + private InputStream resource(String name) { + return getClass().getResourceAsStream(name); + } + + @Test + void shouldDeserializeEnabledToggle() throws Exception { + FeatureToggleEvaluation result = objectMapper.readValue( + resource("toggle-enabled-no-segments.json"), FeatureToggleEvaluation.class); + + assertThat(result.getName()).isEqualTo("My Feature"); + assertThat(result.getSlug()).isEqualTo("my-feature"); + assertThat(result.isEnabled()).isTrue(); + assertThat(result.getSegments()).isEmpty(); + } + + @Test + void shouldDeserializeDisabledToggle() throws Exception { + FeatureToggleEvaluation result = objectMapper.readValue( + resource("toggle-disabled.json"), FeatureToggleEvaluation.class); + + assertThat(result.isEnabled()).isFalse(); + } + + @Test + void shouldDeserializeToggleWithMissingSegmentsField() throws Exception { + FeatureToggleEvaluation result = objectMapper.readValue( + resource("toggle-missing-segments.json"), FeatureToggleEvaluation.class); + + assertThat(result.getSegments()).isNotNull().isEmpty(); + } + + @Test + void shouldDeserializeToggleWithSegments() throws Exception { + FeatureToggleEvaluation result = objectMapper.readValue( + resource("toggle-with-segments.json"), FeatureToggleEvaluation.class); + + assertThat(result.getSegments()).hasSize(2); + assertThat(result.getSegments()).contains( + Map.entry("license-type", "free"), + Map.entry("country", "au") + ); + } + + @Test + void shouldDeserializeListOfToggles() throws Exception { + List result = objectMapper.readValue( + resource("toggle-list.json"), new TypeReference>() {}); + + assertThat(result).hasSize(2); + assertThat(result.get(0).getSlug()).isEqualTo("feature-a"); + assertThat(result.get(0).isEnabled()).isTrue(); + assertThat(result.get(1).getSlug()).isEqualTo("feature-b"); + assertThat(result.get(1).isEnabled()).isFalse(); + } +} diff --git a/src/test/resources/com/octopus/openfeature/provider/toggle-disabled.json b/src/test/resources/com/octopus/openfeature/provider/toggle-disabled.json new file mode 100644 index 0000000..f09370d --- /dev/null +++ b/src/test/resources/com/octopus/openfeature/provider/toggle-disabled.json @@ -0,0 +1,6 @@ +{ + "name": "My Feature", + "slug": "my-feature", + "isEnabled": false, + "segments": null +} diff --git a/src/test/resources/com/octopus/openfeature/provider/toggle-enabled-no-segments.json b/src/test/resources/com/octopus/openfeature/provider/toggle-enabled-no-segments.json new file mode 100644 index 0000000..e9d17e9 --- /dev/null +++ b/src/test/resources/com/octopus/openfeature/provider/toggle-enabled-no-segments.json @@ -0,0 +1,6 @@ +{ + "name": "My Feature", + "slug": "my-feature", + "isEnabled": true, + "segments": null +} diff --git a/src/test/resources/com/octopus/openfeature/provider/toggle-list.json b/src/test/resources/com/octopus/openfeature/provider/toggle-list.json new file mode 100644 index 0000000..ea6d15f --- /dev/null +++ b/src/test/resources/com/octopus/openfeature/provider/toggle-list.json @@ -0,0 +1,14 @@ +[ + { + "name": "Feature A", + "slug": "feature-a", + "isEnabled": true, + "segments": null + }, + { + "name": "Feature B", + "slug": "feature-b", + "isEnabled": false, + "segments": null + } +] diff --git a/src/test/resources/com/octopus/openfeature/provider/toggle-missing-segments.json b/src/test/resources/com/octopus/openfeature/provider/toggle-missing-segments.json new file mode 100644 index 0000000..285d13e --- /dev/null +++ b/src/test/resources/com/octopus/openfeature/provider/toggle-missing-segments.json @@ -0,0 +1,5 @@ +{ + "name": "My Feature", + "slug": "my-feature", + "isEnabled": true +} diff --git a/src/test/resources/com/octopus/openfeature/provider/toggle-with-segments.json b/src/test/resources/com/octopus/openfeature/provider/toggle-with-segments.json new file mode 100644 index 0000000..d377118 --- /dev/null +++ b/src/test/resources/com/octopus/openfeature/provider/toggle-with-segments.json @@ -0,0 +1,9 @@ +{ + "name": "My Feature", + "slug": "my-feature", + "isEnabled": true, + "segments": [ + { "license-type": "free" }, + { "country": "au" } + ] +} From 70387dcbb6c4d09185784ddc7fb5c0946aee6433 Mon Sep 17 00:00:00 2001 From: Liam Hughes Date: Thu, 19 Mar 2026 14:40:18 +1100 Subject: [PATCH 2/3] Update with OctoToggle response shape --- .../openfeature/provider/toggle-with-segments.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/test/resources/com/octopus/openfeature/provider/toggle-with-segments.json b/src/test/resources/com/octopus/openfeature/provider/toggle-with-segments.json index d377118..88ae4f0 100644 --- a/src/test/resources/com/octopus/openfeature/provider/toggle-with-segments.json +++ b/src/test/resources/com/octopus/openfeature/provider/toggle-with-segments.json @@ -3,7 +3,13 @@ "slug": "my-feature", "isEnabled": true, "segments": [ - { "license-type": "free" }, - { "country": "au" } + { + "key": "license-type", + "value": "free" + }, + { + "key": "country", + "value": "au" + } ] -} +} \ No newline at end of file From 45a7d62146f1b09416c3b3c4651e789713618481 Mon Sep 17 00:00:00 2001 From: Liam Hughes Date: Fri, 20 Mar 2026 13:49:26 +1100 Subject: [PATCH 3/3] Add shouldIgnoreExtraneousProperties test --- .../FeatureToggleEvaluationDeserializationTests.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/com/octopus/openfeature/provider/FeatureToggleEvaluationDeserializationTests.java b/src/test/java/com/octopus/openfeature/provider/FeatureToggleEvaluationDeserializationTests.java index 7263dac..6039425 100644 --- a/src/test/java/com/octopus/openfeature/provider/FeatureToggleEvaluationDeserializationTests.java +++ b/src/test/java/com/octopus/openfeature/provider/FeatureToggleEvaluationDeserializationTests.java @@ -68,4 +68,15 @@ void shouldDeserializeListOfToggles() throws Exception { assertThat(result.get(1).getSlug()).isEqualTo("feature-b"); assertThat(result.get(1).isEnabled()).isFalse(); } + + @Test + void shouldIgnoreExtraneousProperties() throws Exception { + FeatureToggleEvaluation result = objectMapper.readValue( + resource("toggle-with-extraneous-properties.json"), FeatureToggleEvaluation.class); + + assertThat(result.getName()).isEqualTo("My Feature"); + assertThat(result.getSlug()).isEqualTo("my-feature"); + assertThat(result.isEnabled()).isTrue(); + assertThat(result.getSegments()).isEmpty(); + } }