package com.constellio.model.services.taxonomies; import static junit.framework.TestCase.fail; import static org.assertj.core.api.Assertions.assertThat; import org.junit.Before; import org.junit.Test; import com.constellio.model.entities.Taxonomy; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.schemas.MetadataSchemasManager; import com.constellio.model.services.schemas.builders.MetadataBuilderRuntimeException; import com.constellio.model.services.schemas.builders.MetadataSchemaBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.model.services.search.SearchServices; import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition; import com.constellio.model.services.taxonomies.TaxonomiesManagerRuntimeException.PrincipalTaxonomyCannotBeDisabled; import com.constellio.model.services.taxonomies.TaxonomiesManagerRuntimeException.PrincipalTaxonomyIsAlreadyDefined; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup; import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup.Taxonomy1SecondSchemaType; public class TaxonomiesManager_SelectPrincipalAcceptTest extends ConstellioTest { static String TAXONOMIES_CONFIG = "/taxonomies.xml"; MetadataSchemasManager schemasManager; TaxonomiesManager taxonomiesManager; TaxonomiesSearchServices taxonomiesSearchServices; RecordServices recordServices; SearchServices searchServices; TwoTaxonomiesContainingFolderAndDocumentsSetup schemas = new TwoTaxonomiesContainingFolderAndDocumentsSetup(zeCollection); TwoTaxonomiesContainingFolderAndDocumentsSetup.Taxonomy1FirstSchemaType taxo1Type1 = schemas.new Taxonomy1FirstSchemaType(); TwoTaxonomiesContainingFolderAndDocumentsSetup.Taxonomy1SecondSchemaType taxo1Type2 = schemas.new Taxonomy1SecondSchemaType(); Taxonomy1SecondSchemaType taxo2Type = schemas.new Taxonomy1SecondSchemaType(); LogicalSearchCondition condition; Transaction transaction; Taxonomy taxo1, taxo2, taxo3WithOnlyFirstType, taxo4WithOnlySecondType; @Before public void setUp() throws Exception { schemasManager = getModelLayerFactory().getMetadataSchemasManager(); taxonomiesManager = getModelLayerFactory().getTaxonomiesManager(); defineSchemasManager().using(schemas); taxo1 = schemas.getTaxonomies().get(0); taxo2 = schemas.getTaxonomies().get(1); } @Test(expected = TaxonomiesManagerRuntimeException.TaxonomyMustBeAddedBeforeSettingItHasPrincipal.class) public void givenNoPrincipalTaxonomyWhenSettingNewTaxonomyAsPrincipalTaxonomyThenException() throws Exception { taxonomiesManager.setPrincipalTaxonomy(taxo1, schemasManager); } @Test public void givenNoPrincipalTaxonomyWhenSettingItUsingCorrectSchemaTypesThenSet() throws Exception { givenTaxo1And2(); taxonomiesManager.setPrincipalTaxonomy(taxo1, schemasManager); assertThat(taxonomiesManager.getPrincipalTaxonomy("zeCollection")).isEqualTo(taxo1); } @Test public void givenTaxo1DefinedAsPrincipalWhenCreatingASinglevalueMetadataReferencingItInAnotherSchemaTypeThenSaved() throws Exception { givenTaxo1And2(); taxonomiesManager.setPrincipalTaxonomy(taxo1, schemasManager); MetadataSchemaTypesBuilder typesBuilder = schemasManager.modify("zeCollection"); MetadataSchemaTypeBuilder taxo1Type2Builder = typesBuilder.getSchemaType("taxo1Type2"); typesBuilder.getOrCreateNewSchemaType("anotherSchema").getDefaultSchema().create("ref") .defineReferencesTo(taxo1Type2Builder).setMultivalue(false); MetadataSchemaTypes types = schemasManager .saveUpdateSchemaTypes(typesBuilder); assertThat(types.getMetadata("anotherSchema_default_ref").getAllowedReferences().getAllowedSchemaType()) .isEqualTo("taxo1Type2"); } @Test(expected = PrincipalTaxonomyCannotBeDisabled.class) public void givenDisabledTaxonomyWhenSettingItHasPrincipalThenException() throws Exception { givenTaxo1And2(); taxonomiesManager.disable(taxo1, schemasManager); taxonomiesManager.setPrincipalTaxonomy(taxo1, schemasManager); } @Test(expected = TaxonomiesManagerRuntimeException.PrincipalTaxonomyCannotBeDisabled.class) public void givenPrincipalTaxonomyWhenDisablingItThenException() throws Exception { givenTaxo1And2(); taxonomiesManager.setPrincipalTaxonomy(taxo1, schemasManager); taxonomiesManager.disable(taxo1, schemasManager); } @Test public void givenTaxo1DefinedAsPrincipalWhenCreatingASinglevalueMetadataReferencingItInAnotherSchemaThenSaved() throws Exception { givenTaxo1And2(); taxonomiesManager.setPrincipalTaxonomy(taxo1, schemasManager); MetadataSchemaTypesBuilder typesBuilder = schemasManager.modify("zeCollection"); MetadataSchemaBuilder taxo1Type2Builder = typesBuilder.getSchemaType("taxo1Type2").getDefaultSchema(); typesBuilder.getOrCreateNewSchemaType("anotherSchema").getDefaultSchema().create("ref") .defineReferencesTo(taxo1Type2Builder) .setMultivalue(false); MetadataSchemaTypes types = schemasManager.saveUpdateSchemaTypes(typesBuilder); assertThat(types.getMetadata("anotherSchema_default_ref").getAllowedReferences().getAllowedSchemas()) .containsOnly("taxo1Type2_default"); } @Test(expected = MetadataBuilderRuntimeException.CannotCreateMultivalueReferenceToPrincipalTaxonomy.class) public void givenTaxo1DefinedAsPrincipalWhenCreatingAMultivalueMetadatWithTaxonomyReferenceInAnotherSchemaTypeThenBuildException() throws Exception { givenTaxo1And2(); taxonomiesManager.setPrincipalTaxonomy(taxo1, schemasManager); MetadataSchemaTypesBuilder typesBuilder = schemasManager.modify("zeCollection"); MetadataSchemaTypeBuilder taxo1Type2 = typesBuilder.getSchemaType("taxo1Type2"); typesBuilder.getOrCreateNewSchemaType("anotherSchema").getDefaultSchema().create("ref").defineTaxonomyRelationshipToType( taxo1Type2).setMultivalue(true); schemasManager.saveUpdateSchemaTypes(typesBuilder); } @Test(expected = MetadataBuilderRuntimeException.CannotCreateMultivalueReferenceToPrincipalTaxonomy.class) public void givenTaxo1DefinedAsPrincipalWhenCreatingAMultivalueMetadataWithTaxonomyReferenceInAnotherSchemaTypeThenNoException() throws Exception { givenTaxo1And2(); taxonomiesManager.setPrincipalTaxonomy(taxo1, schemasManager); MetadataSchemaTypesBuilder typesBuilder = schemasManager.modify("zeCollection"); MetadataSchemaTypeBuilder taxo1Type2 = typesBuilder.getSchemaType("taxo1Type2"); typesBuilder.getOrCreateNewSchemaType("anotherSchema").getDefaultSchema().create("ref").defineTaxonomyRelationshipToType( taxo1Type2).setMultivalue(true); schemasManager.saveUpdateSchemaTypes(typesBuilder); } @Test public void givenTaxo1DefinedAsPrincipalWhenCreatingAMultivalueMetadataReferencingItInAnotherSchemaThenNoException() throws Exception { givenTaxo1And2(); taxonomiesManager.setPrincipalTaxonomy(taxo1, schemasManager); MetadataSchemaTypesBuilder typesBuilder = schemasManager.modify("zeCollection"); MetadataSchemaBuilder taxo1Type2 = typesBuilder.getSchemaType("taxo1Type2").getDefaultSchema(); typesBuilder.getOrCreateNewSchemaType("anotherSchema").getDefaultSchema().create("ref").defineReferencesTo(taxo1Type2) .setMultivalue(true); schemasManager.saveUpdateSchemaTypes(typesBuilder); } public void givenTaxo1DefinedAsPrincipalWhenCreatingAMultivalueMetadataReferencingItInAnotherSchemaThenBuildException() throws Exception { givenTaxo1And2(); taxonomiesManager.setPrincipalTaxonomy(taxo1, schemasManager); MetadataSchemaTypesBuilder typesBuilder = schemasManager.modify("zeCollection"); MetadataSchemaBuilder taxo1Type2 = typesBuilder.getSchemaType("taxo1Type2").getDefaultSchema(); typesBuilder.getOrCreateNewSchemaType("anotherSchema").getDefaultSchema().create("ref").defineReferencesTo(taxo1Type2) .setMultivalue(true); schemasManager.saveUpdateSchemaTypes(typesBuilder); } @Test public void givenNoPrincipalTaxonomyWhenSettingTaxoUsedByMultivalueMetadatasThenException() throws Exception { givenTaxo1And2(); try { taxonomiesManager.setPrincipalTaxonomy(taxo2, schemasManager); fail("TaxonomySchemaIsReferencedInMultivalueReference expected"); } catch (TaxonomiesManagerRuntimeException.TaxonomySchemaIsReferencedInMultivalueReference e) { //OK } assertThat(taxonomiesManager.getPrincipalTaxonomy("zeCollection")).isNull(); } @Test public void givenTaxonomyAlreadyDefinedThenCannotDefineItAnotherTime() throws Exception { givenTaxo1And2(); taxonomiesManager.setPrincipalTaxonomy(taxo1, schemasManager); try { taxonomiesManager.setPrincipalTaxonomy(taxo2, schemasManager); fail("PrincipalTaxonomyIsAlreadyDefined expected"); } catch (PrincipalTaxonomyIsAlreadyDefined e) { //OK } assertThat(taxonomiesManager.getPrincipalTaxonomy("zeCollection")).isEqualTo(taxo1); } private void givenTaxo1And2() { taxonomiesManager.addTaxonomy(taxo1, schemasManager); taxonomiesManager.addTaxonomy(taxo2, schemasManager); } }