Skip to content

Commit dc63ab2

Browse files
Add API to show all flag keys (#121)
* Add API to show all flag keys * Responded to API name change request * ternary --------- Co-authored-by: Tyler Potter <[email protected]>
1 parent 8de6441 commit dc63ab2

File tree

3 files changed

+15
-0
lines changed

3 files changed

+15
-0
lines changed

src/main/java/cloud/eppo/api/Configuration.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,10 @@ public boolean isEmpty() {
170170
return flags == null || flags.isEmpty();
171171
}
172172

173+
public Set<String> getFlagKeys() {
174+
return flags == null ? Collections.emptySet() : flags.keySet();
175+
}
176+
173177
public static Builder builder(byte[] flagJson) {
174178
return new Builder(flagJson);
175179
}

src/test/java/cloud/eppo/BaseEppoClientTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,7 @@ public void testGetConfigurationBeforeInitialization() {
742742
// Verify we get an empty configuration
743743
assertNotNull(config);
744744
assertTrue(config.isEmpty());
745+
assertEquals(Collections.emptySet(), config.getFlagKeys());
745746

746747
eppoClient.loadConfiguration();
747748

@@ -751,6 +752,7 @@ public void testGetConfigurationBeforeInitialization() {
751752
// Verify we get an empty configuration
752753
assertNotNull(nextConfig);
753754
assertFalse(nextConfig.isEmpty());
755+
assertFalse(nextConfig.getFlagKeys().isEmpty());
754756
}
755757

756758
@SuppressWarnings("SameParameterValue")

src/test/java/cloud/eppo/ConfigurationRequestorTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.io.IOException;
1212
import java.nio.charset.StandardCharsets;
1313
import java.util.ArrayList;
14+
import java.util.Collections;
1415
import java.util.List;
1516
import java.util.concurrent.CompletableFuture;
1617
import java.util.concurrent.atomic.AtomicInteger;
@@ -40,11 +41,13 @@ public void testInitialConfigurationFuture() throws IOException {
4041

4142
// verify config is empty to start
4243
assertTrue(configStore.getConfiguration().isEmpty());
44+
assertEquals(Collections.emptySet(), configStore.getConfiguration().getFlagKeys());
4345
Mockito.verify(configStore, Mockito.times(0)).saveConfiguration(any());
4446

4547
futureConfig.complete(Configuration.builder(flagConfig, false).build());
4648

4749
assertFalse(configStore.getConfiguration().isEmpty());
50+
assertFalse(configStore.getConfiguration().getFlagKeys().isEmpty());
4851
Mockito.verify(configStore, Mockito.times(1)).saveConfiguration(any());
4952
assertNotNull(configStore.getConfiguration().getFlag("numeric_flag"));
5053
}
@@ -69,6 +72,7 @@ public void testInitialConfigurationDoesntClobberFetch() throws IOException {
6972
requestor.setInitialConfiguration(initialConfigFuture);
7073

7174
assertTrue(configStore.getConfiguration().isEmpty());
75+
assertEquals(Collections.emptySet(), configStore.getConfiguration().getFlagKeys());
7276
Mockito.verify(configStore, Mockito.times(0)).saveConfiguration(any());
7377

7478
// The initial config contains only one flag keyed `numeric_flag`. The fetch response has only
@@ -82,6 +86,7 @@ public void testInitialConfigurationDoesntClobberFetch() throws IOException {
8286
initialConfigFuture.complete(new Configuration.Builder(flagConfig, false).build());
8387

8488
assertFalse(configStore.getConfiguration().isEmpty());
89+
assertFalse(configStore.getConfiguration().getFlagKeys().isEmpty());
8590
Mockito.verify(configStore, Mockito.times(1)).saveConfiguration(any());
8691

8792
// `numeric_flag` is only in the cache which should have been ignored.
@@ -109,6 +114,7 @@ public void testBrokenFetchDoesntClobberCache() throws IOException {
109114
requestor.setInitialConfiguration(initialConfigFuture);
110115

111116
assertTrue(configStore.getConfiguration().isEmpty());
117+
assertEquals(Collections.emptySet(), configStore.getConfiguration().getFlagKeys());
112118
Mockito.verify(configStore, Mockito.times(0)).saveConfiguration(any());
113119

114120
requestor.fetchAndSaveFromRemoteAsync();
@@ -120,6 +126,7 @@ public void testBrokenFetchDoesntClobberCache() throws IOException {
120126
configFetchFuture.completeExceptionally(new Exception("Intentional exception"));
121127

122128
assertFalse(configStore.getConfiguration().isEmpty());
129+
assertFalse(configStore.getConfiguration().getFlagKeys().isEmpty());
123130
Mockito.verify(configStore, Mockito.times(1)).saveConfiguration(any());
124131

125132
// `numeric_flag` is only in the cache which should be available
@@ -148,6 +155,7 @@ public void testCacheWritesAfterBrokenFetch() throws IOException {
148155

149156
// default configuration is empty config.
150157
assertTrue(configStore.getConfiguration().isEmpty());
158+
assertEquals(Collections.emptySet(), configStore.getConfiguration().getFlagKeys());
151159

152160
// Fetch from remote with an error
153161
requestor.fetchAndSaveFromRemoteAsync();
@@ -159,6 +167,7 @@ public void testCacheWritesAfterBrokenFetch() throws IOException {
159167
// Verify that a configuration was saved by the requestor
160168
Mockito.verify(configStore, Mockito.times(1)).saveConfiguration(any());
161169
assertFalse(configStore.getConfiguration().isEmpty());
170+
assertFalse(configStore.getConfiguration().getFlagKeys().isEmpty());
162171

163172
// `numeric_flag` is only in the cache which should be available
164173
assertNotNull(configStore.getConfiguration().getFlag("numeric_flag"));

0 commit comments

Comments
 (0)