package com.constellio.app.services.records; import static com.constellio.model.entities.Language.French; import static com.constellio.model.entities.schemas.MetadataValueType.STRING; import static com.constellio.sdk.tests.TestUtils.asMap; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import com.constellio.app.extensions.AppLayerCollectionExtensions; import com.constellio.app.extensions.AppLayerExtensions; import com.constellio.app.extensions.AppLayerSystemExtensions; import com.constellio.app.extensions.sequence.AvailableSequence; import com.constellio.app.extensions.sequence.AvailableSequenceForRecordParams; import com.constellio.app.extensions.sequence.AvailableSequenceForSystemParams; import com.constellio.app.extensions.sequence.CollectionSequenceExtension; import com.constellio.app.extensions.sequence.SystemSequenceExtension; import com.constellio.app.modules.rm.RMTestRecords; import com.constellio.app.modules.rm.wrappers.Category; import com.constellio.app.modules.rm.wrappers.Document; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.modules.rm.wrappers.RetentionRule; import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration; import com.constellio.model.services.schemas.MetadataSchemasManager; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.sdk.tests.ConstellioTest; public class AvailableSequencesServicesAcceptanceTest extends ConstellioTest { RMTestRecords records = new RMTestRecords(zeCollection); AvailableSequence sequence1 = new AvailableSequence("sequence1", asMap(French, "Ze séquence")); AvailableSequence sequence2 = new AvailableSequence("sequence2", asMap(French, "Autre séquence")); AvailableSequence sequence3 = new AvailableSequence("sequence3", asMap(French, "Troisième séquence")); AvailableSequence sequence4 = new AvailableSequence("sequenceRubrique1", asMap(French, "Séquence rubrique 1")); AvailableSequence sequence5 = new AvailableSequence("sequenceRubrique2", asMap(French, "Séquence rubrique 2")); AvailableSequence sequence6 = new AvailableSequence("sequenceRubrique3", asMap(French, "Séquence rubrique 1")); AvailableSequence sequence7 = new AvailableSequence("sequenceRègles", asMap(French, "Séquence règles")); AvailableSequencesServices services; AppLayerExtensions extensions; AppLayerSystemExtensions systemExtensions; AppLayerCollectionExtensions zeCollectionExtensions; AppLayerCollectionExtensions anotherCollectionExtensions; MetadataSchemasManager metadataSchemasManager; @Before public void setUp() throws Exception { prepareSystem( withZeCollection().withConstellioRMModule().withRMTest(records).withFoldersAndContainersOfEveryStatus(), withCollection("anotherCollection").withConstellioRMModule() ); services = new AvailableSequencesServices(getAppLayerFactory()); extensions = getAppLayerFactory().getExtensions(); systemExtensions = extensions.getSystemWideExtensions(); zeCollectionExtensions = extensions.forCollection(zeCollection); anotherCollectionExtensions = extensions.forCollection("anotherCollection"); metadataSchemasManager = getModelLayerFactory().getMetadataSchemasManager(); } @Test public void whenDeclaredSequenceTablesUsingExtensionsThenRetrievedInAvailableSequencesServices() throws Exception { systemExtensions.systemSequenceExtensions.add(new SystemSequenceExtension() { @Override public List<AvailableSequence> getAvailableSequences(AvailableSequenceForSystemParams params) { return asList(sequence1, sequence2); } }); systemExtensions.systemSequenceExtensions.add(new SystemSequenceExtension() { @Override public List<AvailableSequence> getAvailableSequences(AvailableSequenceForSystemParams params) { return asList(sequence1, sequence3); } }); zeCollectionExtensions.collectionSequenceExtensions.add(new CollectionSequenceExtension() { @Override public List<AvailableSequence> getAvailableSequencesForRecord(AvailableSequenceForRecordParams params) { if (params.isSchemaType(Category.SCHEMA_TYPE)) { return asList(sequence4, sequence5); } else { return new ArrayList<AvailableSequence>(); } } }); zeCollectionExtensions.collectionSequenceExtensions.add(new CollectionSequenceExtension() { @Override public List<AvailableSequence> getAvailableSequencesForRecord(AvailableSequenceForRecordParams params) { if (params.isSchemaType(RetentionRule.SCHEMA_TYPE)) { return asList(sequence7); } else { return new ArrayList<AvailableSequence>(); } } }); zeCollectionExtensions.collectionSequenceExtensions.add(new CollectionSequenceExtension() { @Override public List<AvailableSequence> getAvailableSequencesForRecord(AvailableSequenceForRecordParams params) { return null; } }); anotherCollectionExtensions.collectionSequenceExtensions.add(new CollectionSequenceExtension() { @Override public List<AvailableSequence> getAvailableSequencesForRecord(AvailableSequenceForRecordParams params) { return asList(sequence6); } }); assertThat(services.getAvailableSequencesForRecord(records.getCategory_Z().getWrappedRecord())) .usingFieldByFieldElementComparator().containsOnly(sequence4, sequence5); assertThat(services.getAvailableSequencesForRecord(records.getRule1().getWrappedRecord())) .usingFieldByFieldElementComparator().containsOnly(sequence7); assertThat(services.getAvailableSequencesForRecord(records.getUnit10().getWrappedRecord())) .usingFieldByFieldElementComparator().isEmpty(); assertThat(services.getAvailableGlobalSequences()).usingFieldByFieldElementComparator() .containsOnly(sequence1, sequence2, sequence3); } @Test public void whenDeclaredSequenceTablesUsingSequenceMetadatasThenRetrievedInAvailableSequencesServices() throws Exception { metadataSchemasManager.modify(zeCollection, new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchema(Folder.DEFAULT_SCHEMA).create("sequentialNumber").setType(STRING) .setLabels(asMap(French, "Numéro séquentiel de la rubrique")) .defineDataEntry().asSequenceDefinedByMetadata(Folder.CATEGORY); types.getSchema(Folder.DEFAULT_SCHEMA).create("sequentialNumberNotBasedOnAReferemce").setType(STRING) .setLabels(asMap(French, "Numéro séquentiel de la rubrique non-basé sur une référence")) .defineDataEntry().asSequenceDefinedByMetadata(Folder.CATEGORY_CODE); types.getSchema(Folder.DEFAULT_SCHEMA).create("sequentialNumber2").setType(STRING) .setLabels(asMap(French, "Numéro séquentiel de l'unité ")) .defineDataEntry().asSequenceDefinedByMetadata(Folder.ADMINISTRATIVE_UNIT); types.getSchema(Folder.DEFAULT_SCHEMA).create("globalSequentialNumber").setType(STRING) .setLabels(asMap(French, "Numéro séquentiel global")) .defineDataEntry().asFixedSequence("globalSequence"); types.getSchema(RetentionRule.DEFAULT_SCHEMA).create("globalSequentialNumber").setType(STRING) .setLabels(asMap(French, "Numéro séquentiel global")) .defineDataEntry().asFixedSequence("globalSequence"); types.getSchema(RetentionRule.DEFAULT_SCHEMA).create("globalSequentialNumber2").setType(STRING) .setLabels(asMap(French, "Numéro séquentiel global")) .defineDataEntry().asFixedSequence("globalSequence2"); types.getSchema(Document.DEFAULT_SCHEMA).create("sequentialNumber").setType(STRING) .setLabels(asMap(French, "Numéro séquentiel de l'unité")) .defineDataEntry().asSequenceDefinedByMetadata(Document.FOLDER_ADMINISTRATIVE_UNIT); } }); assertThat(services.getAvailableSequencesForRecord(records.getCategory_X100().getWrappedRecord())).containsOnly( new AvailableSequence(records.categoryId_X100, asMap(French, "Séquence utilisée par le type de schéma Dossier")) ); assertThat(services.getAvailableSequencesForRecord(records.getUnit10().getWrappedRecord())).containsOnly( new AvailableSequence(records.unitId_10, asMap(French, "Séquence utilisée par les types de schéma Document, Dossier")) ); assertThat(services.getAvailableGlobalSequences()).containsOnly( new AvailableSequence("globalSequence", asMap(French, "Séquence utilisée par les types de schéma Dossier, Règle de conservation")), new AvailableSequence("globalSequence2", asMap(French, "Séquence utilisée par le type de schéma Règle de conservation")) ); assertThat(services.getAvailableSequencesForRecord(records.getFolder_A01().getWrappedRecord())).isEmpty(); } }