From 5a48d42ce8b94e606090979e58cfb82deefed96e Mon Sep 17 00:00:00 2001 From: DBlanchard88 Date: Thu, 25 Apr 2024 15:12:50 -0400 Subject: [PATCH 1/4] mutablecontext settargetkey now return(s) this method chainable Signed-off-by: DBlanchard88 --- .../java/dev/openfeature/sdk/MutableContext.java | 3 ++- .../dev/openfeature/sdk/MutableContextTest.java | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/openfeature/sdk/MutableContext.java b/src/main/java/dev/openfeature/sdk/MutableContext.java index b63f9b314..7de394f0a 100644 --- a/src/main/java/dev/openfeature/sdk/MutableContext.java +++ b/src/main/java/dev/openfeature/sdk/MutableContext.java @@ -87,10 +87,11 @@ public MutableContext add(String key, List value) { /** * Override or set targeting key for this mutable context. Value should be non-null and non-empty to be accepted. */ - public void setTargetingKey(String targetingKey) { + public MutableContext setTargetingKey(String targetingKey) { if (targetingKey != null && !targetingKey.trim().isEmpty()) { this.add(TARGETING_KEY, targetingKey); } + return this; } diff --git a/src/test/java/dev/openfeature/sdk/MutableContextTest.java b/src/test/java/dev/openfeature/sdk/MutableContextTest.java index 1d462b12c..5608f81c5 100644 --- a/src/test/java/dev/openfeature/sdk/MutableContextTest.java +++ b/src/test/java/dev/openfeature/sdk/MutableContextTest.java @@ -116,4 +116,19 @@ void mergeShouldRetainItsSubkeysWhenOverridingContextHasNoTargetingKey() { Structure value = key1.asStructure(); assertArrayEquals(new Object[]{"key1_1"}, value.keySet().toArray()); } + + @DisplayName("Ensuring mutations are chainable") + @Test + void shouldAllowChainingOfMutations() { + MutableContext context = new MutableContext(); + context.add("key1", "val1") + .add("key2", 2) + .setTargetingKey("TARGETING_KEY") + .add("key3", 3.0); + + assertEquals("TARGETING_KEY", context.getTargetingKey()); + assertEquals("val1", context.getValue("key1").asString()); + assertEquals(2, context.getValue("key2").asInteger()); + assertEquals(3.0, context.getValue("key3").asDouble()); + } } From b997dfeb12db492bbed3e418e7cce3aecde9cf45 Mon Sep 17 00:00:00 2001 From: DBlanchard88 Date: Mon, 29 Apr 2024 14:48:06 -0400 Subject: [PATCH 2/4] addHooks & setEvaluationContext are now chainable Signed-off-by: DBlanchard88 --- src/main/java/dev/openfeature/sdk/Client.java | 4 +-- .../openfeature/sdk/OpenFeatureClient.java | 6 ++-- .../sdk/OpenFeatureClientTest.java | 33 +++++++++++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/openfeature/sdk/Client.java b/src/main/java/dev/openfeature/sdk/Client.java index ebca0b131..4494180aa 100644 --- a/src/main/java/dev/openfeature/sdk/Client.java +++ b/src/main/java/dev/openfeature/sdk/Client.java @@ -18,7 +18,7 @@ public interface Client extends Features, EventBus { * Set the client-level evaluation context. * @param ctx Client level context. */ - void setEvaluationContext(EvaluationContext ctx); + Client setEvaluationContext(EvaluationContext ctx); /** * Adds hooks for evaluation. @@ -26,7 +26,7 @@ public interface Client extends Features, EventBus { * * @param hooks The hook to add. */ - void addHooks(Hook... hooks); + Client addHooks(Hook... hooks); /** * Fetch the hooks associated to this client. diff --git a/src/main/java/dev/openfeature/sdk/OpenFeatureClient.java b/src/main/java/dev/openfeature/sdk/OpenFeatureClient.java index 3455c0c0e..ce763a34b 100644 --- a/src/main/java/dev/openfeature/sdk/OpenFeatureClient.java +++ b/src/main/java/dev/openfeature/sdk/OpenFeatureClient.java @@ -56,10 +56,11 @@ public OpenFeatureClient(OpenFeatureAPI openFeatureAPI, String name, String vers * {@inheritDoc} */ @Override - public void addHooks(Hook... hooks) { + public OpenFeatureClient addHooks(Hook... hooks) { try (AutoCloseableLock __ = this.hooksLock.writeLockAutoCloseable()) { this.clientHooks.addAll(Arrays.asList(hooks)); } + return this; } /** @@ -76,10 +77,11 @@ public List getHooks() { * {@inheritDoc} */ @Override - public void setEvaluationContext(EvaluationContext evaluationContext) { + public OpenFeatureClient setEvaluationContext(EvaluationContext evaluationContext) { try (AutoCloseableLock __ = contextLock.writeLockAutoCloseable()) { this.evaluationContext = evaluationContext; } + return this; } /** diff --git a/src/test/java/dev/openfeature/sdk/OpenFeatureClientTest.java b/src/test/java/dev/openfeature/sdk/OpenFeatureClientTest.java index 9036576d6..75c337940 100644 --- a/src/test/java/dev/openfeature/sdk/OpenFeatureClientTest.java +++ b/src/test/java/dev/openfeature/sdk/OpenFeatureClientTest.java @@ -3,12 +3,21 @@ import java.util.*; import dev.openfeature.sdk.fixtures.HookFixtures; +import net.sf.saxon.expr.Component.M; + +import org.checkerframework.checker.units.qual.m; import org.junit.jupiter.api.*; import org.mockito.Mockito; import org.simplify4u.slf4jmock.LoggerMock; import org.slf4j.Logger; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; class OpenFeatureClientTest implements HookFixtures { @@ -67,4 +76,28 @@ void mergeContextTest() { assertThat(result.getValue()).isTrue(); } + + @Test + @DisplayName("addHooks should allow chaining by returning the same client instance") + void addHooksShouldAllowChaining() { + OpenFeatureAPI api = mock(OpenFeatureAPI.class); + OpenFeatureClient client = new OpenFeatureClient(api, "name", "version"); + Hook hook1 = Mockito.mock(Hook.class); + Hook hook2 = Mockito.mock(Hook.class); + + OpenFeatureClient result = client.addHooks(hook1, hook2); + assertSame(client, result, "addHooks method should be chainable"); + } + + @Test + @DisplayName("setEvaluationContext should allow chaining by returning the same client instance") + void setEvaluationContextShouldAllowChaining() { + OpenFeatureAPI api = mock(OpenFeatureAPI.class); + OpenFeatureClient client = new OpenFeatureClient(api, "name", "version"); + EvaluationContext ctx = new ImmutableContext("targeting key", new HashMap<>()); + + OpenFeatureClient result = client.setEvaluationContext(ctx); + assertSame(client, result, "setEvaluationContext method should be chainable"); + } + } From 12bae9424c90db2e8d14ce30b41901aa7fac4b3d Mon Sep 17 00:00:00 2001 From: DBlanchard88 Date: Mon, 29 Apr 2024 15:18:35 -0400 Subject: [PATCH 3/4] OpenFeatureAPI setEvaluationContext new chainable Signed-off-by: DBlanchard88 --- src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java | 3 ++- .../java/dev/openfeature/sdk/OpenFeatureAPITest.java | 9 +++++++++ .../java/dev/openfeature/sdk/OpenFeatureClientTest.java | 9 +++------ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java b/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java index eb9d3a714..896d60a34 100644 --- a/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java +++ b/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java @@ -83,10 +83,11 @@ public Client getClient(@Nullable String name, @Nullable String version) { /** * {@inheritDoc} */ - public void setEvaluationContext(EvaluationContext evaluationContext) { + public OpenFeatureAPI setEvaluationContext(EvaluationContext evaluationContext) { try (AutoCloseableLock __ = lock.writeLockAutoCloseable()) { this.evaluationContext = evaluationContext; } + return this; } /** diff --git a/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java b/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java index 63a1dadd6..eceace2bb 100644 --- a/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java +++ b/src/test/java/dev/openfeature/sdk/OpenFeatureAPITest.java @@ -5,6 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.Collections; +import java.util.HashMap; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -78,4 +79,12 @@ void settingNamedClientProviderToNullErrors() { void settingTransactionalContextPropagatorToNullErrors() { assertThatCode(() -> api.setTransactionContextPropagator(null)).isInstanceOf(IllegalArgumentException.class); } + + @Test + void setEvaluationContextShouldAllowChaining() { + OpenFeatureClient client = new OpenFeatureClient(api, "name", "version"); + EvaluationContext ctx = new ImmutableContext("targeting key", new HashMap<>()); + OpenFeatureClient result = client.setEvaluationContext(ctx); + assertEquals(client, result); + } } diff --git a/src/test/java/dev/openfeature/sdk/OpenFeatureClientTest.java b/src/test/java/dev/openfeature/sdk/OpenFeatureClientTest.java index 75c337940..d6340a844 100644 --- a/src/test/java/dev/openfeature/sdk/OpenFeatureClientTest.java +++ b/src/test/java/dev/openfeature/sdk/OpenFeatureClientTest.java @@ -3,9 +3,7 @@ import java.util.*; import dev.openfeature.sdk.fixtures.HookFixtures; -import net.sf.saxon.expr.Component.M; -import org.checkerframework.checker.units.qual.m; import org.junit.jupiter.api.*; import org.mockito.Mockito; import org.simplify4u.slf4jmock.LoggerMock; @@ -13,7 +11,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertSame; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; @@ -86,7 +83,7 @@ void addHooksShouldAllowChaining() { Hook hook2 = Mockito.mock(Hook.class); OpenFeatureClient result = client.addHooks(hook1, hook2); - assertSame(client, result, "addHooks method should be chainable"); + assertEquals(client, result); } @Test @@ -97,7 +94,7 @@ void setEvaluationContextShouldAllowChaining() { EvaluationContext ctx = new ImmutableContext("targeting key", new HashMap<>()); OpenFeatureClient result = client.setEvaluationContext(ctx); - assertSame(client, result, "setEvaluationContext method should be chainable"); + assertEquals(client, result); } - + } From 25ca8e4d2fc86370c52ca581dd9223312bd40f11 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Wed, 1 May 2024 10:19:33 -0400 Subject: [PATCH 4/4] Update src/test/java/dev/openfeature/sdk/MutableContextTest.java Signed-off-by: Todd Baert --- src/test/java/dev/openfeature/sdk/MutableContextTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/dev/openfeature/sdk/MutableContextTest.java b/src/test/java/dev/openfeature/sdk/MutableContextTest.java index 5608f81c5..df21e6eca 100644 --- a/src/test/java/dev/openfeature/sdk/MutableContextTest.java +++ b/src/test/java/dev/openfeature/sdk/MutableContextTest.java @@ -117,7 +117,7 @@ void mergeShouldRetainItsSubkeysWhenOverridingContextHasNoTargetingKey() { assertArrayEquals(new Object[]{"key1_1"}, value.keySet().toArray()); } - @DisplayName("Ensuring mutations are chainable") + @DisplayName("Ensure mutations are chainable") @Test void shouldAllowChainingOfMutations() { MutableContext context = new MutableContext();