package com.constellio.model.services.schemas.builders; import static com.constellio.model.entities.schemas.MetadataValueType.DATE_TIME; import static com.constellio.model.entities.schemas.MetadataValueType.NUMBER; import static com.constellio.model.entities.schemas.MetadataValueType.REFERENCE; import static com.constellio.model.entities.schemas.MetadataValueType.STRING; import static com.constellio.sdk.tests.TestUtils.asList; import static com.constellio.sdk.tests.TestUtils.asSet; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; import java.util.Arrays; import java.util.List; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import com.constellio.data.dao.services.DataStoreTypesFactory; import com.constellio.model.entities.Language; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.CalculatorUsingM2; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyNoDependenciesCalculator; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyNumberCalculator2; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyReferenceNumberCalculator; import com.constellio.model.services.taxonomies.TaxonomiesManager; import com.constellio.model.utils.DefaultClassProvider; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.schemas.FakeDataStoreTypeFactory; public class MetadataSchemaTypesBuilderTest extends ConstellioTest { DataStoreTypesFactory typesFactory; MetadataSchemaTypeBuilder zeType; MetadataSchemaBuilder zeTypeDefaultSchema; MetadataSchemaBuilder zeTypeCustomSchema; MetadataSchemaTypeBuilder anotherType; MetadataSchemaBuilder anotherTypeDefaultSchema; MetadataSchemaBuilder anotherTypeCustomSchema; MetadataSchemaTypeBuilder aThirdType; MetadataSchemaBuilder aThirdTypeDefaultSchema; MetadataSchemaBuilder aThirdTypeCustomSchema; MetadataSchemaTypesBuilder typesBuilder; @Mock TaxonomiesManager taxonomiesManager; @Mock ModelLayerFactory modelLayerFactory; @Before public void setUp() { when(modelLayerFactory.getTaxonomiesManager()).thenReturn(taxonomiesManager); typesFactory = new FakeDataStoreTypeFactory(); typesBuilder = MetadataSchemaTypesBuilder.createWithVersion("zeUltimateCollection", 0, new DefaultClassProvider(), Arrays.asList(Language.French)); zeType = typesBuilder.createNewSchemaType("zeType"); zeTypeDefaultSchema = zeType.getDefaultSchema(); zeTypeCustomSchema = zeType.createCustomSchema("custom"); anotherType = typesBuilder.createNewSchemaType("anotherType"); anotherTypeDefaultSchema = anotherType.getDefaultSchema(); anotherTypeCustomSchema = anotherType.createCustomSchema("custom"); aThirdType = typesBuilder.createNewSchemaType("aThirdType"); aThirdTypeDefaultSchema = aThirdType.getDefaultSchema(); aThirdTypeCustomSchema = aThirdType.createCustomSchema("custom"); } @Test public void whenBuildingThenSetCollection() throws Exception { assertThat(typesBuilder.build(typesFactory, modelLayerFactory).getCollection()).isEqualTo("zeUltimateCollection"); } @Test public void whenModifyThenSetCollection() throws Exception { MetadataSchemaTypes types = typesBuilder.build(typesFactory, modelLayerFactory); assertThat(MetadataSchemaTypesBuilder.modify(types, new DefaultClassProvider()).getCollection()) .isEqualTo("zeUltimateCollection"); } @Test public void givenTwoCopiedMetadatasAndOneManualEntryMetadataWhenGetAllCopiedMetadatasThenTwoMetadatasAreReturned() throws Exception { givenZeCustomSchemaMetadata(MetadataValueType.STRING); givenCopiedMetadata(); givenCopiedMetadata(); Set<MetadataBuilder> copiedMetadatas = typesBuilder.getAllCopiedMetadatas(); assertThat(copiedMetadatas).hasSize(2); } @Test public void givenTwoCalculatedMetadatasAndOneManualEntryMetadataWhenGetAllCalculatedMetadatasThenTwoMetadatasAreReturned() throws Exception { givenZeCustomSchemaMetadata(MetadataValueType.STRING); givenCalculatedMetadata("zeMetadataNumer1"); givenCalculatedMetadata("zeMetadataNumer2"); int numberOfMetadatas = 0; for (MetadataBuilder metadata : typesBuilder.getAllCalculatedMetadatas()) { if (metadata.getLocalCode().startsWith("zeMetadataNumer")) { numberOfMetadatas++; } } assertThat(numberOfMetadatas).isEqualTo(2); } @Test public void givenFourMetadatasPlusTwoAumtomaticCreatedMetadatasdWhenGetAllMetadatasThenSixMetadatasAreReturned() throws Exception { givenZeDefaultSchemaMetadata("zeMetadataNumer1", MetadataValueType.STRING); givenZeCustomSchemaMetadata("zeMetadataNumer2", MetadataValueType.STRING); givenAnotherDefaultSchemaMetadata("zeMetadataNumer3", MetadataValueType.STRING); givenAnotherCustomSchemaMetadata("zeMetadataNumer4", MetadataValueType.STRING); int numberOfMetadatas = 0; for (MetadataBuilder metadata : typesBuilder.getAllMetadatas()) { if (metadata.getLocalCode().startsWith("zeMetadataNumer")) { numberOfMetadatas++; } } assertThat(numberOfMetadatas).isEqualTo(6); } // Copied metadata validation tests @Test public void givenSingleValueMetadataWithCopiedEntryBasedOnSingleValueReferenceAndSingleValueCopiedMetadataWhenBuildingThenOK() throws Exception { MetadataBuilder metadataWithCopiedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeDefaultSchemaMetadata(REFERENCE).setMultivalue(false); MetadataBuilder anotherMetadata = givenAnotherDefaultSchemaMetadata(STRING).setMultivalue(false); metadataWithReferenceToAnotherSchema.defineReferences().set(anotherType); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); typesBuilder.build(typesFactory, modelLayerFactory); } // Copied metadata validation tests @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CannotCopyACustomMetadata.class) public void givenSingleValueMetadataWithCopiedEntryBasedOnSingleValueReferenceInCustomSchemaAndSingleValueCopiedMetadataWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCopiedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeDefaultSchemaMetadata(REFERENCE).setMultivalue(false); MetadataBuilder anotherMetadata = givenAnotherCustomSchemaMetadata(STRING).setMultivalue(false); metadataWithReferenceToAnotherSchema.defineReferences().set(anotherType); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CannotCopyMultiValueInSingleValueMetadata.class) public void givenSingleValueMetadataWithCopiedEntryBasedOnMultiValueReferenceAndSingleValueCopiedMetadataWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCopiedEntry = givenZeCustomSchemaMetadata(STRING).setMultivalue(false); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeCustomSchemaMetadata(REFERENCE).setMultivalue(true); MetadataBuilder anotherMetadata = givenAnotherCustomSchemaMetadata(STRING).setMultivalue(false); metadataWithReferenceToAnotherSchema.defineReferences().set(anotherType); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CannotCopyMultiValueInSingleValueMetadata.class) public void givenSingleValueMetadataWithCopiedEntryBasedOnSingleValueReferenceAndMultiValueCopiedMetadataWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCopiedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeDefaultSchemaMetadata(REFERENCE).setMultivalue(false); MetadataBuilder anotherMetadata = givenAnotherDefaultSchemaMetadata(STRING).setMultivalue(true); metadataWithReferenceToAnotherSchema.defineReferences().set(anotherType); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); typesBuilder.build(typesFactory, modelLayerFactory); } @Test public void givenMultiValueMetadataWithCopiedEntryBasedOnSingleValueReferenceAndMultiValueCopiedMetadataWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCopiedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(true); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeDefaultSchemaMetadata(REFERENCE).setMultivalue(false); MetadataBuilder anotherMetadata = givenAnotherDefaultSchemaMetadata(STRING).setMultivalue(true); metadataWithReferenceToAnotherSchema.defineReferences().set(anotherType); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); typesBuilder.build(typesFactory, modelLayerFactory); } @Test public void givenMultiValueMetadataWithCopiedEntryBasedOnMultiValueReferenceAndMultiValueCopiedMetadataWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCopiedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(true); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeDefaultSchemaMetadata(REFERENCE).setMultivalue(true); MetadataBuilder anotherMetadata = givenAnotherDefaultSchemaMetadata(STRING).setMultivalue(true); metadataWithReferenceToAnotherSchema.defineReferences().set(anotherType); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CannotCopyMultiValueInSingleValueMetadata.class) public void givenSingleValueMetadataWithCopiedEntryBasedOnMultiValueReferenceAndMultiValueCopiedMetadataWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCopiedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeDefaultSchemaMetadata(REFERENCE).setMultivalue(true); MetadataBuilder anotherMetadata = givenAnotherDefaultSchemaMetadata(STRING).setMultivalue(true); metadataWithReferenceToAnotherSchema.defineReferences().set(anotherType); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); typesBuilder.build(typesFactory, modelLayerFactory); } @Test public void givenMultiValueMetadataWithCopiedEntryBasedOnMultiValueReferenceAndSingleValueCopiedMetadataWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCopiedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(true); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeDefaultSchemaMetadata(REFERENCE).setMultivalue(true); MetadataBuilder anotherMetadata = givenAnotherDefaultSchemaMetadata(STRING).setMultivalue(false); metadataWithReferenceToAnotherSchema.defineReferences().set(anotherType); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CannotCopySingleValueInMultiValueMetadata.class) public void givenMultiValueMetadataWithCopiedEntryBasedOnSingleValueReferenceAndSingleValueCopiedMetadataWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCopiedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(true); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeDefaultSchemaMetadata(REFERENCE).setMultivalue(false); MetadataBuilder anotherMetadata = givenAnotherDefaultSchemaMetadata(STRING).setMultivalue(false); metadataWithReferenceToAnotherSchema.defineReferences().set(anotherType); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CannotCopyADifferentTypeInMetadata.class) public void givenTypeTextMetadataWithCopiedEntryAndATypeDateValueCopiedMetadataWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCopiedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeDefaultSchemaMetadata(REFERENCE).setMultivalue(false); MetadataBuilder anotherMetadata = givenAnotherDefaultSchemaMetadata(DATE_TIME).setMultivalue(false); metadataWithReferenceToAnotherSchema.defineReferences().set(anotherType); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); typesBuilder.build(typesFactory, modelLayerFactory); } @Test public void givenTypeTextMetadataWithCopiedEntryAndATypeTextValueCopiedMetadataWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCopiedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeDefaultSchemaMetadata(REFERENCE).setMultivalue(false); MetadataBuilder anotherMetadata = givenAnotherDefaultSchemaMetadata(STRING).setMultivalue(false); metadataWithReferenceToAnotherSchema.defineReferences().set(anotherType); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); typesBuilder.build(typesFactory, modelLayerFactory); } // Calculated metadata validation tests @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CannotCalculateDifferentValueTypeInValueMetadata.class) public void givenTextValueMetadataWithCalculatedEntryAndATextTypeLocalDependencyAndNumberValueCalculatedWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); givenZeDefaultSchemaMetadata("other", STRING).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated( com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyNumberCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test public void givenTextValueMetadataWithCalculatedEntryAndATextTypeLocalDependencyAndTextValueCalculatedWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); givenZeDefaultSchemaMetadata("other", STRING).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated( com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyTextCalculator.class); assertThat(metadataWithCalculatedEntry.getType()).isEqualTo(MetadataValueType.STRING); typesBuilder.build(typesFactory, modelLayerFactory); } @Test public void givenTextValueMetadataWithCalculatedEntryAndANumberTypeLocalDependencyAndTextValueCalculatedWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); givenZeDefaultSchemaMetadata("other", NUMBER).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated( com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyTextCalculatorUsingNumber.class); assertThat(metadataWithCalculatedEntry.getType()).isEqualTo(MetadataValueType.STRING); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CannotCalculateDifferentValueTypeInValueMetadata.class) public void givenNumberValueMetadataWithCalculatedEntryAndATextTypeLocalDependencyAndTextValueCalculatedWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(NUMBER).setMultivalue(false); givenZeDefaultSchemaMetadata("other", STRING).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated( com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyTextCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test public void givenNumberValueMetadataWithCalculatedEntryAndTwoNumberTypeLocalDependenciesAndNumberValueCalculatedWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(NUMBER).setMultivalue(false); givenZeDefaultSchemaMetadata("dependency1", NUMBER).setMultivalue(false); givenZeDefaultSchemaMetadata("dependency2", NUMBER).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated(DummyNumberCalculator2.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CalculatorDependencyHasInvalidValueType.class) public void givenNumberValueMetadataWithCalculatedEntryAndANumberAndATextTypeLocalDependenciesAndNumberValueCalculatedWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(NUMBER).setMultivalue(false); givenZeDefaultSchemaMetadata("dependency1", NUMBER).setMultivalue(false); givenZeDefaultSchemaMetadata("dependency2", STRING).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated(DummyNumberCalculator2.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test public void givenNumberValueMetadataWithCalculatedEntryWithAReferenceToANumberTypeMetadataAndNumberValueCalculatedWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(NUMBER).setMultivalue(false); MetadataBuilder dependencyRef = givenZeDefaultSchemaMetadata("dependencyRef", REFERENCE).setMultivalue(false); givenAnotherDefaultSchemaMetadata("dependencyMeta", NUMBER).setMultivalue(false); dependencyRef.defineReferences().add(anotherTypeDefaultSchema); givenZeDefaultSchemaMetadata("localDependencyMeta", NUMBER).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated(DummyReferenceNumberCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CannotUseACustomMetadataForCalculation.class) public void givenNumberValueMetadataWithCalculatedEntryWithAReferenceToANumberTypeCustomMetadataAndNumberValueCalculatedWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(NUMBER).setMultivalue(false); MetadataBuilder dependencyRef = givenZeDefaultSchemaMetadata("dependencyRef", REFERENCE).setMultivalue(false); givenAnotherCustomSchemaMetadata("dependencyMeta", NUMBER).setMultivalue(false); dependencyRef.defineReferences().add(anotherTypeCustomSchema); givenZeDefaultSchemaMetadata("localDependencyMeta", NUMBER).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated(DummyReferenceNumberCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CalculatorDependencyHasInvalidValueType.class) public void givenNumberValueMetadataWithCalculatedEntryWithAReferenceToANotNumberTypeMetadataAndNumberValueCalculatedWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(NUMBER).setMultivalue(false); MetadataBuilder dependencyRef = givenZeDefaultSchemaMetadata("dependencyRef", REFERENCE).setMultivalue(false); givenAnotherDefaultSchemaMetadata("dependencyMeta", STRING).setMultivalue(false); dependencyRef.defineReferences().add(anotherTypeDefaultSchema); givenZeDefaultSchemaMetadata("localDependencyMeta", NUMBER).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated(DummyReferenceNumberCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.NoAllowedReferences.class) public void givenMetadataWithCalculatedEntryWithoutAllowedReferencesWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(NUMBER).setMultivalue(false); givenZeDefaultSchemaMetadata("dependencyRef", REFERENCE).setMultivalue(false); givenAnotherDefaultSchemaMetadata("dependencyMeta", STRING).setMultivalue(false); givenZeDefaultSchemaMetadata("localDependencyMeta", NUMBER).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated(DummyReferenceNumberCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.NoAllowedReferences.class) public void givenMetadataWithCalculatedEntryWithoutAReferenceTypeMetadataWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(NUMBER).setMultivalue(false); givenZeDefaultSchemaMetadata("dependencyRef", STRING).setMultivalue(false); givenAnotherDefaultSchemaMetadata("dependencyMeta", STRING).setMultivalue(false); givenZeDefaultSchemaMetadata("localDependencyMeta", NUMBER).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated(DummyReferenceNumberCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.InvalidDependencyMetadata.class) public void givenMetadataWithCalculatedEntryWithAReferenceToAnInexistentMetadataWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(NUMBER).setMultivalue(false); MetadataBuilder dependencyRef = givenZeDefaultSchemaMetadata("dependencyRef", REFERENCE).setMultivalue(false); dependencyRef.defineReferences().add(anotherTypeDefaultSchema); givenZeDefaultSchemaMetadata("localDependencyMeta", NUMBER).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated(DummyReferenceNumberCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.NoDependenciesInCalculator.class) public void givenMetadataWithCalculatedEntryWithoutDependenciesWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated(DummyNoDependenciesCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.NoDependenciesInCalculator.class) public void givenMetadataWithCalculatedEntryWithoutReferenceDependencyWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated(DummyNoDependenciesCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test public void givenMultiValueMetadataWithCalculatedEntryAndAMultivalueLocalDependencyAndListCalculatedWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(true); givenZeDefaultSchemaMetadata("other", STRING).setMultivalue(true); metadataWithCalculatedEntry.defineDataEntry().asCalculated( com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyTextListCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test public void givenMultiValueMetadataWithCalculatedEntryAndASingleValueLocalDependencyAndListCalculatedWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(true); givenZeDefaultSchemaMetadata("other", STRING).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated( com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyTextListCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CannotCalculateASingleValueInAMultiValueMetadata.class) public void givenMultiValueMetadataWithCalculatedEntryAndAMultiValueLocalDependencyAndSingleValueCalculatedWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(true); givenZeDefaultSchemaMetadata("other", STRING).setMultivalue(true); metadataWithCalculatedEntry.defineDataEntry().asCalculated( com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyTextCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test public void givenSingleValueMetadataWithCalculatedEntryAndAMultiValueLocalDependencyAndSingleValueCalculatedWhenBuildingThenOk() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); givenZeDefaultSchemaMetadata("other", STRING).setMultivalue(true); metadataWithCalculatedEntry.defineDataEntry().asCalculated( com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyTextCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CannotCalculateAMultiValueInASingleValueMetadata.class) public void givenSingleValueMetadataWithCalculatedEntryAndAMultiValueLocalDependencyAndMultiValueCalculatedWhenBuildingThenException() throws Exception { MetadataBuilder metadataWithCalculatedEntry = givenZeDefaultSchemaMetadata(STRING).setMultivalue(false); givenZeDefaultSchemaMetadata("other", STRING).setMultivalue(true); metadataWithCalculatedEntry.defineDataEntry().asCalculated( com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyTextListCalculator.class); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CyclicDependenciesInSchemas.class) public void givenThatTwoSchemasHasMutualDependenciesWithReferencesThenCannotBuild() throws Exception { MetadataBuilder zeSchemaMetadata = givenZeDefaultSchemaMetadata(REFERENCE); MetadataBuilder anotherSchemaMetadata = givenAnotherDefaultSchemaMetadata(REFERENCE); zeSchemaMetadata.defineReferences().set(anotherType); anotherSchemaMetadata.defineReferences().set(zeType); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CyclicDependenciesInSchemas.class) public void givenThatThreeSchemasHasMutualDependenciesToTypesWithReferencesThenCannotBuild() throws Exception { MetadataBuilder zeSchemaMetadata = givenZeDefaultSchemaMetadata(REFERENCE); MetadataBuilder secondSchemaMetadata = givenAnotherDefaultSchemaMetadata(REFERENCE); MetadataBuilder thirdSchemaMetadata = givenThirdTypeDefaultSchemaMetadata(REFERENCE); zeSchemaMetadata.defineReferences().set(anotherType); secondSchemaMetadata.defineReferences().set(aThirdType); thirdSchemaMetadata.defineReferences().set(zeType); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CyclicDependenciesInSchemas.class) public void givenThatThreeSchemasHasMutualDependenciesToSchemasWithReferencesThenCannotBuild() throws Exception { MetadataBuilder zeSchemaMetadata = givenZeDefaultSchemaMetadata(REFERENCE); MetadataBuilder secondSchemaMetadata = givenAnotherDefaultSchemaMetadata(REFERENCE); MetadataBuilder thirdSchemaMetadata = givenThirdTypeDefaultSchemaMetadata(REFERENCE); zeSchemaMetadata.defineReferences().add(anotherTypeDefaultSchema); secondSchemaMetadata.defineReferences().add(aThirdTypeCustomSchema); thirdSchemaMetadata.defineReferences().add(zeTypeCustomSchema); typesBuilder.build(typesFactory, modelLayerFactory); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CyclicDependenciesInSchemas.class) public void givenThatCustomSchemasHasMutualDependenciesToSchemasWithReferencesThenCannotBuild() throws Exception { MetadataBuilder zeSchemaMetadata = givenZeCustomSchemaMetadata(REFERENCE); MetadataBuilder secondSchemaMetadata = givenAnotherCustomSchemaMetadata(REFERENCE); MetadataBuilder thirdSchemaMetadata = givenThirdTypeDefaultSchemaMetadata(REFERENCE); zeSchemaMetadata.defineReferences().add(anotherTypeDefaultSchema); secondSchemaMetadata.defineReferences().add(aThirdTypeCustomSchema); thirdSchemaMetadata.defineReferences().add(zeTypeCustomSchema); typesBuilder.build(typesFactory, modelLayerFactory); } @Test public void whenCalculatingDependenciesOfMetadatasReferencingDifferentTypesThenBothTypesReturned() throws Exception { MetadataBuilder zeSchemaMetadata1 = givenZeDefaultSchemaMetadata(REFERENCE); MetadataBuilder anotherSchemaMetadata1 = givenZeDefaultSchemaMetadata(REFERENCE); zeSchemaMetadata1.defineReferences().set(anotherType); anotherSchemaMetadata1.defineReferences().set(aThirdType); assertThat(typesBuilder.getSchemaDependenciesOf(zeType)).containsOnly(anotherType.getCode(), aThirdType.getCode()); } @Test public void whenCalculatingDependenciesOfMetadatasReferencingSchemasOfDifferentTypesThenBothTypesReturned() throws Exception { MetadataBuilder zeSchemaMetadata1 = givenZeDefaultSchemaMetadata(REFERENCE); zeSchemaMetadata1.defineReferences().add(anotherTypeCustomSchema); assertThat(typesBuilder.getSchemaDependenciesOf(zeType)).containsOnly(anotherType.getCode()); } @Test public void whenCalculatingDependenciesOfASchemaWithAReferenceToTwoDifferentTypeThenBothAreReturned() throws Exception { MetadataBuilder zeSchemaMetadata = givenZeDefaultSchemaMetadata(REFERENCE); MetadataBuilder zeOtherSchemaMetadata = givenZeDefaultSchemaMetadata(REFERENCE); zeSchemaMetadata.defineReferences().add(anotherTypeCustomSchema); zeOtherSchemaMetadata.defineReferences().set(aThirdType); assertThat(typesBuilder.getSchemaDependenciesOf(zeType)).containsOnly(anotherType.getCode(), aThirdType.getCode()); } @Test public void whenBuildingSchemaThenOrderAutomaticMetadatasBasedOnTheirDependencies() throws Exception { MetadataBuilder anotherSchemaMetadata = givenAnotherDefaultSchemaMetadata(STRING); MetadataBuilder zeSchemaMetadataRef = givenZeDefaultSchemaMetadata(REFERENCE); zeSchemaMetadataRef.defineReferences().set(anotherType); givenZeDefaultSchemaMetadata("m1", STRING).defineDataEntry().asCalculated(CalculatorUsingM2.class); givenZeDefaultSchemaMetadata("m2", STRING).defineDataEntry().asCopied(zeSchemaMetadataRef, anotherSchemaMetadata); List<Metadata> metadatas = zeTypeDefaultSchema.buildDefault(typesFactory, modelLayerFactory).getAutomaticMetadatas(); assertThat(metadatas).extracting("localCode") .isEqualTo( asList("allReferences", "allRemovedAuths", "attachedAncestors", "autocomplete", "inheritedauthorizations", "m2", "parentpath", "path", "tokens", "allauthorizations", "m1", "pathParts", "principalpath")); } @Test(expected = MetadataSchemaBuilderRuntimeException.CyclicDependenciesInMetadata.class) public void whenBuildingSchemaWithCyclicDependenciesThenThrowException() throws Exception { MetadataBuilder zeSchemaMetadataRef = givenZeDefaultSchemaMetadata(REFERENCE); givenZeDefaultSchemaMetadata("m1", STRING).defineDataEntry().asCalculated( com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.CalculatorUsingM2.class); givenZeDefaultSchemaMetadata("m2", STRING).defineDataEntry().asCalculated( com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.CalculatorUsingM1.class); zeSchemaMetadataRef.defineReferences().set(anotherType); zeTypeDefaultSchema.buildDefault(typesFactory, modelLayerFactory).getAutomaticMetadatas(); } @Test public void whenCalculatingTypesDependencyMapThenCombineAllDependenciesOfAllTypes() throws Exception { MetadataBuilder zeSchemaMetadata1 = givenZeDefaultSchemaMetadata(REFERENCE); MetadataBuilder zeSchemaMetadata2 = givenZeCustomSchemaMetadata(REFERENCE); MetadataBuilder anotherSchemaMetadata1 = givenAnotherCustomSchemaMetadata(REFERENCE); zeSchemaMetadata1.defineReferences().add(anotherTypeCustomSchema); zeSchemaMetadata2.defineReferences().add(aThirdTypeDefaultSchema); anotherSchemaMetadata1.defineReferences().add(aThirdTypeDefaultSchema); Set<String> expectedZeTypeDependencies = asSet(anotherType.getCode(), aThirdType.getCode()); Set<String> expectedAnotherTypeDependencies = asSet(aThirdType.getCode()); assertThat(typesBuilder.getTypesDependencies()).hasSize(2).containsEntry(zeType.getCode(), expectedZeTypeDependencies) .containsEntry(anotherType.getCode(), expectedAnotherTypeDependencies); } @Test(expected = MetadataSchemaTypesBuilderRuntimeException.CannotCopyUsingACustomMetadata.class) public void givenMetadataWithCopiedEntryUsingAReferenceOnCustomSchemasThenException() throws Exception { MetadataBuilder metadataWithCopiedEntry = givenZeDefaultSchemaMetadata(STRING); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeDefaultSchemaMetadata(REFERENCE); MetadataBuilder anotherMetadata = givenAnotherDefaultSchemaMetadata(STRING); metadataWithReferenceToAnotherSchema.defineReferences().add(anotherTypeCustomSchema); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); typesBuilder.build(typesFactory, modelLayerFactory); } private void givenCopiedMetadata() { MetadataBuilder metadataWithCopiedEntry = givenZeCustomSchemaMetadata(STRING).setMultivalue(false); MetadataBuilder metadataWithReferenceToAnotherSchema = givenZeCustomSchemaMetadata(REFERENCE).setMultivalue(false); MetadataBuilder anotherMetadata = givenAnotherCustomSchemaMetadata(STRING).setMultivalue(false); metadataWithReferenceToAnotherSchema.defineReferences().set(anotherType); metadataWithCopiedEntry.defineDataEntry().asCopied(metadataWithReferenceToAnotherSchema, anotherMetadata); } private void givenCalculatedMetadata(String code) { MetadataBuilder metadataWithCalculatedEntry = givenZeCustomSchemaMetadata(code, STRING).setMultivalue(false); metadataWithCalculatedEntry.defineDataEntry().asCalculated( com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderTestCalculatorUtils.DummyTextCalculator.class); } private MetadataBuilder givenZeDefaultSchemaMetadata(String code, MetadataValueType type) { return zeTypeDefaultSchema.create(code).setType(type); } private MetadataBuilder givenZeDefaultSchemaMetadata(MetadataValueType type) { return zeTypeDefaultSchema.create(aString()).setType(type); } private MetadataBuilder givenZeCustomSchemaMetadata(MetadataValueType type) { return zeTypeCustomSchema.create(aString()).setType(type); } private MetadataBuilder givenZeCustomSchemaMetadata(String code, MetadataValueType type) { return zeTypeCustomSchema.create(code).setType(type); } private MetadataBuilder givenAnotherDefaultSchemaMetadata(String code, MetadataValueType type) { return anotherTypeDefaultSchema.create(code).setType(type); } private MetadataBuilder givenAnotherCustomSchemaMetadata(String code, MetadataValueType type) { return anotherTypeCustomSchema.create(code).setType(type); } private MetadataBuilder givenAnotherDefaultSchemaMetadata(MetadataValueType type) { return anotherTypeDefaultSchema.create(aString()).setType(type); } private MetadataBuilder givenAnotherCustomSchemaMetadata(MetadataValueType type) { return anotherTypeCustomSchema.create(aString()).setType(type); } private MetadataBuilder givenThirdTypeDefaultSchemaMetadata(MetadataValueType type) { return anotherTypeDefaultSchema.create(aString()).setType(type); } private MetadataBuilder givenThirdTypeCustomSchemaMetadata(MetadataValueType type) { return anotherTypeCustomSchema.create(aString()).setType(type); } }