diff --git a/pom.xml b/pom.xml index b42b335..c9b943b 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ com.switcherapi switcher-client jar - 2.5.1 + 2.5.2-SNAPSHOT Switcher Client Switcher Client SDK for working with Switcher API diff --git a/src/main/java/com/switcherapi/client/SwitcherContextBase.java b/src/main/java/com/switcherapi/client/SwitcherContextBase.java index 50a32c5..04c24b1 100644 --- a/src/main/java/com/switcherapi/client/SwitcherContextBase.java +++ b/src/main/java/com/switcherapi/client/SwitcherContextBase.java @@ -398,7 +398,7 @@ public static SwitcherRequest getSwitcher(String key, boolean keepEntries) { final SwitcherRequest switcher = switchers.get(key); if (!keepEntries) { - switcher.resetEntry(); + switcher.flush(); } return switcher; diff --git a/src/main/java/com/switcherapi/client/model/Entry.java b/src/main/java/com/switcherapi/client/model/Entry.java index 80f6df7..d7424b7 100644 --- a/src/main/java/com/switcherapi/client/model/Entry.java +++ b/src/main/java/com/switcherapi/client/model/Entry.java @@ -50,7 +50,7 @@ public String toString() { return String.format("Entry [strategy = %s, input = %s]", strategy, input); } - + @Override public int hashCode() { final int prime = 31; @@ -69,7 +69,7 @@ public boolean equals(Object obj) { return this.input.equals(entry.getInput()); } - return true; + return false; } } diff --git a/src/main/java/com/switcherapi/client/model/SwitcherBuilder.java b/src/main/java/com/switcherapi/client/model/SwitcherBuilder.java index a7d393c..0e17344 100644 --- a/src/main/java/com/switcherapi/client/model/SwitcherBuilder.java +++ b/src/main/java/com/switcherapi/client/model/SwitcherBuilder.java @@ -35,6 +35,16 @@ protected SwitcherBuilder(final SwitcherProperties properties) { this.entry = new ArrayList<>(); this.delay = 0; } + + /** + * Clear all entries previously added + * + * @return {@link SwitcherBuilder} + */ + public SwitcherBuilder flush() { + this.entry.clear(); + return this; + } /** * Skip API calls given a delay time @@ -95,6 +105,7 @@ public SwitcherBuilder restrictRelay(boolean restrictRelay) { */ public SwitcherBuilder check(StrategyValidator strategy, String input) { if (StringUtils.isNotBlank(input)) { + entry.removeIf(e -> e.getStrategy().equals(strategy.toString())); entry.add(Entry.of(strategy, input)); } diff --git a/src/main/java/com/switcherapi/client/model/SwitcherRequest.java b/src/main/java/com/switcherapi/client/model/SwitcherRequest.java index 5e21bbe..cb5a61a 100644 --- a/src/main/java/com/switcherapi/client/model/SwitcherRequest.java +++ b/src/main/java/com/switcherapi/client/model/SwitcherRequest.java @@ -42,7 +42,6 @@ public SwitcherRequest(final String switcherKey, this.switcherExecutor = switcherExecutor; this.switcherKey = switcherKey; this.historyExecution = new HashSet<>(); - this.entry = new ArrayList<>(); } @Override @@ -54,13 +53,10 @@ public SwitcherRequest prepareEntry(final List entry) { @Override public SwitcherRequest prepareEntry(final Entry entry, final boolean add) { if (!add) { - this.entry.clear(); + this.flush(); } - if (!this.entry.contains(entry)) { - this.entry.add(entry); - } - + this.entry.add(entry); return this; } @@ -133,10 +129,6 @@ public SwitcherResult getLastExecutionResult() { public boolean isBypassMetrics() { return bypassMetrics; } - - public void resetEntry() { - this.entry = new ArrayList<>(); - } private boolean canUseAsync() { return super.delay > 0 && !this.historyExecution.isEmpty(); diff --git a/src/main/java/com/switcherapi/client/utils/Mapper.java b/src/main/java/com/switcherapi/client/utils/Mapper.java index 39843f4..fcc3702 100644 --- a/src/main/java/com/switcherapi/client/utils/Mapper.java +++ b/src/main/java/com/switcherapi/client/utils/Mapper.java @@ -5,6 +5,8 @@ import com.switcherapi.client.remote.dto.CriteriaRequest; import com.switcherapi.client.remote.dto.CriteriaResponse; +import java.util.List; + public class Mapper { private Mapper() {} @@ -24,7 +26,11 @@ public static SwitcherResult mapFrom(final CriteriaResponse criteriaResponse, switcherResult.setResult(criteriaResponse.getResult()); switcherResult.setReason(criteriaResponse.getReason()); switcherResult.setMetadata(criteriaResponse.getMetadata()); - switcherResult.setEntry(switcherRequest.getEntry()); + + if (!switcherRequest.getEntry().isEmpty()) { + switcherResult.setEntry(List.copyOf(switcherRequest.getEntry())); + } + return switcherResult; } } diff --git a/src/test/java/com/switcherapi/client/SwitcherBasicCriteriaResponseTest.java b/src/test/java/com/switcherapi/client/SwitcherBasicCriteriaResponseTest.java index 4926c0f..8e6e600 100644 --- a/src/test/java/com/switcherapi/client/SwitcherBasicCriteriaResponseTest.java +++ b/src/test/java/com/switcherapi/client/SwitcherBasicCriteriaResponseTest.java @@ -1,6 +1,7 @@ package com.switcherapi.client; import com.switcherapi.Switchers; +import com.switcherapi.client.model.SwitcherBuilder; import com.switcherapi.client.model.SwitcherRequest; import com.switcherapi.client.model.SwitcherResult; import com.switcherapi.fixture.MetadataErrorSample; @@ -83,6 +84,23 @@ void shouldReturnCriteriaResponseWithInputs() { assertEquals("Strategy VALUE_VALIDATION does not agree", response.getReason()); } + @Test + void shouldFlushStrategyInputs() { + SwitcherBuilder switcherBuilder = Switchers + .getSwitcher(Switchers.REMOTE_KEY) + .checkValue("value") + .checkNumeric("10"); + + assertEquals(2, switcherBuilder.getEntry().size()); + + //test + switcherBuilder + .flush() + .checkValue("anotherValue"); + + assertEquals(1, switcherBuilder.getEntry().size()); + } + @Test void shouldReturnCriteriaResponseWithMetadata() { //auth diff --git a/src/test/java/com/switcherapi/client/SwitcherThrottleTest.java b/src/test/java/com/switcherapi/client/SwitcherThrottleTest.java index c1ffc18..0001125 100644 --- a/src/test/java/com/switcherapi/client/SwitcherThrottleTest.java +++ b/src/test/java/com/switcherapi/client/SwitcherThrottleTest.java @@ -2,6 +2,7 @@ import com.switcherapi.Switchers; import com.switcherapi.client.model.Switcher; +import com.switcherapi.client.model.SwitcherBuilder; import com.switcherapi.fixture.CountDownHelper; import com.switcherapi.fixture.MockWebServerHelper; import mockwebserver3.QueueDispatcher; @@ -70,4 +71,28 @@ void shouldReturnTrue_withThrottle() { assertFalse(switcher.isItOn()); } + @Test + void shouldRetrieveNewResponse_whenStrategyInputChanged() { + Switchers.initializeClient(); + + // Initial remote call + givenResponse(generateMockAuth(10)); //auth + givenResponse(generateCriteriaResponse("true", false)); //criteria - sync (cached) + givenResponse(generateCriteriaResponse("false", false)); //criteria - async (cached) + + // Throttle period - should use cache + givenResponse(generateCriteriaResponse("false", false)); //criteria - async after 1 sec (background) + + //test + SwitcherBuilder switcher = Switchers + .getSwitcher(Switchers.REMOTE_KEY) + .throttle(1000); + + for (int i = 0; i < 100; i++) { + assertTrue(switcher.checkValue("value").isItOn()); + } + + assertFalse(switcher.checkValue("value_changed").isItOn()); + } + }