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());
+ }
+
}