package com.constellio.app.services.schemas.bulkImport.extensions; import static com.constellio.app.modules.rm.extensions.imports.RetentionRuleImportExtension.INVALID_DOCUMENT_TYPE_CODE; import static com.constellio.app.modules.rm.extensions.imports.RetentionRuleImportExtension.INVALID_MEDIUM_TYPE_CODE; import static com.constellio.app.modules.rm.wrappers.RetentionRule.COPY_RETENTION_RULES; import static com.constellio.app.modules.rm.wrappers.RetentionRule.DOCUMENT_TYPES_DETAILS; import static com.constellio.app.services.schemas.bulkImport.RecordsImportValidator.INVALID_ENUM_VALUE; import static com.constellio.app.services.schemas.bulkImport.RecordsImportValidator.INVALID_NUMBER_VALUE; import static com.constellio.app.services.schemas.bulkImport.RecordsImportValidator.REQUIRED_VALUE; import static com.constellio.sdk.tests.TestUtils.extractingSimpleCodeAndParameters; import static com.constellio.sdk.tests.TestUtils.frenchMessages; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.Mock; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import com.constellio.app.modules.rm.extensions.imports.RetentionRuleImportExtension; import com.constellio.app.services.schemas.bulkImport.RecordsImportServices; import com.constellio.app.services.schemas.bulkImport.data.ImportData; import com.constellio.model.extensions.events.recordsImport.PrevalidationParams; import com.constellio.model.extensions.events.recordsImport.ValidationParams; import com.constellio.model.frameworks.validation.ValidationError; import com.constellio.model.frameworks.validation.ValidationErrors; import com.constellio.sdk.tests.ConstellioTest; public class RetentionRuleExtensionAcceptanceTest extends ConstellioTest { private RetentionRuleImportExtension retentionRuleExtension; private List<Object> copyRetentionRules; private List<Object> documentTypes; @Mock ImportData importData; @Before public void setUp() throws Exception { prepareSystem( withZeCollection().withAllTestUsers().withConstellioRMModule() ); retentionRuleExtension = new RetentionRuleImportExtension(zeCollection, getModelLayerFactory()); copyRetentionRules = new ArrayList<>(); documentTypes = new ArrayList<>(); when(importData.getList(COPY_RETENTION_RULES)).thenReturn(copyRetentionRules); when(importData.getList(DOCUMENT_TYPES_DETAILS)).thenReturn(documentTypes); } @Test public void givenRetentionRuleThenInvalidIdValueOnDocumentType() { ValidationErrors validationErrors = new ValidationErrors(); givenDocumentTypes(documentTypes).code("documentPapier").addField("archivisticStatus", "C").build(); retentionRuleExtension.validate(new ValidationParams(validationErrors, importData)); assertThat(extractingSimpleCodeAndParameters(validationErrors, "index", "value")).containsOnly( tuple("RetentionRuleImportExtension_invalidDocumentType", "0", "documentPapier") ); assertThat(frenchMessages(validationErrors)).containsOnly( "Le code «documentPapier» du type de document à la position 0 ne correspond à aucun enregistrement." ); } @Test public void givenRetentionRuleThenInvalidCopyTypeOnCopyRetentionRule() { ValidationErrors validationErrors = new ValidationErrors(); givenCopyRetentionRule(copyRetentionRules).addField("copyType", "F'`,,,").addField("inactiveDisposalType", "S") .addField("mediumType", "PA,FI"); retentionRuleExtension.prevalidate(new PrevalidationParams(validationErrors, importData)); List<ValidationError> errors = validationErrors.getValidationErrors(); assertThat(extractingSimpleCodeAndParameters(validationErrors, "index", "field", "value")) .containsOnly( tuple("RetentionRuleImportExtension_requiredCopyRuleField", "0", "mediumTypes", null), tuple("RetentionRuleImportExtension_invalidCopyRuleEnumField", "0", "inactiveDisposalType", "S"), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "0", "activeRetentionPeriod", null), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "0", "semiActiveRetentionPeriod", null), tuple("RetentionRuleImportExtension_invalidCopyRuleEnumField", "0", "copyType", "F'`,,,") ); assertThat(frenchMessages(validationErrors)).containsOnly( "La valeur «F'`,,,» au champ «copyType» de l'exemplaire à la position 0 est invalide. Seules les valeurs «P, S» sont supportées.", "La valeur «S» au champ «inactiveDisposalType» de l'exemplaire à la position 0 est invalide. Seules les valeurs «T, D, C» sont supportées.", "Le champ «mediumTypes» est requis pour l'exemplaire à la position 0.", "Le champ «activeRetentionPeriod» est requis pour l'exemplaire à la position 0.", "Le champ «semiActiveRetentionPeriod» est requis pour l'exemplaire à la position 0." ); } @Test public void givenALargeAmountOfScrapDataWhenValidateThenAFullStackOfError() { ValidationErrors validationErrors = new ValidationErrors(); givenCopyRetentionRule(copyRetentionRules).code(String.valueOf(2)).addField("copyType", "S") .addField("inactiveDisposalType", "C") .addField("mediumType", "PA"); givenCopyRetentionRule(copyRetentionRules).code(String.valueOf(3)).addField("copyType", "S") .addField("inactiveDisposalType", "T").addField("mediumTypes", "PA,MD") .addField("mediumType", "test").addField("activeRetentionPeriod", "-25"); givenCopyRetentionRule(copyRetentionRules).code(String.valueOf(10)).addField("copyType", "P") .addField("activeRetentionPeriod", "999"); givenCopyRetentionRule(copyRetentionRules).code(String.valueOf(1)).addField("copyType", "Principale").addField( "activeRetentionPeriod", "888").addField("contentTypesComment", "value unknown").addField("inactiveDisposalType", "D"); givenCopyRetentionRule(copyRetentionRules).code(String.valueOf(1)).addField("copyType", "S") .addField("activeRetentionPeriod", "awer") .addField("contentTypesComment", "value unknown with full stack").addField("inactiveDisposalType", "T"); givenDocumentTypes(documentTypes).code("emailDocumentType").addField("archivisticStatus", "Conservation"); givenDocumentTypes(documentTypes).code("documentType").addField("archivisticStatus", "T"); givenDocumentTypes(documentTypes).code(String.valueOf(3)).addField("archivisticStatus", "t"); givenDocumentTypes(documentTypes).addField("archivisticStatus", "D"); givenDocumentTypes(documentTypes).code("emailDocumentType").code(String.valueOf(1)).addField("archivisticStatus", "T"); retentionRuleExtension.prevalidate(new PrevalidationParams(validationErrors, importData)); assertThat(extractingSimpleCodeAndParameters(validationErrors, "index", "field", "value")).containsOnly( tuple("RetentionRuleImportExtension_invalidCopyRuleNumberField", "1", "activeRetentionPeriod", "-25"), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "2", "mediumTypes", null), tuple("RetentionRuleImportExtension_invalidCopyRuleEnumField", "3", "copyType", "PRINCIPALE"), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "3", "code", null), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "3", "mediumTypes", null), tuple("RetentionRuleImportExtension_invalidCopyRuleNumberField", "4", "activeRetentionPeriod", "awer"), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "4", "mediumTypes", null), tuple("RetentionRuleImportExtension_invalidDocumentTypeEnumField", "0", "archivisticStatus", "CONSERVATION"), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "3", "semiActiveRetentionPeriod", null), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "0", "semiActiveRetentionPeriod", null), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "1", "semiActiveRetentionPeriod", null), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "2", "semiActiveRetentionPeriod", null), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "0", "activeRetentionPeriod", null), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "0", "mediumTypes", null), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "4", "semiActiveRetentionPeriod", null) ); assertThat(frenchMessages(validationErrors)).containsOnly( "Le champ «semiActiveRetentionPeriod» est requis pour l'exemplaire à la position 3.", "La valeur «CONSERVATION» au champ «archivisticStatus» du type de document à la position 0 est invalide. Seules les valeurs «a, s, d, v» sont supportées.", "La valeur «-25» au champ «activeRetentionPeriod» de l'exemplaire à la position 1 n'est pas un nombre valide.", "Le champ «semiActiveRetentionPeriod» est requis pour l'exemplaire à la position 2.", "La valeur «awer» au champ «activeRetentionPeriod» de l'exemplaire à la position 4 n'est pas un nombre valide.", "Le champ «semiActiveRetentionPeriod» est requis pour l'exemplaire à la position 4.", "Le champ «mediumTypes» est requis pour l'exemplaire à la position 4.", "Le champ «mediumTypes» est requis pour l'exemplaire à la position 3.", "Le champ «semiActiveRetentionPeriod» est requis pour l'exemplaire à la position 1.", "Le champ «semiActiveRetentionPeriod» est requis pour l'exemplaire à la position 0.", "Le champ «code» est requis pour l'exemplaire à la position 3.", "La valeur «PRINCIPALE» au champ «copyType» de l'exemplaire à la position 3 est invalide. Seules les valeurs «P, S» sont supportées.", "Le champ «mediumTypes» est requis pour l'exemplaire à la position 0.", "Le champ «activeRetentionPeriod» est requis pour l'exemplaire à la position 0.", "Le champ «mediumTypes» est requis pour l'exemplaire à la position 2." ); } @Test public void givenEmptyMetadatasWhenPrevalidateThenInvalidStringValueError() { ValidationErrors validationErrors = new ValidationErrors(); givenCopyRetentionRule(copyRetentionRules).code(String.valueOf(1)).addField("copyType", "") .addField("inactiveDisposalType", "") .addField("mediumTypes", "").addField("activeRetentionPeriod", "").addField("contentTypesComment", "") .addField("semiActiveRetentionPeriod", ""); givenDocumentTypes(documentTypes).code("emailDocumentType").addField("archivisticStatus", ""); retentionRuleExtension.prevalidate(new PrevalidationParams(validationErrors, importData)); assertThat(extractingSimpleCodeAndParameters(validationErrors, "index", "field", "value", "acceptedValues")).containsOnly( tuple("RetentionRuleImportExtension_invalidCopyRuleEnumField", "0", "copyType", "", "P, S"), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "0", "mediumTypes", null, null), tuple("RetentionRuleImportExtension_invalidDocumentTypeEnumField", "0", "archivisticStatus", "", "a, s, d, v"), tuple("RetentionRuleImportExtension_requiredCopyRuleField", "0", "activeRetentionPeriod", null, null), tuple("RetentionRuleImportExtension_invalidCopyRuleEnumField", "0", "inactiveDisposalType", "", "T, D, C") ); assertThat(frenchMessages(validationErrors)).containsOnly( "La valeur «» au champ «archivisticStatus» du type de document à la position 0 est invalide. Seules les valeurs «a, s, d, v» sont supportées.", "Le champ «mediumTypes» est requis pour l'exemplaire à la position 0.", "La valeur «» au champ «copyType» de l'exemplaire à la position 0 est invalide. Seules les valeurs «P, S» sont supportées.", "Le champ «activeRetentionPeriod» est requis pour l'exemplaire à la position 0.", "La valeur «» au champ «inactiveDisposalType» de l'exemplaire à la position 0 est invalide. Seules les valeurs «T, D, C» sont supportées." ); } //---------------------------- private class StructureMapBuilder { private Map<String, String> fields = new HashMap<>(); public Map<String, String> build() { return fields; } public StructureMapBuilder addField(String key, String value) { fields.put(key, value); return this; } public StructureMapBuilder code(String code) { fields.put("code", code); return this; } } private StructureMapBuilder givenCopyRetentionRule(List<Object> copyRetentionRule) { StructureMapBuilder copyRetentionRuleMapBuilder = new StructureMapBuilder(); copyRetentionRule.add(copyRetentionRuleMapBuilder.build()); return copyRetentionRuleMapBuilder; } private StructureMapBuilder givenDocumentTypes(List<Object> documentTypes) { StructureMapBuilder documentTypeDetailMapBuilder = new StructureMapBuilder(); documentTypes.add(documentTypeDetailMapBuilder.build()); return documentTypeDetailMapBuilder; } }