@Test public void testValidOptions_list() throws Exception { assertThatThrownBy(() -> ConfigurationOption.integersOption() .key("test.list") .dynamic(true) .addValidOption(Arrays.asList(1, 2)) .buildWithDefault(Collections.singleton(1))) .isInstanceOf(UnsupportedOperationException.class); }
@Test public void testServiceLoaderStrategyOption() throws Exception { final ConfigurationOption<Strategy> option = ConfigurationOption.serviceLoaderStrategyOption(Strategy.class) .key("test.strategy") .dynamic(true) .buildWithDefault(new DefaultStrategyImpl()); final ConfigurationRegistry configuration = createConfiguration(Collections.singletonList(option), new SimpleSource()); assertThat(option.getValidOptions()).containsExactlyInAnyOrder(DefaultStrategyImpl.class.getName(), SpecialStrategyImpl.class.getName()); assertThat(option.getValue()).isInstanceOf(DefaultStrategyImpl.class); configuration.save("test.strategy", SpecialStrategyImpl.class.getName(), SimpleSource.NAME); assertThat(option.getValue()).isInstanceOf(SpecialStrategyImpl.class); assertThatThrownBy(() -> configuration.save("test.strategy", NoMetaInfServicesStrategyImpl.class.getName(), SimpleSource.NAME)) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("Invalid option"); }
@Test public void testWithOptions_valid() { final ConfigurationOption<String> option = ConfigurationOption.stringOption() .key("test.options") .addValidOptions("foo", "bar") .buildWithDefault("foo"); final ConfigurationRegistry configuration = createConfiguration(Collections.singletonList(option), SimpleSource.forTest("test.options", "bar")); assertThat(configuration.getConfigurationOptionByKey("test.options").getValueAsString()).isEqualTo("bar"); assertThatThrownBy(() -> configuration.save("test.options", "baz", "Test Configuration Source")) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("Invalid option"); }
@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 = ConfigurationRegistry.builder() .addOptionProvider(optionProvider) .addConfigSource(configurationSource) .build(); try { config.save("foo", "false", "test"); fail(); } catch (IllegalArgumentException e) { assertEquals("Validation failed", e.getMessage()); } }
@Test public void testOnConfigurationChanged() throws Exception { AtomicBoolean changeListenerFired = new AtomicBoolean(false); final ConfigurationOption<String> configurationOption = ConfigurationOption.stringOption() .key("foo") .dynamic(true) .addChangeListener((opt, oldValue, newValue) -> { assertEquals("foo", opt.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 = ConfigurationRegistry.builder() .addOptionProvider(optionProvider) .addConfigSource(configurationSource) .build(); config.save("foo", "new", "test"); assertTrue(changeListenerFired.get()); }
@Test public void testValidateDefaultConfigurationOption() throws Exception { try { ConfigurationOption.booleanOption() .key("foo") .addValidator((value) -> { if (!value) { throw new IllegalArgumentException("Validation failed"); } }) .buildWithDefault(false); fail(); } catch (IllegalArgumentException e) { assertEquals("Validation failed", e.getMessage()); } }
@Test public void testEnum() throws Exception { final ConfigurationOption<TestEnum> option = ConfigurationOption.enumOption(TestEnum.class) .key("test.enum") .dynamic(true) .buildWithDefault(TestEnum.FOO); final ConfigurationRegistry configuration = createConfiguration(Collections.singletonList(option), new SimpleSource()); assertThat(option.getValidOptions()).containsExactlyInAnyOrder("FOO", "BAR"); assertThat(option.getValidOptionsLabelMap()).containsEntry("FOO", "foo").containsEntry("BAR", "bar"); assertThat(option.getValue()).isEqualTo(TestEnum.FOO); configuration.save("test.enum", "BAR", SimpleSource.NAME); assertThat(option.getValue()).isEqualTo(TestEnum.BAR); assertThatThrownBy(() -> configuration.save("test.enum", "BAZ", SimpleSource.NAME)) .isInstanceOf(IllegalArgumentException.class); }
@Test(expected = IllegalArgumentException.class) public void testDefaultValueNull() { ConfigurationOption.stringOption().key("foo").buildWithDefault(null); }
@Test public void testWithOptions_invalidDefault() { assertThatThrownBy(() -> ConfigurationOption.stringOption() .key("test.options") .addValidOptions("foo", "bar") .buildWithDefault("baz")) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("Invalid option"); }
@Test(expected = IllegalStateException.class) public void testFailOnRequiredValueMissing() throws Exception { final ConfigurationOption<String> configurationOption = ConfigurationOption.stringOption().key("foo").buildRequired(); final ConfigurationOptionProvider optionProvider = TestConfigurationOptionProvider.of(configurationOption); ConfigurationRegistry.builder().addOptionProvider(optionProvider).failOnMissingRequiredValues(true).build(); }
@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()); ConfigurationRegistry.builder().addOptionProvider(optionProvider).build(); }
@Test(expected = IllegalArgumentException.class) public void testDuplicateAlternateKeys() { createConfiguration(Arrays.asList( ConfigurationOption.stringOption().key("primaryKey1").aliasKeys("alternateKey1").build(), ConfigurationOption.stringOption().key("primaryKey2").aliasKeys("alternateKey1").build() ), new SimpleSource()); }
@Test public void testToJsonDoesNotThrowException() throws Exception { final ConfigurationOptionProvider optionProvider = TestConfigurationOptionProvider.of( ConfigurationOption.stringOption().key("foo").description("Foo").configurationCategory("Foos").build()); final ConfigurationRegistry configuration = ConfigurationRegistry.builder().addOptionProvider(optionProvider).build(); new ObjectMapper().writeValueAsString(configuration.getConfigurationOptionsByCategory()); }
@Test public void testWithOptions_sealedOptions() { assertThatThrownBy(() -> ConfigurationOption.stringOption() .key("test.options") .addValidOptions("foo", "bar") .sealValidOptions() .addValidOption("baz") .buildWithDefault("baz")) .isInstanceOf(IllegalStateException.class) .hasMessage("Options are sealed, you can't add any new ones"); }