/** * Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org> * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.seedstack.seed.core; import com.google.inject.Injector; import com.google.inject.Module; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.seedstack.coffig.Config; import org.seedstack.coffig.ConfigurationException; import org.seedstack.coffig.SingleValue; import org.seedstack.seed.Application; import org.seedstack.seed.ApplicationConfig; import org.seedstack.seed.ClassConfiguration; import org.seedstack.seed.Configuration; import org.seedstack.seed.core.fixtures.SomeEnum; import org.seedstack.seed.core.rules.SeedITRule; import javax.inject.Inject; import static org.assertj.core.api.Assertions.assertThat; public class ConfigurationIT { @Rule public SeedITRule rule = new SeedITRule(this); private Injector injector; @Inject private Application application; private static class Holder { @Inject Application application; @Configuration("secret1") String secret1; @Configuration(value = "dummy") String dummy = "defaultValue"; @Configuration("someEnum") SomeEnum someEnum; @Configuration("anInt") int anInt; @Configuration("someShorts") short[] someShorts; @Configuration ConfigObject configObject1; @Configuration(value = "missingProperty") ConfigObject configObject2 = new ConfigObject().setProperty2(5); @Configuration OtherConfigObject otherConfigObject1 = new OtherConfigObject().setProperty1("someValue"); @Configuration OtherConfigObject otherConfigObject2; @Configuration(injectDefault = false) OtherConfigObject otherConfigObject3; } @Before public void setUp() throws Exception { injector = rule.getKernel().objectGraph().as(Injector.class).createChildInjector((Module) binder -> binder.bind(Holder.class)); } @Config("someObject") public static class ConfigObject { String property1 = "defaultValue"; @SingleValue int[] property2; public ConfigObject setProperty2(int... property2) { this.property2 = property2; return this; } } @Config("nonExistingObject") private static class OtherConfigObject { String property1 = "defaultValue"; public OtherConfigObject setProperty1(String property1) { this.property1 = property1; return this; } } @Test public void configuration_injection_is_working_correctly() { Holder holder = injector.getInstance(Holder.class); assertThat(holder).isNotNull(); assertThat(holder.application).isNotNull(); assertThat(holder.secret1).isNotNull().isEqualTo("**I am Alice**"); assertThat(holder.dummy).isNotNull().isEqualTo("defaultValue"); assertThat(holder.anInt).isNotNull().isEqualTo(5); assertThat(holder.someShorts).isNotEmpty().isEqualTo(new short[]{2, 3, 4}); assertThat(holder.someEnum).isNotNull().isEqualTo(SomeEnum.FOO); } @Test public void configuration_can_be_retrieved() { Holder holder = injector.getInstance(Holder.class); assertThat(holder.application.getConfiguration().get(ApplicationConfig.class).getId()).isEqualTo("seed-it"); } @Test public void system_properties_are_accessible_in_configuration() { Holder holder = injector.getInstance(Holder.class); assertThat(holder.application.getConfiguration().get(String.class, "sys.java\\.vendor")).isEqualTo(System.getProperty("java.vendor")); } @Test public void scanned_configuration_is_accessible() { Holder holder = injector.getInstance(Holder.class); assertThat(holder.application.getConfiguration().getOptional(String.class, "propertyInOtherFile").get()).isEqualTo("value"); assertThat(holder.application.getConfiguration().getOptional(String.class, "propertyInOtherPropertiesFile").get()).isEqualTo("value"); assertThat(holder.application.getConfiguration().getOptional(String.class, "propertyInOtherFileWithSuffix")).isNotPresent(); } @Test public void environment_variables_are_accessible_in_configuration() { Holder holder = injector.getInstance(Holder.class); String java_home = System.getenv("JAVA_HOME"); if (java_home != null) { assertThat(holder.application.getConfiguration().get(String.class, "env.JAVA_HOME")).isEqualTo(java_home); } } @Test public void properties_files_are_accessible_in_configuration() { Holder holder = injector.getInstance(Holder.class); assertThat(holder.application.getConfiguration().get(String.class, "test.keyFromProperties")).isEqualTo("testValue"); } @Test public void empty_configuration_values_yield_empty_string() { Holder holder = injector.getInstance(Holder.class); assertThat(holder.application.getConfiguration().getMandatory(String.class, "empty")).isEqualTo(""); } @Test(expected = ConfigurationException.class) public void non_existent_configuration_values_throws_exception() { Holder holder = injector.getInstance(Holder.class); holder.application.getConfiguration().getMandatory(String.class, "nonExistent"); } @Test public void configuration_object_injection() { Holder holder = injector.getInstance(Holder.class); assertThat(holder.configObject1).isNotNull(); assertThat(holder.configObject1.property1).isEqualTo("value"); assertThat(holder.configObject1.property2).containsExactly(5, 6, 7); assertThat(holder.configObject2).isNotNull(); assertThat(holder.configObject2.property1).isEqualTo("defaultValue"); assertThat(holder.configObject2.property2).containsExactly(5); assertThat(holder.otherConfigObject1).isNotNull(); assertThat(holder.otherConfigObject1.property1).isEqualTo("someValue"); assertThat(holder.otherConfigObject2).isNotNull(); assertThat(holder.otherConfigObject2.property1).isEqualTo("defaultValue"); assertThat(holder.otherConfigObject3).isNull(); } @Test public void class_attributes_can_be_retrieved() { Application application = injector.getInstance(Application.class); ClassConfiguration<ConfigurationIT> configuration = application.getConfiguration(ConfigurationIT.class); assertThat(configuration.keySet()).containsExactly("key1", "key2", "key3"); assertThat(configuration.get("key1")).isEqualTo("value1"); assertThat(configuration.get("key2")).isEqualTo("value2bis"); assertThat(configuration.get("key3")).isEqualTo("value3"); } @Test public void configuration_substitution() { Application application = injector.getInstance(Application.class); assertThat(application.substituteWithConfiguration("Hello ${person1}!")).isEqualTo("Hello Alice!"); } @Test public void applicationInjection() { assertThat(application).isNotNull(); } @Test public void applicationInfo() { assertThat(application.getId()).isEqualTo("seed-it"); assertThat(application.getName()).isEqualTo("seed-it"); assertThat(application.getVersion()).isEqualTo("1.0.0"); } }