package org.togglz.appengine.repository; import static org.junit.Assert.assertEquals; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.togglz.core.Feature; import org.togglz.core.repository.FeatureState; import org.togglz.core.repository.StateRepository; import com.google.appengine.api.NamespaceManager; import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig; import com.google.appengine.tools.development.testing.LocalServiceTestHelper; @RunWith(MockitoJUnitRunner.class) public class FixedNamespaceStateRepositoryTest { private final LocalServiceTestHelper helper = new LocalServiceTestHelper( new LocalDatastoreServiceTestConfig()); private FixedNamespaceStateRepository repository; @Mock private StateRepository mockedStateRepository; private static final String ACME_NAMESPACE = "acme"; private static final String ORIGINAL_NAMESPACE = "foobar"; @Before public void setup() { helper.setUp(); } @After public void tearDown() { helper.tearDown(); } @Test public void shouldAcceptEmptyNamespace() { new FixedNamespaceStateRepository("", mockedStateRepository); } @Test(expected = NullPointerException.class) public void shouldNotAcceptNullNamespace() { new FixedNamespaceStateRepository(null, mockedStateRepository); } @Test(expected = NullPointerException.class) public void shouldNotAcceptNullDecorated() { new FixedNamespaceStateRepository("", null); } @Test public void getFeatureStateShouldRunWithinGivenNamespace() { repository = new FixedNamespaceStateRepository(ACME_NAMESPACE, new StateRepository() { @Override public void setFeatureState(FeatureState featureState) { } @Override public FeatureState getFeatureState(Feature feature) { assertEquals(ACME_NAMESPACE, NamespaceManager.get()); return null; } }); repository.getFeatureState(TestFeature.F1); } @Test public void getFeatureStateShouldRunWithinGivenNamespaceWhenCurrentNamespaceIsNotDefault() { NamespaceManager.set(ORIGINAL_NAMESPACE); repository = new FixedNamespaceStateRepository(ACME_NAMESPACE, new StateRepository() { @Override public void setFeatureState(FeatureState featureState) { } @Override public FeatureState getFeatureState(Feature feature) { assertEquals(ACME_NAMESPACE, NamespaceManager.get()); return null; } }); repository.getFeatureState(TestFeature.F1); } @Test public void setFeatureStateShouldRunWithinGivenNamespaceWhenCurrentNamespaceIsNotDefault() { NamespaceManager.set(ORIGINAL_NAMESPACE); repository = new FixedNamespaceStateRepository(ACME_NAMESPACE, new StateRepository() { @Override public void setFeatureState(FeatureState featureState) { assertEquals(ACME_NAMESPACE, NamespaceManager.get()); } @Override public FeatureState getFeatureState(Feature feature) { return null; } }); final FeatureState state = new FeatureState(TestFeature.F1) .disable() .setStrategyId("someId") .setParameter("param", "foo"); repository.setFeatureState(state); } @Test public void setFeatureStateShouldRunWithinGivenNamespace() { repository = new FixedNamespaceStateRepository(ACME_NAMESPACE, new StateRepository() { @Override public void setFeatureState(FeatureState featureState) { assertEquals(ACME_NAMESPACE, NamespaceManager.get()); } @Override public FeatureState getFeatureState(Feature feature) { return null; } }); final FeatureState state = new FeatureState(TestFeature.F1) .disable() .setStrategyId("someId") .setParameter("param", "foo"); repository.setFeatureState(state); } @Test public void shouldFallbackToOriginalNamespace() { NamespaceManager.set(ORIGINAL_NAMESPACE); repository = new FixedNamespaceStateRepository(ACME_NAMESPACE, new StateRepository() { @Override public void setFeatureState(FeatureState featureState) { } @Override public FeatureState getFeatureState(Feature feature) { return null; } }); final FeatureState state = new FeatureState(TestFeature.F1) .disable() .setStrategyId("someId") .setParameter("param", "foo"); repository.setFeatureState(state); assertEquals(ORIGINAL_NAMESPACE, NamespaceManager.get()); repository.getFeatureState(TestFeature.F1); assertEquals(ORIGINAL_NAMESPACE, NamespaceManager.get()); } private static enum TestFeature implements Feature { F1 } }