Make feature flag manager tests use a real database to avoid over-mocking.

This commit is contained in:
Jon Chambers 2020-08-27 12:05:13 -04:00 committed by Jon Chambers
parent 08dd493f98
commit acf52ad8a3
3 changed files with 36 additions and 22 deletions

View File

@ -26,10 +26,10 @@ import static com.codahale.metrics.MetricRegistry.name;
*/ */
public class FeatureFlagsManager implements Managed { public class FeatureFlagsManager implements Managed {
private final FeatureFlags featureFlagDatabase; private final FeatureFlags featureFlagDatabase;
private final ScheduledExecutorService refreshExecutorService; private final ScheduledExecutorService refreshExecutorService;
private ScheduledFuture<?> refreshFuture; private ScheduledFuture<?> refreshFuture;
private final AtomicReference<Map<String, Boolean>> featureFlags = new AtomicReference<>(Collections.emptyMap()); private final AtomicReference<Map<String, Boolean>> featureFlags = new AtomicReference<>(Collections.emptyMap());
private static final String GAUGE_NAME = "status"; private static final String GAUGE_NAME = "status";
private static final String FLAG_TAG_NAME = "flag"; private static final String FLAG_TAG_NAME = "flag";
@ -70,6 +70,7 @@ public class FeatureFlagsManager implements Managed {
@VisibleForTesting @VisibleForTesting
void refreshFeatureFlags() { void refreshFeatureFlags() {
final Map<String, Boolean> refreshedFeatureFlags = featureFlagDatabase.getFeatureFlags(); final Map<String, Boolean> refreshedFeatureFlags = featureFlagDatabase.getFeatureFlags();
featureFlags.set(refreshedFeatureFlags); featureFlags.set(refreshedFeatureFlags);
for (final Map.Entry<String, Boolean> entry : refreshedFeatureFlags.entrySet()) { for (final Map.Entry<String, Boolean> entry : refreshedFeatureFlags.entrySet()) {

View File

@ -60,6 +60,17 @@ public class FeatureFlagsControllerTest {
verify(FEATURE_FLAG_MANAGER).setFeatureFlag("testFlag", true); verify(FEATURE_FLAG_MANAGER).setFeatureFlag("testFlag", true);
} }
{
final Response response = resources.getJerseyTest()
.target("/v1/featureflag/secondFlag")
.request()
.header("Token", "first")
.put(Entity.form(new Form().param("active", "false")));
assertEquals(204, response.getStatus());
verify(FEATURE_FLAG_MANAGER).setFeatureFlag("secondFlag", false);
}
{ {
final Response response = resources.getJerseyTest() final Response response = resources.getJerseyTest()
.target("/v1/featureflag/testFlag") .target("/v1/featureflag/testFlag")

View File

@ -1,44 +1,46 @@
package org.whispersystems.textsecuregcm.storage; package org.whispersystems.textsecuregcm.storage;
import com.opentable.db.postgres.embedded.LiquibasePreparer;
import com.opentable.db.postgres.junit.EmbeddedPostgresRules;
import com.opentable.db.postgres.junit.PreparedDbRule;
import org.jdbi.v3.core.Jdbi;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.whispersystems.textsecuregcm.configuration.CircuitBreakerConfiguration;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class FeatureFlagsManagerTest { public class FeatureFlagsManagerTest {
private FeatureFlags featureFlagDatabase;
private FeatureFlagsManager featureFlagsManager; private FeatureFlagsManager featureFlagsManager;
@Rule
public PreparedDbRule db = EmbeddedPostgresRules.preparedDatabase(LiquibasePreparer.forClasspathLocation("accountsdb.xml"));
@Before @Before
public void setUp() { public void setUp() {
featureFlagDatabase = mock(FeatureFlags.class); final FaultTolerantDatabase database = new FaultTolerantDatabase("featureFlagsTest",
featureFlagsManager = new FeatureFlagsManager(featureFlagDatabase, mock(ScheduledExecutorService.class)); Jdbi.create(db.getTestDatabase()),
new CircuitBreakerConfiguration());
featureFlagsManager = new FeatureFlagsManager(new FeatureFlags(database), mock(ScheduledExecutorService.class));
} }
@Test @Test
public void testIsFeatureFlagActive() { public void testIsFeatureFlagActive() {
final Map<String, Boolean> featureFlags = new HashMap<>(); final String flagName = "testFlag";
featureFlags.put("testFlag", true);
when(featureFlagDatabase.getFeatureFlags()).thenReturn(featureFlags); assertFalse(featureFlagsManager.isFeatureFlagActive(flagName));
assertFalse(featureFlagsManager.isFeatureFlagActive("testFlag")); featureFlagsManager.setFeatureFlag(flagName, true);
assertTrue(featureFlagsManager.isFeatureFlagActive(flagName));
featureFlagsManager.refreshFeatureFlags(); featureFlagsManager.setFeatureFlag(flagName, false);
assertFalse(featureFlagsManager.isFeatureFlagActive(flagName));
assertTrue(featureFlagsManager.isFeatureFlagActive("testFlag"));
featureFlags.put("testFlag", false);
featureFlagsManager.refreshFeatureFlags();
assertFalse(featureFlagsManager.isFeatureFlagActive("testFlag"));
} }
} }