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 {
private final FeatureFlags featureFlagDatabase;
private final ScheduledExecutorService refreshExecutorService;
private ScheduledFuture<?> refreshFuture;
private final AtomicReference<Map<String, Boolean>> featureFlags = new AtomicReference<>(Collections.emptyMap());
private final FeatureFlags featureFlagDatabase;
private final ScheduledExecutorService refreshExecutorService;
private ScheduledFuture<?> refreshFuture;
private final AtomicReference<Map<String, Boolean>> featureFlags = new AtomicReference<>(Collections.emptyMap());
private static final String GAUGE_NAME = "status";
private static final String FLAG_TAG_NAME = "flag";
@ -70,6 +70,7 @@ public class FeatureFlagsManager implements Managed {
@VisibleForTesting
void refreshFeatureFlags() {
final Map<String, Boolean> refreshedFeatureFlags = featureFlagDatabase.getFeatureFlags();
featureFlags.set(refreshedFeatureFlags);
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);
}
{
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()
.target("/v1/featureflag/testFlag")

View File

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