package org.constretto.internal.provider; import org.constretto.ConstrettoBuilder; import org.constretto.ConstrettoConfiguration; import org.constretto.annotation.Configuration; import org.constretto.annotation.Configure; import org.constretto.model.ClassPathResource; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; /** * @author <a href="mailto:kaare.nilsen@arktekk.no">Kaare Nilsen</a> */ public class DynamicReconfiguringTagsTest { private ConstrettoConfiguration config; @Before public void createConfiguration() { config = new ConstrettoBuilder() .createPropertiesStore() .addResource(new ClassPathResource("dynamic.properties")) .done().getConfiguration(); } @Test public void whenAppendingTagsRuntimeVariablesShouldBeResolvedCorrectlyWhenUsingJavaApi() { assertEquals("default value", config.evaluateToString("stagedKey")); config.appendTag("test"); assertEquals("test value", config.evaluateToString("stagedKey")); config.appendTag("prod"); assertEquals("test value", config.evaluateToString("stagedKey")); } @Test public void whenPrependingTagsRuntimeVariablesShouldBeResolvedCorrectlyWhenUsingJavaApi() { assertEquals("default value", config.evaluateToString("stagedKey")); config.prependTag("test"); assertEquals("test value", config.evaluateToString("stagedKey")); config.prependTag("prod"); assertEquals("prod value", config.evaluateToString("stagedKey")); } @Test public void whenResetingTagsItResolvesBackToOriginalTags() { ConstrettoConfiguration configuration = new ConstrettoBuilder() .createPropertiesStore().addResource(new ClassPathResource("dynamic.properties")).done() .addCurrentTag("test") .getConfiguration(); assertEquals("test value", configuration.evaluateToString("stagedKey")); configuration.prependTag("prod"); assertEquals("prod value", configuration.evaluateToString("stagedKey")); configuration.resetTags(true); assertEquals("test value", configuration.evaluateToString("stagedKey")); } @Test public void whenClearingTagsItResolvesBackToDefaultValues() { ConstrettoConfiguration configuration = new ConstrettoBuilder() .createPropertiesStore().addResource(new ClassPathResource("dynamic.properties")).done() .addCurrentTag("test") .getConfiguration(); assertEquals("test value", configuration.evaluateToString("stagedKey")); configuration.prependTag("prod"); assertEquals("prod value", configuration.evaluateToString("stagedKey")); configuration.clearTags(true); assertEquals("default value", configuration.evaluateToString("stagedKey")); } @Test public void whenAppendingTagsRuntimeObjectsInjectedWithConfigurationShouldBeResolvedCorrectly() throws InterruptedException { ConfiguredClass configuredClass = new ConfiguredClass(); config.on(configuredClass); assertEquals("default value", configuredClass.stagedKey); assertEquals("default", configuredClass.stagedVariable); config.appendTag("test"); assertEquals("test value", configuredClass.stagedKey); assertEquals("test", configuredClass.stagedVariable); config.appendTag("prod"); assertEquals("test value", configuredClass.stagedKey); assertEquals("test", configuredClass.stagedVariable); config.removeTag("test"); assertEquals("prod value", configuredClass.stagedKey); assertEquals("prod", configuredClass.stagedVariable); config.removeTag("prod"); assertEquals("default value", configuredClass.stagedKey); assertEquals("default", configuredClass.stagedVariable); configuredClass = null; config.appendTag("linux"); Assert.assertNull(configuredClass); } private class ConfiguredClass { @Configuration private String stagedVariable; private String stagedKey; @Configure public void configure(String stagedKey) { this.stagedKey = stagedKey; } } }