package restx.factory.conditional; import static org.assertj.core.api.Assertions.assertThat; import static restx.factory.Factory.LocalMachines.overrideComponents; import static restx.factory.Factory.LocalMachines.threadLocal; import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.collect.Iterables; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import java.util.Comparator; import java.util.Set; import restx.factory.Factory; import restx.factory.Name; import restx.factory.NamedComponent; import restx.factory.TestGreeting; import restx.factory.conditional.components.TestConditionalComponent; import restx.factory.conditional.components.TestInterfaces; import restx.factory.conditional.components.TestModuleWithConditional; /** * Test cases for conditionals. * * @author apeyrard */ public class ConditionalTest { /** * ElementsFromConfig component can not be build, because of module TestMandatoryDependency * which use a missing dependency. */ @BeforeClass public static void deactivateElementsFromConfig() { System.setProperty("restx.activation::restx.factory.FactoryMachine::ElementsFromConfig", "false"); } /** * cleanup state before each test method */ @Before public void cleanupBefore() { threadLocal().clear(); } /** * cleanup state after this test class execution */ @AfterClass public static void cleanupAfterClass() { threadLocal().clear(); } @Test public void should_provide_component_if_condition_is_verified() { Factory factory = Factory.newInstance(); Set<TestModuleWithConditional.Pioneer> pioneers = factory.getComponents(TestModuleWithConditional.Pioneer.class); Iterable<String> names = Iterables.transform(pioneers, new Function<TestModuleWithConditional.Pioneer, String>() { @Override public String apply(TestModuleWithConditional.Pioneer pioneer) { return pioneer.name(); } }); assertThat(names).containsOnly("Marie Currie", "Charles Babbage"); overrideComponents().set("period", "all"); factory = Factory.newInstance(); pioneers = factory.getComponents(TestModuleWithConditional.Pioneer.class); names = Iterables.transform(pioneers, new Function<TestModuleWithConditional.Pioneer, String>() { @Override public String apply(TestModuleWithConditional.Pioneer pioneer) { return pioneer.name(); } }); assertThat(names).containsOnly("Marie Currie", "Charles Babbage", "Alan Turing"); } @Test public void should_provide_component_if_condition_is_verified_and_use_name_and_priorities() { Factory factory = Factory.newInstance(); TestModuleWithConditional.Pioneer pioneer = factory.getComponent(Name.of(TestModuleWithConditional.Pioneer.class, "physics")); assertThat(pioneer.name()).isEqualTo("Marie Currie"); overrideComponents().set("chauvinist", "true"); factory = Factory.newInstance(); pioneer = factory.getComponent(Name.of(TestModuleWithConditional.Pioneer.class, "physics")); assertThat(pioneer.name()).isEqualTo("Pierre Currie"); } @Test public void should_use_modules_condition_on_all_its_components() { Factory factory = Factory.newInstance(); TestInterfaces.Resolver resolver = factory.getComponent(TestInterfaces.Resolver.class); assertThat(resolver.resolve("foo")).isEqualTo("prod:foo"); Optional<TestInterfaces.Workspace> workspace = factory.queryByClass(TestInterfaces.Workspace.class).findOneAsComponent(); assertThat(workspace.isPresent()).isFalse(); String dbType = factory.getComponent(Name.of(String.class, "db.type")); assertThat(dbType).isEqualTo("postgres"); overrideComponents().set("my-mode", "dev"); factory = Factory.newInstance(); resolver = factory.getComponent(TestInterfaces.Resolver.class); assertThat(resolver.resolve("foo")).isEqualTo("dev:foo"); workspace = factory.queryByClass(TestInterfaces.Workspace.class).findOneAsComponent(); assertThat(workspace.isPresent()).isTrue(); dbType = factory.getComponent(Name.of(String.class, "db.type")); assertThat(dbType).isEqualTo("derby"); } @Test public void should_find_conditional_component_when_condition_is_satisfied() { Factory factory = Factory.newInstance(); Optional<TestConditionalComponent> conditional = factory.queryByName(Name.of(TestConditionalComponent.class, "conditional")) .findOneAsComponent(); assertThat(conditional.isPresent()).isFalse(); overrideComponents().set("conditional.component", "allowed"); factory = Factory.newInstance(); conditional = factory.queryByName(Name.of(TestConditionalComponent.class, "conditional")).findOneAsComponent(); assertThat(conditional.isPresent()).isTrue(); } @Test public void should_use_asClass_parameter_for_conditional_components() { overrideComponents().set("allow.comparator", "true"); Factory factory = Factory.newInstance(); Optional<NamedComponent<Comparator>> one = factory.queryByClass(Comparator.class).findOne(); assertThat(one.isPresent()); assertThat(one.get().getName().getClazz()).isEqualTo(Comparator.class); } }