package com.constellio.model.services.schemas.builders;
import static com.constellio.sdk.tests.TestUtils.getElementsClasses;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.HashSet;
import java.util.Set;
import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import com.constellio.model.entities.schemas.validation.RecordMetadataValidator;
import com.constellio.model.services.schemas.testimpl.TestRecordMetadataValidator1;
import com.constellio.model.services.schemas.testimpl.TestRecordMetadataValidator2;
import com.constellio.model.services.schemas.testimpl.problems.AbstractTestMetadataValidator;
import com.constellio.model.services.schemas.testimpl.problems.TestRecordMetadataValidatorWithoutDefaultConstructor;
import com.constellio.model.utils.ClassProvider;
import com.constellio.model.utils.DefaultClassProvider;
import com.constellio.sdk.tests.ConstellioTest;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ClassListBuilderTest extends ConstellioTest {
ClassListBuilder<RecordMetadataValidator<?>> builder, builderWithElement, builderWithAbstractImplementation,
builderWithoutDefaultConstructor, builderWithInvalidImplementationClassname,
builderWithImplementationNotImplementingInterface;
@Before
public void setUp() {
ClassProvider classProvider = new DefaultClassProvider();
builder = new ClassListBuilder<RecordMetadataValidator<?>>(classProvider, RecordMetadataValidator.class);
Set<RecordMetadataValidator<?>> elements = new HashSet<>();
elements.add(new TestRecordMetadataValidator1());
builderWithElement = new ClassListBuilder<RecordMetadataValidator<?>>(classProvider, RecordMetadataValidator.class,
elements);
builderWithAbstractImplementation = new ClassListBuilder<RecordMetadataValidator<?>>(classProvider,
RecordMetadataValidator.class);
builderWithAbstractImplementation.add(AbstractTestMetadataValidator.class);
builderWithoutDefaultConstructor = new ClassListBuilder<RecordMetadataValidator<?>>(classProvider,
RecordMetadataValidator.class);
builderWithoutDefaultConstructor.add(TestRecordMetadataValidatorWithoutDefaultConstructor.class);
builderWithInvalidImplementationClassname = new ClassListBuilder<RecordMetadataValidator<?>>(
classProvider, RecordMetadataValidator.class);
builderWithInvalidImplementationClassname.add("toto");
builderWithImplementationNotImplementingInterface = new ClassListBuilder<RecordMetadataValidator<?>>(
classProvider, RecordMetadataValidator.class);
builderWithImplementationNotImplementingInterface.add((Class<?>) ConstellioTest.class);
assertThat(builderWithElement.implementationsClassname.size()).isEqualTo(1);
}
@Test
public void givenEmptyListWhenAddImplementationClassAndBuildThenListHasOneImplementation()
throws Exception {
builder.add(TestRecordMetadataValidator1.class);
Set<RecordMetadataValidator<?>> implementations = builder.build();
assertThat(getElementsClasses(implementations)).containsOnly(TestRecordMetadataValidator1.class);
}
@Test
public void givenEmptyListWhenAddImplementationClassnameAndBuildThenListHasOneImplementation()
throws Exception {
builder.add(TestRecordMetadataValidator1.class.getName());
Set<RecordMetadataValidator<?>> implementations = builder.build();
assertThat(getElementsClasses(implementations)).containsOnly(TestRecordMetadataValidator1.class);
}
@Test
public void givenListWithOneImplementationClassnameAndBuildIncludingAnOtherThenListHasTwoImplementation()
throws Exception {
builder.add(TestRecordMetadataValidator1.class.getName());
Set<RecordMetadataValidator<?>> otherImplementations = new HashSet<>();
otherImplementations.add(new TestRecordMetadataValidator2());
Set<RecordMetadataValidator<?>> implementations = builder.build(otherImplementations);
assertThat(getElementsClasses(implementations)).containsOnly(TestRecordMetadataValidator1.class,
TestRecordMetadataValidator2.class);
}
@Test
public void givenListWithOneImplementationClassnameAndBuildIncludingTheSameThenListHasOneImplementation()
throws Exception {
builder.add(TestRecordMetadataValidator1.class.getName());
Set<RecordMetadataValidator<?>> otherImplementations = new HashSet<>();
otherImplementations.add(new TestRecordMetadataValidator1());
Set<RecordMetadataValidator<?>> implementations = builder.build(otherImplementations);
assertThat(getElementsClasses(implementations)).containsOnly(TestRecordMetadataValidator1.class);
}
@Test
public void givenListWithOneImplementationWhenRemovingImplClassAndBuildingThenListHasZeroImplementation()
throws Exception {
builderWithElement.remove(TestRecordMetadataValidator1.class);
Set<RecordMetadataValidator<?>> implementations = builderWithElement.build();
assertThat(getElementsClasses(implementations)).isEmpty();
}
@Test
public void givenListWithOneImplementationWhenRemovingImplClassnameAndBuildingThenListHasZeroImplementation()
throws Exception {
builderWithElement.remove(TestRecordMetadataValidator1.class.getName());
Set<RecordMetadataValidator<?>> implementations = builderWithElement.build();
assertThat(getElementsClasses(implementations)).isEmpty();
}
@Test(expected = ClassListBuilderRuntimeException.CannotInstanciate.class)
public void givenBuilderWithAbstractImplementationWhenBuildingThenException() {
builderWithAbstractImplementation.build();
}
@Test(expected = ClassListBuilderRuntimeException.CannotInstanciate.class)
public void givenBuilderWithoutDefaultConstructorWhenBuildingThenException() {
builderWithoutDefaultConstructor.build();
}
@Test(expected = ClassListBuilderRuntimeException.ClassNotFound.class)
public void givenBuilderWithInvalidClassNameWhenBuildingThenException() {
builderWithInvalidImplementationClassname.build();
}
@Test(expected = ClassListBuilderRuntimeException.ClassDoesntImplementInterface.class)
public void givenBuilderWithImplementationNotImplementingInterfaceWhenBuildingThenException() {
builderWithImplementationNotImplementingInterface.build();
}
}