package org.togglz.core.manager; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.togglz.core.Feature; import org.togglz.core.activation.UsernameActivationStrategy; import org.togglz.core.metadata.FeatureMetaData; import org.togglz.core.repository.FeatureState; import org.togglz.core.repository.StateRepository; import org.togglz.core.repository.mem.InMemoryStateRepository; import org.togglz.core.spi.FeatureProvider; import org.togglz.core.user.FeatureUser; import org.togglz.core.user.SimpleFeatureUser; import org.togglz.core.user.UserProvider; public class DefaultFeatureManagerTest { private StateRepository repository; private FeatureManager manager; private TestFeatureUserProvider featureUserProvider; @Before public void before() { repository = new InMemoryStateRepository(); repository.setFeatureState(new FeatureState(MyFeatures.DELETE_USERS, true) .setStrategyId(UsernameActivationStrategy.ID) .setParameter(UsernameActivationStrategy.PARAM_USERS, "admin")); repository.setFeatureState(new FeatureState(MyFeatures.MISSING_STRATEGY, true) .setStrategyId("NoSuchActivationStrategy")); repository.setFeatureState(new FeatureState(MyFeatures.EXPERIMENTAL, false)); repository.setFeatureState(new FeatureState(MyFeatures.EMPTY_STRATEGY, true) .setStrategyId("")); featureUserProvider = new TestFeatureUserProvider(); manager = new FeatureManagerBuilder() .featureEnum(MyFeatures.class) .stateRepository(repository) .userProvider(featureUserProvider) .build(); } @After public void after() { repository = null; manager = null; featureUserProvider = null; } @Test public void testGetFeatures() { assertThat(manager.getFeatures()) .contains(MyFeatures.DELETE_USERS, MyFeatures.EXPERIMENTAL, MyFeatures.MISSING_STRATEGY); } @Test public void testIsActive() { // DELETE_USERS disabled for unknown user featureUserProvider.setFeatureUser(null); assertEquals(false, manager.isActive(MyFeatures.DELETE_USERS)); // DELETE_USERS enabled for admin user featureUserProvider.setFeatureUser(new SimpleFeatureUser("admin", false)); assertEquals(true, manager.isActive(MyFeatures.DELETE_USERS)); // DELETE_USERS enabled for other user featureUserProvider.setFeatureUser(new SimpleFeatureUser("somebody", false)); assertEquals(false, manager.isActive(MyFeatures.DELETE_USERS)); // EXPERIMENTAL disabled for all featureUserProvider.setFeatureUser(null); assertEquals(false, manager.isActive(MyFeatures.EXPERIMENTAL)); // MISSING_STRATEGY disabled for all assertEquals(false, manager.isActive(MyFeatures.MISSING_STRATEGY)); // EMPTY_STRATEGY enabled for all assertEquals(true, manager.isActive(MyFeatures.EMPTY_STRATEGY)); } @Test public void testIsActiveUsingDefaultFeatureState() { FeatureProvider featureProvider = mock(FeatureProvider.class); FeatureMetaData featureMetaData = mock(FeatureMetaData.class); when(featureMetaData.getDefaultFeatureState()).thenReturn(new FeatureState(MyFeatures.NOT_STORED_FEATURE, true)); when(featureProvider.getMetaData(MyFeatures.NOT_STORED_FEATURE)).thenReturn(featureMetaData); FeatureManager manager = new FeatureManagerBuilder() .featureEnum(MyFeatures.class) .stateRepository(repository) .featureProvider(featureProvider) .userProvider(featureUserProvider) .build(); assertEquals(true, manager.isActive(MyFeatures.NOT_STORED_FEATURE)); } @Test public void testShouldHandleEnabledFlagCorrectlyWithCustomStrategy() { // enabled for admin featureUserProvider.setFeatureUser(new SimpleFeatureUser("admin", false)); assertEquals(true, manager.isActive(MyFeatures.DELETE_USERS)); // disable feature, but keep configuration FeatureState state = repository.getFeatureState(MyFeatures.DELETE_USERS); state.setEnabled(false); repository.setFeatureState(state); // enabled for admin assertEquals(false, manager.isActive(MyFeatures.DELETE_USERS)); } @Test public void testGetFeatureState() { FeatureState state = manager.getFeatureState(MyFeatures.DELETE_USERS); assertEquals(MyFeatures.DELETE_USERS, state.getFeature()); assertEquals(true, state.isEnabled()); assertEquals("admin", state.getParameter(UsernameActivationStrategy.PARAM_USERS)); } @Test public void testGetFeatureStateUsingDefaultFeatureState() { FeatureProvider featureProvider = mock(FeatureProvider.class); FeatureMetaData featureMetaData = mock(FeatureMetaData.class); when(featureMetaData.getDefaultFeatureState()).thenReturn(new FeatureState(MyFeatures.NOT_STORED_FEATURE, true)); when(featureProvider.getMetaData(MyFeatures.NOT_STORED_FEATURE)).thenReturn(featureMetaData); FeatureManager manager = new FeatureManagerBuilder() .featureEnum(MyFeatures.class) .stateRepository(repository) .featureProvider(featureProvider) .userProvider(featureUserProvider) .build(); FeatureState state = manager.getFeatureState(MyFeatures.NOT_STORED_FEATURE); assertEquals(MyFeatures.NOT_STORED_FEATURE, state.getFeature()); assertEquals(true, state.isEnabled()); } /** * {@link UserProvider} that allows to set the user directly */ private final class TestFeatureUserProvider implements UserProvider { private FeatureUser featureUser; public void setFeatureUser(FeatureUser featureUser) { this.featureUser = featureUser; } @Override public FeatureUser getCurrentUser() { return featureUser; } } /** * Feature under test */ private static enum MyFeatures implements Feature { DELETE_USERS, EXPERIMENTAL, MISSING_STRATEGY, EMPTY_STRATEGY, NOT_STORED_FEATURE; } }