package com.constellio.app.modules.rm.extensions; import static com.constellio.model.frameworks.validation.Validator.METADATA_CODE; import static org.assertj.core.api.Assertions.assertThat; import java.util.List; import org.joda.time.LocalDate; import org.junit.Before; import org.junit.Test; import com.constellio.app.modules.rm.RMConfigs; import com.constellio.app.modules.rm.RMTestRecords; import com.constellio.app.modules.rm.model.enums.CopyType; import com.constellio.app.modules.rm.model.enums.FolderStatus; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.services.decommissioning.DecommissioningService; import com.constellio.app.modules.rm.wrappers.Folder; import com.constellio.app.modules.rm.wrappers.RetentionRule; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.frameworks.validation.ValidationError; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.records.RecordServicesException.ValidationException; import com.constellio.model.services.search.SearchServices; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.setups.Users; public class RMFolderExtensionAcceptanceTest extends ConstellioTest { Users users = new Users(); DecommissioningService service; RMSchemasRecordsServices rm; RMTestRecords records = new RMTestRecords(zeCollection); RecordServices recordServices; SearchServices searchServices; RetentionRule ruleResponsible_withResponsible; RetentionRule ruleUnits_withAdministrativeUnitsAndAdminUnits10_20; RetentionRule ruleBoth_withResponsibleAndAdministrativeUnitsAndAdminUnits10_20; User bobInAdminUnit10AndOthers, aliceInNoAdminUnit, edouardInSubAdminUnit10AndOthers; Folder folderWithRuleUnitsAndAdminUnit10_WithCreatorInAdminUnit10AndOthers; Folder folderWithRuleResponsible_WithCreatorInNoAdminUnit; Folder folderWithRuleBoth_WithCreatorInNoAdminUnit; Folder folderWithRuleBoth_WithCreatorInAdminUnit10AndOthers; Folder folderWithRuleBoth_WithCreatorInSubAdminUnit10AndOthers; @Before public void setUp() throws Exception { prepareSystem( withZeCollection().withConstellioRMModule().withAllTestUsers().withRMTest(records) .withFoldersAndContainersOfEveryStatus().withAllTestUsers() ); rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory()); service = new DecommissioningService(zeCollection, getAppLayerFactory()); recordServices = getModelLayerFactory().newRecordServices(); searchServices = getModelLayerFactory().newSearchServices(); users.setUp(getModelLayerFactory().newUserServices()); } @Test public void givenNewlyCreatedFolderPermissionStatusIsSetToArchivisticStatus() throws Exception { Folder folder = saveAndReloadFolder(getTestFolder()); assertThat(folder.getPermissionStatus()).isEqualTo(FolderStatus.ACTIVE); folder = saveAndReloadFolder(getTestFolder().setActualTransferDate(aDate())); assertThat(folder.getPermissionStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); folder = saveAndReloadFolder(getTestFolder().setActualDepositDate(aDate())); assertThat(folder.getPermissionStatus()).isEqualTo(FolderStatus.INACTIVE_DEPOSITED); folder = saveAndReloadFolder(getTestFolder().setActualDestructionDate(aDate())); assertThat(folder.getPermissionStatus()).isEqualTo(FolderStatus.INACTIVE_DESTROYED); } @Test public void givenUpdatedFolderWhenTheArchivisticStatusChangesThenChangeThePermissionStatus() throws Exception { Folder folder = saveAndReloadFolder(getTestFolder()); folder = saveAndReloadFolder(folder.setActualTransferDate(aDate())); assertThat(folder.getPermissionStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); } @Test public void givenUpdatedFolderWhenTheArchivisticStatusDoesNotChangeThenKeepThePermissionStatus() throws Exception { Folder folder = saveAndReloadFolder(getTestFolder()); // DecommissioningList is approved folder = saveAndReloadFolder(folder.setPermissionStatus(FolderStatus.SEMI_ACTIVE)); assertThat(folder.getPermissionStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); // Folder is edited afterwards folder = saveAndReloadFolder(folder.setTitle("modified")); assertThat(folder.getPermissionStatus()).isEqualTo(FolderStatus.SEMI_ACTIVE); } public Folder getTestFolder() { return newFolder("Test").setOpenDate(aDate()).setRetentionRuleEntered(records.getRule1()) .setAdministrativeUnitEntered(records.getUnit10a()); } @Test public void givenOpenHolderWhenSaveFolderThenStatusEnteredIsCorrectlySet() throws Exception { givenConfig(RMConfigs.OPEN_HOLDER, true); initTestData(true); folderWithRuleUnitsAndAdminUnit10_WithCreatorInAdminUnit10AndOthers = saveAndReloadFolder( folderWithRuleUnitsAndAdminUnit10_WithCreatorInAdminUnit10AndOthers); assertThatFolderIsPrincipalCopy(folderWithRuleUnitsAndAdminUnit10_WithCreatorInAdminUnit10AndOthers); try { saveAndReloadFolder( folderWithRuleResponsible_WithCreatorInNoAdminUnit); } catch (ValidationException e) { assertErrorIsOnCopyStatus(e); } try { saveAndReloadFolder(folderWithRuleBoth_WithCreatorInNoAdminUnit); } catch (ValidationException e) { assertErrorIsOnCopyStatus(e); } folderWithRuleBoth_WithCreatorInAdminUnit10AndOthers = saveAndReloadFolder( folderWithRuleBoth_WithCreatorInAdminUnit10AndOthers); assertThatFolderIsPrincipalCopy(folderWithRuleBoth_WithCreatorInAdminUnit10AndOthers); folderWithRuleBoth_WithCreatorInSubAdminUnit10AndOthers = saveAndReloadFolder( folderWithRuleBoth_WithCreatorInSubAdminUnit10AndOthers); assertThatFolderIsPrincipalCopy(folderWithRuleBoth_WithCreatorInSubAdminUnit10AndOthers); } @Test public void givenOpenHolderNotActivatedWhenSaveFolderThenOldBehaviour() throws Exception { givenConfig(RMConfigs.OPEN_HOLDER, false); initTestData(false); folderWithRuleUnitsAndAdminUnit10_WithCreatorInAdminUnit10AndOthers = saveAndReloadFolder( folderWithRuleUnitsAndAdminUnit10_WithCreatorInAdminUnit10AndOthers); assertThatFolderIsPrincipalCopy(folderWithRuleUnitsAndAdminUnit10_WithCreatorInAdminUnit10AndOthers); try { saveAndReloadFolder(folderWithRuleResponsible_WithCreatorInNoAdminUnit); } catch (ValidationException e) { assertErrorIsOnCopyStatus(e); } } @Test public void givenFolderWithParentAndEnteredFieldsThenEnteredFieldsDeleted() throws Exception { Folder folder = newFolder("Test").setOpenDate(aDate()).setRetentionRuleEntered(records.getRule1()) .setAdministrativeUnitEntered(records.getUnit10a()).setCategoryEntered(records.categoryId_X13) .setParentFolder(records.folder_A06).setCopyStatusEntered(CopyType.PRINCIPAL); recordServices.add(folder); assertThat(folder.getAdministrativeUnitEntered()).isNull(); assertThat(folder.getCategoryEntered()).isNull(); assertThat(folder.getRetentionRuleEntered()).isNull(); assertThat(folder.getCopyStatusEntered()).isNull(); folder.setOpenDate(aDate()).setRetentionRuleEntered(records.getRule1()) .setAdministrativeUnitEntered(records.getUnit10a()).setCategoryEntered(records.categoryId_X13) .setParentFolder(records.folder_A06).setCopyStatusEntered(CopyType.PRINCIPAL); recordServices.update(folder); assertThat(folder.getAdministrativeUnitEntered()).isNull(); assertThat(folder.getCategoryEntered()).isNull(); assertThat(folder.getRetentionRuleEntered()).isNull(); assertThat(folder.getCopyStatusEntered()).isNull(); } private void assertErrorIsOnCopyStatus(ValidationException e) { List<ValidationError> errors = e.getErrors() .getValidationErrors(); assertThat(errors.size()).isEqualTo(1); assertThat((String) errors.get(0).getParameters().get(METADATA_CODE)).endsWith("_" + Folder.COPY_STATUS); } private void assertThatFolderIsPrincipalCopy(Folder folder) { assertThat(folder.getCopyStatus()).isEqualTo(CopyType.PRINCIPAL); } private void initTestData(boolean openHolderActive) throws RecordServicesException, InterruptedException { ruleResponsible_withResponsible = records.getRule2(); ruleUnits_withAdministrativeUnitsAndAdminUnits10_20 = records.getRule1(); ruleBoth_withResponsibleAndAdministrativeUnitsAndAdminUnits10_20 = records.getRule3(); if (openHolderActive) { recordServices.add(ruleBoth_withResponsibleAndAdministrativeUnitsAndAdminUnits10_20 .setAdministrativeUnits(ruleUnits_withAdministrativeUnitsAndAdminUnits10_20.getAdministrativeUnits()) .getWrappedRecord()); } waitForBatchProcess(); bobInAdminUnit10AndOthers = users.bobIn(zeCollection); aliceInNoAdminUnit = users.aliceIn(zeCollection); edouardInSubAdminUnit10AndOthers = users.edouardIn(zeCollection); folderWithRuleUnitsAndAdminUnit10_WithCreatorInAdminUnit10AndOthers = (Folder) newFolder("1") .setRetentionRuleEntered(ruleUnits_withAdministrativeUnitsAndAdminUnits10_20).setCreatedBy( bobInAdminUnit10AndOthers.getId()); folderWithRuleResponsible_WithCreatorInNoAdminUnit = (Folder) newFolder("2") .setRetentionRuleEntered(ruleResponsible_withResponsible).setCreatedBy( aliceInNoAdminUnit.getId()); folderWithRuleBoth_WithCreatorInNoAdminUnit = (Folder) newFolder("3") .setRetentionRuleEntered(ruleBoth_withResponsibleAndAdministrativeUnitsAndAdminUnits10_20).setCreatedBy( aliceInNoAdminUnit.getId()); folderWithRuleBoth_WithCreatorInAdminUnit10AndOthers = (Folder) newFolder("4") .setRetentionRuleEntered(ruleBoth_withResponsibleAndAdministrativeUnitsAndAdminUnits10_20).setCreatedBy( bobInAdminUnit10AndOthers.getId()); folderWithRuleBoth_WithCreatorInSubAdminUnit10AndOthers = (Folder) newFolder("5") .setRetentionRuleEntered(ruleBoth_withResponsibleAndAdministrativeUnitsAndAdminUnits10_20).setCreatedBy( edouardInSubAdminUnit10AndOthers.getId()); } private Folder saveAndReloadFolder(Folder folder) throws RecordServicesException { recordServices.add(folder.getWrappedRecord()); return rm.getFolder(folder.getId()); } private Folder newFolder(String title) { return rm.newFolder().setTitle(title).setOpenDate(LocalDate.now()) .setAdministrativeUnitEntered(records.unitId_10a) .setCategoryEntered(records.categoryId_X110); } }