package org.stagemonitor.configuration; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import org.stagemonitor.configuration.source.SimpleSource; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class ConfigurationRegistryTest { @Test public void testAddConfigurationSource() { ConfigurationRegistry configuration = new ConfigurationRegistry(""); configuration.addConfigurationSource(new SimpleSource()); assertEquals(Collections.singletonMap("Transient Configuration Source", true), configuration.getNamesOfConfigurationSources()); } @Test public void testIsPasswordSetTrue() throws Exception { ConfigurationRegistry configuration = new ConfigurationRegistry("pwd"); configuration.addConfigurationSource(SimpleSource.forTest("pwd", "")); assertTrue(configuration.isPasswordSet()); } @Test public void testIsPasswordSetFalse() throws Exception { ConfigurationRegistry configuration = new ConfigurationRegistry("pwd"); assertFalse(configuration.isPasswordSet()); } @Test(expected = IllegalArgumentException.class) public void testDuplicateLabel() throws Exception { final ConfigurationOptionProvider optionProvider = TestConfigurationOptionProvider.of( ConfigurationOption.stringOption().key("foo").description("Foo").build(), ConfigurationOption.stringOption().key("foo").label("Bar").build()); new ConfigurationRegistry(Collections.singletonList(optionProvider), Collections.emptyList(), ""); } @Test public void testOnConfigurationChanged() throws Exception { AtomicBoolean changeListenerFired = new AtomicBoolean(false); final ConfigurationOption<String> configurationOption = ConfigurationOption.stringOption() .key("foo") .dynamic(true) .addChangeListener(new ConfigurationOption.ChangeListener<String>() { @Override public void onChange(ConfigurationOption<?> configurationOption, String oldValue, String newValue) { assertEquals("foo", configurationOption.getKey()); assertEquals("old", oldValue); assertEquals("new", newValue); changeListenerFired.set(true); throw new RuntimeException("This is an expected test exception. " + "It is thrown to test whether Configuration can cope with change listeners that throw an exception."); } }).buildWithDefault("old"); final ConfigurationOptionProvider optionProvider = TestConfigurationOptionProvider.of(configurationOption); final SimpleSource configurationSource = new SimpleSource("test"); final ConfigurationRegistry config = new ConfigurationRegistry(Collections.singletonList(optionProvider), Collections.singletonList(configurationSource), ""); config.save("foo", "new", "test"); assertTrue(changeListenerFired.get()); } @Test(expected = IllegalStateException.class) public void testFailOnRequiredValueMissing() throws Exception { final ConfigurationOption<String> configurationOption = ConfigurationOption.stringOption().key("foo").required().build(); final ConfigurationOptionProvider optionProvider = TestConfigurationOptionProvider.of(configurationOption); new ConfigurationRegistry(Collections.singletonList(optionProvider), Collections.emptyList(), "", true); } @Test public void testValidateConfigurationOption() throws Exception { final ConfigurationOption<Boolean> configurationOption = ConfigurationOption.booleanOption() .key("foo") .addValidator(value -> { if (!value) { throw new IllegalArgumentException("Validation failed"); } }) .buildWithDefault(true); final ConfigurationOptionProvider optionProvider = TestConfigurationOptionProvider.of(configurationOption); final SimpleSource configurationSource = new SimpleSource("test"); final ConfigurationRegistry config = new ConfigurationRegistry(Collections.singletonList(optionProvider), Collections.singletonList(configurationSource), ""); try { config.save("foo", "false", "test"); fail(); } catch (IllegalArgumentException e) { assertEquals("Validation failed", e.getMessage()); } } @Test public void testValidateDefaultConfigurationOption() throws Exception { try { ConfigurationOption.booleanOption() .key("foo") .addValidator(new ConfigurationOption.Validator<Boolean>() { @Override public void assertValid(Boolean value) { if (!value) { throw new IllegalArgumentException("Validation failed"); } } }) .buildWithDefault(false); fail(); } catch (IllegalArgumentException e) { assertEquals("Validation failed", e.getMessage()); } } @Test public void testToJsonDoesNotThrowException() throws Exception { final ConfigurationOptionProvider optionProvider = TestConfigurationOptionProvider.of( ConfigurationOption.stringOption().key("foo").description("Foo").configurationCategory("Foos").build()); final ConfigurationRegistry configuration = new ConfigurationRegistry(Collections.singletonList(optionProvider), Collections.emptyList(), ""); new ObjectMapper().writeValueAsString(configuration.getConfigurationOptionsByCategory()); } private static class TestConfigurationOptionProvider extends ConfigurationOptionProvider { private final List<ConfigurationOption<?>> configurationOptions; public static ConfigurationOptionProvider of(ConfigurationOption<?>... configurationOptions) { return new TestConfigurationOptionProvider(configurationOptions); } private TestConfigurationOptionProvider(ConfigurationOption<?>... configurationOptions) { this.configurationOptions = Arrays.asList(configurationOptions); } @Override public List<ConfigurationOption<?>> getConfigurationOptions() { return configurationOptions; } } }