package restx.factory; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; import com.google.common.base.Optional; import org.junit.BeforeClass; import org.junit.Test; import restx.factory.TestComponentPriorities.V; import restx.factory.TestInnerComponent.A; /** * @author fcamblor */ public class FactoryTest { /** * 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"); } @Test public void should_optional_dependency_works_and_not_be_injected_when_absent(){ // check that we don't get a stack overflow error due to box closing the factory Factory factory = Factory.builder() .addMachine(new TestOptionalDependencyFactoryMachine()) .build(); Optional<NamedComponent<String>> result1NamedComp = factory.queryByName(Name.of(String.class, "optional.dep.result1")).findOne(); assertThat(result1NamedComp.isPresent()).isEqualTo(true); assertThat(result1NamedComp.get().getComponent()).isEqualTo("absent"); Optional<NamedComponent<String>> result2NamedComp = factory.queryByName(Name.of(String.class, "optional.dep.result2")).findOne(); assertThat(result2NamedComp.isPresent()).isEqualTo(true); assertThat(result2NamedComp.get().getComponent()).isEqualTo("absent"); factory.close(); } @Test public void should_respect_provided_priorities_order() { Factory factory = Factory.builder().addFromServiceLoader().build(); assertThat(factory.queryByClass(V.class).find()) .extracting("priority", "component.val") .containsExactly(tuple(0, "B"), tuple(0, "C"), tuple(1, "A")); } @Test public void should_inject_named_component() { Factory factory = Factory.builder().addFromServiceLoader().build(); assertThat(factory.queryByName(Name.of(String.class, "NCB")).findOneAsComponent()) .isEqualTo(Optional.of("NCA -10 NamedComponentA")); } @Test public void should_inject_multiple_named_components() { Factory factory = Factory.builder().addFromServiceLoader().build(); assertThat(factory.queryByName(Name.of(String.class, "NCMB")).findOneAsComponent()) .isEqualTo(Optional.of("NCMA2 -10 NamedComponentA2;NCMA1 0 NamedComponentA1")); } @Test(expected = IllegalStateException.class) public void should_missing_mandatory_named_dependency_throws_an_exception(){ // check that we don't get a stack overflow error due to box closing the factory Factory factory = Factory.builder() .addMachine(new TestMandatoryDependencyFactoryMachine()) .build(); factory.queryByName(Name.of(String.class, "mandatory.dep.result1")).findOne(); } @Test(expected = IllegalStateException.class) public void should_missing_mandatory_class_dependency_throws_an_exception(){ // check that we don't get a stack overflow error due to box closing the factory Factory factory = Factory.builder() .addMachine(new TestMandatoryDependencyFactoryMachine()) .build(); factory.queryByName(Name.of(String.class, "mandatory.dep.result2")).findOne(); } @Test public void should_get_component_declared_as_inner_class() throws Exception { Factory factory = Factory.builder().addFromServiceLoader().build(); assertThat(factory.queryByClass(A.class).findOne().isPresent()).isTrue(); } @Test public void should_permit_to_force_component_produced_class() { Factory factory = Factory.builder().addFromServiceLoader().build(); TestGreeting component = factory.getComponent(TestGreeting.class); assertThat(component.greet()).isEqualTo("hello"); Optional<NamedComponent<TestGreeting>> one = factory.queryByClass(TestGreeting.class).findOne(); assertThat(one.isPresent()); assertThat(one.get().getName().getClazz()).isEqualTo(TestGreeting.class); } }