diff --git a/hooks/open-telemetry/src/main/java/dev/openfeature/contrib/hooks/otel/OpenTelemetryHook.java b/hooks/open-telemetry/src/main/java/dev/openfeature/contrib/hooks/otel/OpenTelemetryHook.java index bd659993c..917bb37fd 100644 --- a/hooks/open-telemetry/src/main/java/dev/openfeature/contrib/hooks/otel/OpenTelemetryHook.java +++ b/hooks/open-telemetry/src/main/java/dev/openfeature/contrib/hooks/otel/OpenTelemetryHook.java @@ -1,8 +1,8 @@ package dev.openfeature.contrib.hooks.otel; -import dev.openfeature.javasdk.Client; -import dev.openfeature.javasdk.NoOpProvider; -import dev.openfeature.javasdk.OpenFeatureAPI; +import dev.openfeature.sdk.Client; +import dev.openfeature.sdk.NoOpProvider; +import dev.openfeature.sdk.OpenFeatureAPI; /** * A placeholder. diff --git a/pom.xml b/pom.xml index 555bccf2b..8ec729d05 100644 --- a/pom.xml +++ b/pom.xml @@ -48,11 +48,11 @@ - + dev.openfeature - javasdk - - [0.2,) + sdk + + [0.3,) provided diff --git a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java index 79ae66f17..a31890038 100644 --- a/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java +++ b/providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/FlagdProvider.java @@ -5,8 +5,6 @@ import java.util.Map; import java.util.stream.Collectors; -import org.apache.commons.lang3.EnumUtils; - import dev.openfeature.flagd.grpc.Schema.ResolveBooleanRequest; import dev.openfeature.flagd.grpc.Schema.ResolveBooleanResponse; import dev.openfeature.flagd.grpc.Schema.ResolveFloatRequest; @@ -19,13 +17,12 @@ import dev.openfeature.flagd.grpc.Schema.ResolveStringResponse; import dev.openfeature.flagd.grpc.ServiceGrpc; import dev.openfeature.flagd.grpc.ServiceGrpc.ServiceBlockingStub; -import dev.openfeature.javasdk.EvaluationContext; -import dev.openfeature.javasdk.FeatureProvider; -import dev.openfeature.javasdk.Metadata; -import dev.openfeature.javasdk.ProviderEvaluation; -import dev.openfeature.javasdk.Reason; -import dev.openfeature.javasdk.Structure; -import dev.openfeature.javasdk.Value; +import dev.openfeature.sdk.EvaluationContext; +import dev.openfeature.sdk.FeatureProvider; +import dev.openfeature.sdk.Metadata; +import dev.openfeature.sdk.MutableStructure; +import dev.openfeature.sdk.ProviderEvaluation; +import dev.openfeature.sdk.Value; import io.grpc.ManagedChannelBuilder; import lombok.extern.slf4j.Slf4j; @@ -97,7 +94,7 @@ public ProviderEvaluation getBooleanEvaluation(String key, Boolean defa return ProviderEvaluation.builder() .value(r.getValue()) .variant(r.getVariant()) - .reason(this.mapReason(r.getReason())) + .reason(r.getReason()) .build(); } @@ -110,7 +107,7 @@ public ProviderEvaluation getStringEvaluation(String key, String default ResolveStringResponse r = this.serviceStub.resolveString(request); return ProviderEvaluation.builder().value(r.getValue()) .variant(r.getVariant()) - .reason(this.mapReason(r.getReason())) + .reason(r.getReason()) .build(); } @@ -125,7 +122,7 @@ public ProviderEvaluation getDoubleEvaluation(String key, Double default return ProviderEvaluation.builder() .value(r.getValue()) .variant(r.getVariant()) - .reason(this.mapReason(r.getReason())) + .reason(r.getReason()) .build(); } @@ -140,7 +137,7 @@ public ProviderEvaluation getIntegerEvaluation(String key, Integer defa return ProviderEvaluation.builder() .value((int) r.getValue()) .variant(r.getVariant()) - .reason(this.mapReason(r.getReason())) + .reason(r.getReason()) .build(); } @@ -155,19 +152,10 @@ public ProviderEvaluation getObjectEvaluation(String key, Value defaultVa return ProviderEvaluation.builder() .value(this.convertObjectResponse(r.getValue())) .variant(r.getVariant()) - .reason(this.mapReason(r.getReason())) + .reason(r.getReason()) .build(); } - // Map FlagD reasons to Java SDK reasons. - private Reason mapReason(String flagdReason) { - if (!EnumUtils.isValidEnum(Reason.class, flagdReason)) { - return Reason.UNKNOWN; - } else { - return Reason.valueOf(flagdReason); - } - } - /** * Recursively convert protobuf structure to openfeature value. */ @@ -233,7 +221,7 @@ private Value convertProtobufMap(Map map) { com.google.protobuf.Value value = map.get(key); values.put(key, this.convertAny(value)); }); - return new Value(new Structure(values)); + return new Value(new MutableStructure(values)); } /** diff --git a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdProviderTest.java b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdProviderTest.java index 89ecfc19d..1aa7432c3 100644 --- a/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdProviderTest.java +++ b/providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/FlagdProviderTest.java @@ -20,12 +20,14 @@ import dev.openfeature.flagd.grpc.Schema.ResolveObjectResponse; import dev.openfeature.flagd.grpc.Schema.ResolveStringResponse; import dev.openfeature.flagd.grpc.ServiceGrpc.ServiceBlockingStub; -import dev.openfeature.javasdk.EvaluationContext; -import dev.openfeature.javasdk.FlagEvaluationDetails; -import dev.openfeature.javasdk.OpenFeatureAPI; -import dev.openfeature.javasdk.Reason; -import dev.openfeature.javasdk.Structure; -import dev.openfeature.javasdk.Value; +import dev.openfeature.sdk.EvaluationContext; +import dev.openfeature.sdk.FlagEvaluationDetails; +import dev.openfeature.sdk.MutableContext; +import dev.openfeature.sdk.MutableStructure; +import dev.openfeature.sdk.OpenFeatureAPI; +import dev.openfeature.sdk.Reason; +import dev.openfeature.sdk.Structure; +import dev.openfeature.sdk.Value; class FlagdProviderTest { @@ -40,7 +42,7 @@ class FlagdProviderTest { static final Double DOUBLE_VALUE = .5d; static final String INNER_STRUCT_KEY = "inner_key"; static final String INNER_STRUCT_VALUE = "inner_value"; - static final Structure OBJECT_VALUE = new Structure() {{ + static final Structure OBJECT_VALUE = new MutableStructure() {{ add(INNER_STRUCT_KEY, INNER_STRUCT_VALUE); }}; static final com.google.protobuf.Struct PROTOBUF_STRUCTURE_VALUE = com.google.protobuf.Struct.newBuilder() @@ -104,28 +106,28 @@ void resolvers_call_grpc_service_and_return_details() { FlagEvaluationDetails booleanDetails = api.getClient().getBooleanDetails(FLAG_KEY, false); assertTrue(booleanDetails.getValue()); assertEquals(BOOL_VARIANT, booleanDetails.getVariant()); - assertEquals(DEFAULT, booleanDetails.getReason()); + assertEquals(DEFAULT.toString(), booleanDetails.getReason()); FlagEvaluationDetails stringDetails = api.getClient().getStringDetails(FLAG_KEY, "wrong"); assertEquals(STRING_VALUE, stringDetails.getValue()); assertEquals(STRING_VARIANT, stringDetails.getVariant()); - assertEquals(DEFAULT, stringDetails.getReason()); + assertEquals(DEFAULT.toString(), stringDetails.getReason()); FlagEvaluationDetails intDetails = api.getClient().getIntegerDetails(FLAG_KEY, 0); assertEquals(INT_VALUE, intDetails.getValue()); assertEquals(INT_VARIANT, intDetails.getVariant()); - assertEquals(DEFAULT, intDetails.getReason()); + assertEquals(DEFAULT.toString(), intDetails.getReason()); FlagEvaluationDetails floatDetails = api.getClient().getDoubleDetails(FLAG_KEY, 0.1); assertEquals(DOUBLE_VALUE, floatDetails.getValue()); assertEquals(DOUBLE_VARIANT, floatDetails.getVariant()); - assertEquals(DEFAULT, floatDetails.getReason()); + assertEquals(DEFAULT.toString(), floatDetails.getReason()); FlagEvaluationDetails objectDetails = api.getClient().getObjectDetails(FLAG_KEY, new Value()); assertEquals(INNER_STRUCT_VALUE, objectDetails.getValue().asStructure() .asMap().get(INNER_STRUCT_KEY).asString()); assertEquals(OBJECT_VARIANT, objectDetails.getVariant()); - assertEquals(DEFAULT, objectDetails.getReason()); + assertEquals(DEFAULT.toString(), objectDetails.getReason()); } @Test @@ -147,7 +149,7 @@ void context_is_parsed_and_passed_to_grpc_service() { add(new Value(1)); }}; final String STRUCT_ATTR_INNER_VALUE = "struct-inner-value"; - final Structure STRUCT_ATTR_VALUE = new Structure().add(STRUCT_ATTR_INNER_KEY, STRUCT_ATTR_INNER_VALUE); + final Structure STRUCT_ATTR_VALUE = new MutableStructure().add(STRUCT_ATTR_INNER_KEY, STRUCT_ATTR_INNER_VALUE); final String DEFAULT_STRING = "DEFAULT"; ResolveBooleanResponse booleanResponse = ResolveBooleanResponse.newBuilder() @@ -170,7 +172,7 @@ void context_is_parsed_and_passed_to_grpc_service() { OpenFeatureAPI.getInstance().setProvider(new FlagdProvider(serviceBlockingStubMock)); - EvaluationContext context = new EvaluationContext(); + MutableContext context = new MutableContext(); context.add(BOOLEAN_ATTR_KEY, BOOLEAN_ATTR_VALUE); context.add(INT_ATTR_KEY, INT_ATTR_VALUE); context.add(DOUBLE_ATTR_KEY, DOUBLE_ATTR_VALUE); @@ -181,15 +183,16 @@ void context_is_parsed_and_passed_to_grpc_service() { FlagEvaluationDetails booleanDetails = api.getClient().getBooleanDetails(FLAG_KEY, false, context); assertTrue(booleanDetails.getValue()); assertEquals(BOOL_VARIANT, booleanDetails.getVariant()); - assertEquals(DEFAULT, booleanDetails.getReason()); // reason should be converted from STATIC -> DEFAULT + assertEquals(DEFAULT.toString(), booleanDetails.getReason()); } + //TODO: update this to be able unknown codes @Test void reason_mapped_correctly_if_unknown() { ResolveBooleanResponse badReasonResponse = ResolveBooleanResponse.newBuilder() .setValue(true) .setVariant(BOOL_VARIANT) - .setReason("NOT_A_REAL_REASON") // set an invalid reason string + .setReason("UNKNOWN") // set an invalid reason string .build(); ServiceBlockingStub serviceBlockingStubMock = mock(ServiceBlockingStub.class); @@ -198,7 +201,7 @@ void reason_mapped_correctly_if_unknown() { OpenFeatureAPI.getInstance().setProvider(new FlagdProvider(serviceBlockingStubMock)); FlagEvaluationDetails booleanDetails = api.getClient() - .getBooleanDetails(FLAG_KEY, false, new EvaluationContext()); - assertEquals(Reason.UNKNOWN, booleanDetails.getReason()); // reason should be converted to UNKNOWN + .getBooleanDetails(FLAG_KEY, false, new MutableContext()); + assertEquals(Reason.UNKNOWN.toString(), booleanDetails.getReason()); // reason should be converted to UNKNOWN } } \ No newline at end of file diff --git a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/GoFeatureFlagProvider.java b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/GoFeatureFlagProvider.java index 324091417..0423441bb 100644 --- a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/GoFeatureFlagProvider.java +++ b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/GoFeatureFlagProvider.java @@ -1,26 +1,37 @@ package dev.openfeature.contrib.providers.gofeatureflag; +import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; + +import java.io.IOException; +import java.time.Instant; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + import dev.openfeature.contrib.providers.gofeatureflag.bean.GoFeatureFlagRequest; import dev.openfeature.contrib.providers.gofeatureflag.bean.GoFeatureFlagResponse; import dev.openfeature.contrib.providers.gofeatureflag.bean.GoFeatureFlagUser; import dev.openfeature.contrib.providers.gofeatureflag.exception.InvalidEndpoint; import dev.openfeature.contrib.providers.gofeatureflag.exception.InvalidOptions; -import dev.openfeature.javasdk.ErrorCode; -import dev.openfeature.javasdk.EvaluationContext; -import dev.openfeature.javasdk.FeatureProvider; -import dev.openfeature.javasdk.Hook; -import dev.openfeature.javasdk.Metadata; -import dev.openfeature.javasdk.ProviderEvaluation; -import dev.openfeature.javasdk.Reason; -import dev.openfeature.javasdk.Structure; -import dev.openfeature.javasdk.Value; -import dev.openfeature.javasdk.exceptions.FlagNotFoundError; -import dev.openfeature.javasdk.exceptions.GeneralError; -import dev.openfeature.javasdk.exceptions.OpenFeatureError; -import dev.openfeature.javasdk.exceptions.TypeMismatchError; +import dev.openfeature.sdk.ErrorCode; +import dev.openfeature.sdk.EvaluationContext; +import dev.openfeature.sdk.FeatureProvider; +import dev.openfeature.sdk.Hook; +import dev.openfeature.sdk.Metadata; +import dev.openfeature.sdk.MutableStructure; +import dev.openfeature.sdk.ProviderEvaluation; +import dev.openfeature.sdk.Reason; +import dev.openfeature.sdk.Structure; +import dev.openfeature.sdk.Value; +import dev.openfeature.sdk.exceptions.FlagNotFoundError; +import dev.openfeature.sdk.exceptions.GeneralError; +import dev.openfeature.sdk.exceptions.OpenFeatureError; +import dev.openfeature.sdk.exceptions.TypeMismatchError; import okhttp3.ConnectionPool; import okhttp3.HttpUrl; import okhttp3.MediaType; @@ -30,15 +41,6 @@ import okhttp3.Response; import okhttp3.ResponseBody; -import java.io.IOException; -import java.time.Instant; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; - /** * GoFeatureFlagProvider is the JAVA provider implementation for the feature flag solution GO Feature Flag. */ @@ -199,7 +201,8 @@ private ProviderEvaluation resolveEvaluationGoFeatureFlagProxy( if (Reason.DISABLED.name().equalsIgnoreCase(goffResp.getReason())) { // we don't set a variant since we are using the default value, and we are not able to know // which variant it is. - return ProviderEvaluation.builder().value(defaultValue).reason(Reason.DISABLED).build(); + return ProviderEvaluation.builder().value(defaultValue).reason(Reason.DISABLED.toString()) + .build(); } if (ErrorCode.FLAG_NOT_FOUND.name().equalsIgnoreCase(goffResp.getErrorCode())) { @@ -215,8 +218,7 @@ private ProviderEvaluation resolveEvaluationGoFeatureFlagProxy( } return ProviderEvaluation.builder() - .errorCode(goffResp.getErrorCode()) - .reason(mapReason(goffResp.getReason())) + .reason(goffResp.getReason()) .value(flagValue) .variant(goffResp.getVariationType()) .build(); @@ -227,22 +229,6 @@ private ProviderEvaluation resolveEvaluationGoFeatureFlagProxy( } } - - /** - * mapReason is mapping the reason in string received by the API to our internal SDK reason enum. - * - * @param reason - string of the reason received from the API - * @return an item from the enum - */ - private Reason mapReason(String reason) { - try { - return Reason.valueOf(reason); - } catch (IllegalArgumentException e) { - return Reason.UNKNOWN; - } - } - - /** * convertValue is converting the object return by the proxy response in the right type. * @@ -303,7 +289,7 @@ private Value objectToValue(Object object) { * @return a Structure object in the SDK format */ private Structure mapToStructure(Map map) { - return new Structure( + return new MutableStructure( map.entrySet().stream() .filter(e -> e.getValue() != null) .collect(Collectors.toMap(Map.Entry::getKey, e -> objectToValue(e.getValue())))); diff --git a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/bean/GoFeatureFlagUser.java b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/bean/GoFeatureFlagUser.java index 874c07496..a00b9f8ed 100644 --- a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/bean/GoFeatureFlagUser.java +++ b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/bean/GoFeatureFlagUser.java @@ -1,8 +1,8 @@ package dev.openfeature.contrib.providers.gofeatureflag.bean; import dev.openfeature.contrib.providers.gofeatureflag.exception.InvalidTargetingKey; -import dev.openfeature.javasdk.EvaluationContext; -import dev.openfeature.javasdk.Value; +import dev.openfeature.sdk.EvaluationContext; +import dev.openfeature.sdk.Value; import lombok.Builder; import lombok.Getter; diff --git a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/exception/InvalidTargetingKey.java b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/exception/InvalidTargetingKey.java index 506e5d689..a004890c6 100644 --- a/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/exception/InvalidTargetingKey.java +++ b/providers/go-feature-flag/src/main/java/dev/openfeature/contrib/providers/gofeatureflag/exception/InvalidTargetingKey.java @@ -1,7 +1,7 @@ package dev.openfeature.contrib.providers.gofeatureflag.exception; -import dev.openfeature.javasdk.ErrorCode; -import dev.openfeature.javasdk.exceptions.OpenFeatureError; +import dev.openfeature.sdk.ErrorCode; +import dev.openfeature.sdk.exceptions.OpenFeatureError; import lombok.experimental.StandardException; /** diff --git a/providers/go-feature-flag/src/test/java/dev/openfeature/contrib/providers/gofeatureflag/GoFeatureFlagProviderTest.java b/providers/go-feature-flag/src/test/java/dev/openfeature/contrib/providers/gofeatureflag/GoFeatureFlagProviderTest.java index 7220466c5..fcc8ec082 100644 --- a/providers/go-feature-flag/src/test/java/dev/openfeature/contrib/providers/gofeatureflag/GoFeatureFlagProviderTest.java +++ b/providers/go-feature-flag/src/test/java/dev/openfeature/contrib/providers/gofeatureflag/GoFeatureFlagProviderTest.java @@ -1,34 +1,37 @@ package dev.openfeature.contrib.providers.gofeatureflag; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import dev.openfeature.contrib.providers.gofeatureflag.exception.InvalidEndpoint; import dev.openfeature.contrib.providers.gofeatureflag.exception.InvalidOptions; import dev.openfeature.contrib.providers.gofeatureflag.exception.InvalidTargetingKey; -import dev.openfeature.javasdk.EvaluationContext; -import dev.openfeature.javasdk.ProviderEvaluation; -import dev.openfeature.javasdk.Reason; -import dev.openfeature.javasdk.Structure; -import dev.openfeature.javasdk.Value; -import dev.openfeature.javasdk.exceptions.FlagNotFoundError; -import dev.openfeature.javasdk.exceptions.GeneralError; -import dev.openfeature.javasdk.exceptions.TypeMismatchError; +import dev.openfeature.sdk.MutableContext; +import dev.openfeature.sdk.MutableStructure; +import dev.openfeature.sdk.ProviderEvaluation; +import dev.openfeature.sdk.Reason; +import dev.openfeature.sdk.Value; +import dev.openfeature.sdk.exceptions.FlagNotFoundError; +import dev.openfeature.sdk.exceptions.GeneralError; +import dev.openfeature.sdk.exceptions.TypeMismatchError; import lombok.SneakyThrows; import okhttp3.HttpUrl; import okhttp3.mockwebserver.Dispatcher; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; class GoFeatureFlagProviderTest { // Dispatcher is the configuration of the mock server to test the provider. @@ -50,7 +53,7 @@ public MockResponse dispatch(RecordedRequest request) { }; private MockWebServer server; private HttpUrl baseUrl; - private EvaluationContext evaluationContext; + private MutableContext evaluationContext; @BeforeEach void beforeEach() throws IOException { @@ -59,7 +62,7 @@ void beforeEach() throws IOException { this.server.start(); this.baseUrl = server.url(""); - this.evaluationContext = new EvaluationContext(); + this.evaluationContext = new MutableContext(); this.evaluationContext.setTargetingKey("d45e303a-38c2-11ed-a261-0242ac120002"); this.evaluationContext.add("email", "john.doe@gofeatureflag.org"); this.evaluationContext.add("firstname", "john"); @@ -68,7 +71,7 @@ void beforeEach() throws IOException { this.evaluationContext.add("professional", true); this.evaluationContext.add("rate", 3.14); this.evaluationContext.add("age", 30); - this.evaluationContext.add("company_info", new Structure().add("name", "my_company").add("size", 120)); + this.evaluationContext.add("company_info", new MutableStructure().add("name", "my_company").add("size", 120)); List labels = new ArrayList<>(); labels.add(new Value("pro")); labels.add(new Value("beta")); @@ -135,8 +138,7 @@ void should_resolve_a_valid_boolean_flag_with_TARGETING_MATCH_reason() throws In GoFeatureFlagProvider g = new GoFeatureFlagProvider(GoFeatureFlagProviderOptions.builder().endpoint(this.baseUrl.toString()).timeout(1000).build()); ProviderEvaluation res = g.getBooleanEvaluation("bool_targeting_match", false, this.evaluationContext); assertEquals(true, res.getValue()); - assertEquals("", res.getErrorCode()); - assertEquals(Reason.TARGETING_MATCH, res.getReason()); + assertEquals(Reason.TARGETING_MATCH.toString(), res.getReason()); assertEquals("True", res.getVariant()); } @@ -145,8 +147,7 @@ void should_return_unknown_reason_if_not_exists_in_SDK() throws InvalidOptions { GoFeatureFlagProvider g = new GoFeatureFlagProvider(GoFeatureFlagProviderOptions.builder().endpoint(this.baseUrl.toString()).timeout(1000).build()); ProviderEvaluation res = g.getBooleanEvaluation("unknown_reason", false, this.evaluationContext); assertEquals(true, res.getValue()); - assertEquals("", res.getErrorCode()); - assertEquals(Reason.UNKNOWN, res.getReason()); + assertEquals("CUSTOM_REASON", res.getReason()); assertEquals("True", res.getVariant()); } @@ -155,7 +156,7 @@ void should_use_boolean_default_value_if_the_flag_is_disabled() throws InvalidOp GoFeatureFlagProvider g = new GoFeatureFlagProvider(GoFeatureFlagProviderOptions.builder().endpoint(this.baseUrl.toString()).timeout(1000).build()); ProviderEvaluation res = g.getBooleanEvaluation("disabled", false, this.evaluationContext); assertEquals(false, res.getValue()); - assertEquals(Reason.DISABLED, res.getReason()); + assertEquals(Reason.DISABLED.toString(), res.getReason()); } @Test @@ -169,8 +170,7 @@ void should_resolve_a_valid_string_flag_with_TARGETING_MATCH_reason() throws Inv GoFeatureFlagProvider g = new GoFeatureFlagProvider(GoFeatureFlagProviderOptions.builder().endpoint(this.baseUrl.toString()).timeout(1000).build()); ProviderEvaluation res = g.getStringEvaluation("string_key", "defaultValue", this.evaluationContext); assertEquals("CC0000", res.getValue()); - assertEquals("", res.getErrorCode()); - assertEquals(Reason.TARGETING_MATCH, res.getReason()); + assertEquals(Reason.TARGETING_MATCH.toString(), res.getReason()); assertEquals("True", res.getVariant()); } @@ -179,7 +179,7 @@ void should_use_string_default_value_if_the_flag_is_disabled() throws InvalidOpt GoFeatureFlagProvider g = new GoFeatureFlagProvider(GoFeatureFlagProviderOptions.builder().endpoint(this.baseUrl.toString()).timeout(1000).build()); ProviderEvaluation res = g.getStringEvaluation("disabled", "defaultValue", this.evaluationContext); assertEquals("defaultValue", res.getValue()); - assertEquals(Reason.DISABLED, res.getReason()); + assertEquals(Reason.DISABLED.toString(), res.getReason()); } @Test @@ -193,8 +193,7 @@ void should_resolve_a_valid_integer_flag_with_TARGETING_MATCH_reason() throws In GoFeatureFlagProvider g = new GoFeatureFlagProvider(GoFeatureFlagProviderOptions.builder().endpoint(this.baseUrl.toString()).timeout(1000).build()); ProviderEvaluation res = g.getIntegerEvaluation("integer_key", 1200, this.evaluationContext); assertEquals(100, res.getValue()); - assertEquals("", res.getErrorCode()); - assertEquals(Reason.TARGETING_MATCH, res.getReason()); + assertEquals(Reason.TARGETING_MATCH.toString(), res.getReason()); assertEquals("True", res.getVariant()); } @@ -203,7 +202,7 @@ void should_use_integer_default_value_if_the_flag_is_disabled() throws InvalidOp GoFeatureFlagProvider g = new GoFeatureFlagProvider(GoFeatureFlagProviderOptions.builder().endpoint(this.baseUrl.toString()).timeout(1000).build()); ProviderEvaluation res = g.getIntegerEvaluation("disabled", 1225, this.evaluationContext); assertEquals(1225, res.getValue()); - assertEquals(Reason.DISABLED, res.getReason()); + assertEquals(Reason.DISABLED.toString(), res.getReason()); } @Test @@ -217,8 +216,7 @@ void should_resolve_a_valid_double_flag_with_TARGETING_MATCH_reason() throws Inv GoFeatureFlagProvider g = new GoFeatureFlagProvider(GoFeatureFlagProviderOptions.builder().endpoint(this.baseUrl.toString()).timeout(1000).build()); ProviderEvaluation res = g.getDoubleEvaluation("double_key", 1200.25, this.evaluationContext); assertEquals(100.25, res.getValue()); - assertEquals("", res.getErrorCode()); - assertEquals(Reason.TARGETING_MATCH, res.getReason()); + assertEquals(Reason.TARGETING_MATCH.toString(), res.getReason()); assertEquals("True", res.getVariant()); } @@ -227,17 +225,16 @@ void should_use_double_default_value_if_the_flag_is_disabled() throws InvalidOpt GoFeatureFlagProvider g = new GoFeatureFlagProvider(GoFeatureFlagProviderOptions.builder().endpoint(this.baseUrl.toString()).timeout(1000).build()); ProviderEvaluation res = g.getDoubleEvaluation("disabled", 1225.34, this.evaluationContext); assertEquals(1225.34, res.getValue()); - assertEquals(Reason.DISABLED, res.getReason()); + assertEquals(Reason.DISABLED.toString(), res.getReason()); } @Test void should_resolve_a_valid_value_flag_with_TARGETING_MATCH_reason() throws InvalidOptions { GoFeatureFlagProvider g = new GoFeatureFlagProvider(GoFeatureFlagProviderOptions.builder().endpoint(this.baseUrl.toString()).timeout(1000).build()); ProviderEvaluation res = g.getObjectEvaluation("object_key", null, this.evaluationContext); - Value want = new Value(new Structure().add("test", "test1").add("test2", false).add("test3", 123.3).add("test4", 1)); + Value want = new Value(new MutableStructure().add("test", "test1").add("test2", false).add("test3", 123.3).add("test4", 1)); assertEquals(want, res.getValue()); - assertEquals("", res.getErrorCode()); - assertEquals(Reason.TARGETING_MATCH, res.getReason()); + assertEquals(Reason.TARGETING_MATCH.toString(), res.getReason()); assertEquals("True", res.getVariant()); } @@ -247,8 +244,7 @@ void should_wrap_into_value_if_wrong_type() throws InvalidOptions { ProviderEvaluation res = g.getObjectEvaluation("string_key", null, this.evaluationContext); Value want = new Value("CC0000"); assertEquals(want, res.getValue()); - assertEquals("", res.getErrorCode()); - assertEquals(Reason.TARGETING_MATCH, res.getReason()); + assertEquals(Reason.TARGETING_MATCH.toString(), res.getReason()); assertEquals("True", res.getVariant()); } @@ -257,14 +253,14 @@ void should_use_object_default_value_if_the_flag_is_disabled() throws InvalidOpt GoFeatureFlagProvider g = new GoFeatureFlagProvider(GoFeatureFlagProviderOptions.builder().endpoint(this.baseUrl.toString()).timeout(1000).build()); ProviderEvaluation res = g.getObjectEvaluation("disabled", new Value("default"), this.evaluationContext); assertEquals(new Value("default"), res.getValue()); - assertEquals(Reason.DISABLED, res.getReason()); + assertEquals(Reason.DISABLED.toString(), res.getReason()); } @Test void should_resolve_a_valid_value_flag_with_a_list() throws InvalidOptions { GoFeatureFlagProvider g = new GoFeatureFlagProvider(GoFeatureFlagProviderOptions.builder().endpoint(this.baseUrl.toString()).timeout(1000).build()); - assertThrows(InvalidTargetingKey.class, () -> g.getObjectEvaluation("list_key", null, new EvaluationContext())); + assertThrows(InvalidTargetingKey.class, () -> g.getObjectEvaluation("list_key", null, new MutableContext())); } @Test @@ -278,8 +274,7 @@ void should_throw_an_error_if_no_targeting_key() throws InvalidOptions { new Value("false"), new Value("test3")))); assertEquals(want, res.getValue()); - assertEquals("", res.getErrorCode()); - assertEquals(Reason.TARGETING_MATCH, res.getReason()); + assertEquals(Reason.TARGETING_MATCH.toString(), res.getReason()); assertEquals("True", res.getVariant()); }