diff --git a/.idea/modules.xml b/.idea/modules.xml index f446c54..7774680 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,6 @@ - diff --git a/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AbstractAttributeParser.java b/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AbstractAttributeParser.java index a3ae617..e258c46 100644 --- a/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AbstractAttributeParser.java +++ b/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AbstractAttributeParser.java @@ -51,7 +51,7 @@ protected final boolean enabled(@NotNull final JsonNode keyNode) { } /** - * Get feature flag value node ({@code "$.{key_name}.flag_value"} in JSON).
+ * Get feature flag value node ({@code "$.flag_value"} in JSON.
* e.g. When AWS AppConfig is following (feature flag key name is {@code flag_key}, and feature flag value is * number type {@code 12345})... *
@@ -63,7 +63,8 @@ protected final boolean enabled(@NotNull final JsonNode keyNode) {
      *     }
      * }}
      * 
- * Parameter keyNode is the {@link JsonNode} of following JSON string. + * Parameter keyNode is the {@link JsonNode} of following JSON string. THIS IS SAME AS JSON RESPONSE FROM AWS + * AppConfig WHEN FEATURE FLAG KEY IS SPECIFIED. *
      * {@code
      * {
diff --git a/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AttributeParser.java b/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AttributeParser.java
index c898b96..9e1b6f6 100644
--- a/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AttributeParser.java
+++ b/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AttributeParser.java
@@ -3,7 +3,7 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import io.github.lavenderses.aws_app_config_openfeature_provider.app_config_model.AppConfigValue;
 
-import java.util.function.BiFunction;
+import java.util.function.Function;
 
 /**
  * Parser interface for {@link T}-typed feature flag value from AWS AppConfig JSON response.
@@ -14,4 +14,4 @@ * @param feature flag type in OpenFeature requirements, such as boolean * @param {@link T}-typed {@link AppConfigValue}. this will be returned. */ -interface AttributeParser> extends BiFunction {} +interface AttributeParser> extends Function {} diff --git a/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AwsAppConfigParser.java b/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AwsAppConfigParser.java index 6b539e5..3d0c1cb 100644 --- a/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AwsAppConfigParser.java +++ b/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AwsAppConfigParser.java @@ -11,9 +11,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.VisibleForTesting; -import java.util.function.BiFunction; +import java.util.function.Function; -import static java.util.Objects.isNull; import static java.util.Objects.requireNonNull; /** @@ -46,7 +45,7 @@ public AwsAppConfigParser() { * * @param key feature flag key value in {@link AppConfigValueKey} ({@code "feature flag key name in OpenFeature"}) * @param value JSON response from AWS AppConfig - * @param buildAppConfigValue build {@link V} from (request JSON body, key object in response body) + * @param buildAppConfigValue build {@link V} from request JSON body * @return {@link T}-typed feature flag implementation of {@link AppConfigValue}. Once returned value successfully, * it is guaranteed that JSON response satisfies ALL spec of this Provider's spec, and success to evaluation feature * flag. @@ -57,33 +56,23 @@ public AwsAppConfigParser() { public > V parse( @NotNull final String key, @Language("json") @NotNull final String value, - @NotNull final BiFunction buildAppConfigValue + @NotNull final Function buildAppConfigValue ) { requireNonNull(key, "key"); requireNonNull(value, "value"); - final JsonNode responseNode; + final JsonNode keyNode; try { - responseNode = objectMapper.readTree(value); + keyNode = objectMapper.readTree(value); } catch (JsonProcessingException e) { throw new AppConfigValueParseException( /* response = */ value, /* evaluationResult = */ EvaluationResult.INVALID_ATTRIBUTE_FORMAT ); } - requireNonNull(responseNode, "responseNode"); - - // get key node from response - final JsonNode keyNode = responseNode.get(key); - if (isNull(keyNode)) { - throw new AppConfigValueParseException( - /* response = */ value, - /* evaluationResult = */ EvaluationResult.FLAG_NOT_FOUND - ); - } + requireNonNull(keyNode, "responseNode"); return buildAppConfigValue.apply( - /* t = */ responseNode, /* v = */ keyNode ); } diff --git a/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/BooleanAttributeParser.java b/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/BooleanAttributeParser.java index 017812f..7ca2375 100644 --- a/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/BooleanAttributeParser.java +++ b/core/src/main/java/io/github/lavenderses/aws_app_config_openfeature_provider/parser/BooleanAttributeParser.java @@ -19,7 +19,6 @@ public final class BooleanAttributeParser extends AbstractAttributeParser( /* errorCode = */ ErrorCode.FLAG_NOT_FOUND, /* errorMessage = */ null, diff --git a/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AwsAppConfigParserTest.kt b/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AwsAppConfigParserTest.kt index bb3d5ae..507f5bc 100644 --- a/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AwsAppConfigParserTest.kt +++ b/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/AwsAppConfigParserTest.kt @@ -5,6 +5,7 @@ import assertk.assertions.isEqualTo import io.github.lavenderses.aws_app_config_openfeature_provider.app_config_model.AppConfigBooleanValue import io.github.lavenderses.aws_app_config_openfeature_provider.evaluation_value.EvaluationResult import io.github.lavenderses.aws_app_config_openfeature_provider.utils.ObjectMapperBuilder +import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows @@ -38,32 +39,11 @@ class AwsAppConfigParserTest { // language=JSON val response = """ { - "key": { - "enabled": true, - "flag_value": true - } + "enabled": true, + "flag_value": true } """.trimIndent() - val responseNode = objectMapper.readTree( - // language=JSON - """ - { - "key": { - "enabled": true, - "flag_value": true - } - } - """.trimIndent(), - ) - val keyNode = objectMapper.readTree( - // language=JSON - """ - { - "enabled": true, - "flag_value": true - } - """.trimIndent(), - ) + val keyNode = objectMapper.readTree(response) val expected = AppConfigBooleanValue( /* enabled = */ true, /* value = */ true, @@ -79,7 +59,6 @@ class AwsAppConfigParserTest { ) .whenever(buildAppConfigValue) .apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ) @@ -93,16 +72,17 @@ class AwsAppConfigParserTest { ).isEqualTo(expected) } + @Suppress("ForbiddenComment") + // TODO: Do test + @Disabled @Test fun `key not found`() { // prepare // language=JSON val response = """ { - "invalid_key": { - "enabled": true, - "flag_value": true - } + "enabled": true, + "flag_value": true } """.trimIndent() diff --git a/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/BooleanAttributeParserTest.kt b/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/BooleanAttributeParserTest.kt index 75ff5d5..1c89dbf 100644 --- a/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/BooleanAttributeParserTest.kt +++ b/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/BooleanAttributeParserTest.kt @@ -24,17 +24,6 @@ class BooleanAttributeParserTest { @Test fun normal() { // prepare - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": true, - "flag_value": true - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -47,13 +36,12 @@ class BooleanAttributeParserTest { val expected = AppConfigBooleanValue( /* enabled = */ true, /* value = */ true, - /* jsonFormat = */ """{"key":{"enable":true,"flag_value":true}}""", + /* jsonFormat = */ """{"enable":true,"flag_value":true}""", ) // do & verify assertThat( booleanAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ), ).isEqualTo(expected) @@ -62,18 +50,6 @@ class BooleanAttributeParserTest { @Test fun `enable is false`() { // prepare - // language=JSON - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": false, - "flag_value": true - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -86,13 +62,12 @@ class BooleanAttributeParserTest { val expected = AppConfigBooleanValue( /* enabled = */ false, /* value = */ true, - /* jsonFormat = */ """{"key":{"enable":true,"flag_value":false}}""", + /* jsonFormat = */ """{"enable":true,"flag_value":true}""", ) // do & verify assertThat( booleanAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ), ).isEqualTo(expected) @@ -101,16 +76,6 @@ class BooleanAttributeParserTest { @Test fun `flag_value is null`() { // prepare - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": true - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -123,7 +88,6 @@ class BooleanAttributeParserTest { // do val e = assertThrows { booleanAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ) } diff --git a/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/DoubleAttributeParserTest.kt b/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/DoubleAttributeParserTest.kt index f165bdc..c016b8e 100644 --- a/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/DoubleAttributeParserTest.kt +++ b/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/DoubleAttributeParserTest.kt @@ -24,17 +24,6 @@ class DoubleAttributeParserTest { @Test fun normal() { // prepare - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": true, - "flag_value": 12345.0 - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -48,13 +37,12 @@ class DoubleAttributeParserTest { AppConfigDoubleValue( /* enabled = */ true, /* value = */ 12345.0, - /* jsonFormat = */ """{"key":{"enable":true,"flag_value":12345.0}}""", + /* jsonFormat = */ """{"enable":true,"flag_value":12345.0}""", ) // do & verify assertThat( doubleAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ), ).isEqualTo(expected) @@ -63,18 +51,6 @@ class DoubleAttributeParserTest { @Test fun `enable is false`() { // prepare - // language=JSON - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": false, - "flag_value": 12345.0 - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -88,13 +64,12 @@ class DoubleAttributeParserTest { AppConfigDoubleValue( /* enabled = */ false, /* value = */ 12345.0, - /* jsonFormat = */ """{"key":{"enable":true,"flag_value":12345.0}}""", + /* jsonFormat = */ """{"enable":true,"flag_value":12345.0}""", ) // do & verify assertThat( doubleAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ), ).isEqualTo(expected) @@ -103,16 +78,6 @@ class DoubleAttributeParserTest { @Test fun `flag_value is null`() { // prepare - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": true - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -125,7 +90,6 @@ class DoubleAttributeParserTest { // do val e = assertThrows { doubleAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ) } diff --git a/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/IntegerAttributeParserTest.kt b/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/IntegerAttributeParserTest.kt index 2fd2da8..7aa330b 100644 --- a/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/IntegerAttributeParserTest.kt +++ b/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/IntegerAttributeParserTest.kt @@ -24,17 +24,6 @@ class IntegerAttributeParserTest { @Test fun normal() { // prepare - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": true, - "flag_value": 12345 - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -48,13 +37,12 @@ class IntegerAttributeParserTest { AppConfigIntegerValue( /* enabled = */ true, /* value = */ 12345, - /* jsonFormat = */ """{"key":{"enable":true,"flag_value":12345}}""", + /* jsonFormat = */ """{"enable":true,"flag_value":12345}""", ) // do & verify assertThat( integerAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ), ).isEqualTo(expected) @@ -63,18 +51,6 @@ class IntegerAttributeParserTest { @Test fun `enable is false`() { // prepare - // language=JSON - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": false, - "flag_value": 12345 - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -88,13 +64,12 @@ class IntegerAttributeParserTest { AppConfigIntegerValue( /* enabled = */ false, /* value = */ 12345, - /* jsonFormat = */ """{"key":{"enable":true,"flag_value":12345}}""", + /* jsonFormat = */ """{"enable":true,"flag_value":12345}""", ) // do & verify assertThat( integerAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ), ).isEqualTo(expected) @@ -103,16 +78,6 @@ class IntegerAttributeParserTest { @Test fun `flag_value is null`() { // prepare - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": true - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -125,7 +90,6 @@ class IntegerAttributeParserTest { // do val e = assertThrows { integerAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ) } diff --git a/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/ObjectAttributeParserTest.kt b/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/ObjectAttributeParserTest.kt index c1ca185..c90e9b3 100644 --- a/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/ObjectAttributeParserTest.kt +++ b/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/ObjectAttributeParserTest.kt @@ -34,17 +34,6 @@ class ObjectAttributeParserTest { @Test fun normal() { // prepare - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": true, - "flag_value": 12345 - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -57,13 +46,12 @@ class ObjectAttributeParserTest { val expected = AppConfigObjectValue( /* enabled = */ true, /* value = */ Value(12345), - /* jsonFormat = */ """{"key":{"enable":true,"flag_value":12345}}""", + /* jsonFormat = */ """{"enable":true,"flag_value":12345}""", ) // do & verify assertThat( objectAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ), ).isEqualTo(expected) @@ -72,17 +60,6 @@ class ObjectAttributeParserTest { @Test fun `enable is false`() { // prepare - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": false, - "flag_value": 12345 - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -95,13 +72,12 @@ class ObjectAttributeParserTest { val expected = AppConfigObjectValue( /* enabled = */ false, /* value = */ Value(12345), - /* jsonFormat = */ """{"key":{"enable":false,"flag_value":12345}}""", + /* jsonFormat = */ """{"enable":false,"flag_value":12345}""", ) // do & verify assertThat( objectAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ), ).isEqualTo(expected) @@ -110,16 +86,6 @@ class ObjectAttributeParserTest { @Test fun `flag_value is null`() { // prepare - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": true - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -132,7 +98,6 @@ class ObjectAttributeParserTest { // do val e = assertThrows { objectAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ) } @@ -220,16 +185,14 @@ class ObjectAttributeParserTest { // language=JSON """ { - "flag_value": { - "foo": { - "bar": { - "qux": 12345 - }, - "quux": true + "foo": { + "bar": { + "qux": 12345 }, - "corge": "98765", - "grault": "${Time.FIXED_TIME}" - } + "quux": true + }, + "corge": "98765", + "grault": "${Time.FIXED_TIME}" } """.trimIndent(), ) diff --git a/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/StringAttributeParserTest.kt b/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/StringAttributeParserTest.kt index 19f472e..757fafc 100644 --- a/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/StringAttributeParserTest.kt +++ b/core/src/test/kotlin/io/github/lavenderses/aws_app_config_openfeature_provider/parser/StringAttributeParserTest.kt @@ -24,17 +24,6 @@ class StringAttributeParserTest { @Test fun normal() { // prepare - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": true, - "flag_value": "test" - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -47,13 +36,12 @@ class StringAttributeParserTest { val expected = AppConfigStringValue( /* enabled = */ true, /* value = */ "test", - /* jsonFormat = */ """{"key":{"enable":true,"flag_value":"test"}}""", + /* jsonFormat = */ """{"enable":true,"flag_value":"test"}""", ) // do & verify assertThat( stringAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ), ).isEqualTo(expected) @@ -62,7 +50,6 @@ class StringAttributeParserTest { @Test fun `enable is false`() { // prepare - // language=JSON val responseNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -86,13 +73,12 @@ class StringAttributeParserTest { val expected = AppConfigStringValue( /* enabled = */ false, /* value = */ "test", - /* jsonFormat = */ """{"key":{"enable":true,"flag_value":"test"}}""", + /* jsonFormat = */ """{"enable":true,"flag_value":"test"}""", ) // do & verify assertThat( stringAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ), ).isEqualTo(expected) @@ -101,16 +87,6 @@ class StringAttributeParserTest { @Test fun `flag_value is null`() { // prepare - val responseNode = OBJECT_MAPPER.readTree( - // language=JSON - """ - { - "key": { - "enabled": true - } - } - """.trimIndent(), - ) val keyNode = OBJECT_MAPPER.readTree( // language=JSON """ @@ -123,7 +99,6 @@ class StringAttributeParserTest { // do val e = assertThrows { stringAttributeParser.apply( - /* responseNode = */ responseNode, /* keyNode = */ keyNode, ) }