package com.constellio.app.modules.rm.services.decommissioning; import static com.constellio.app.modules.rm.model.enums.DecommissioningType.DEPOSIT; import static com.constellio.app.modules.rm.model.enums.DecommissioningType.TRANSFERT_TO_SEMI_ACTIVE; 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.services.RMSchemasRecordsServices; import com.constellio.app.modules.rm.services.decommissioning.DecommissioningSearchConditionFactory.ContainerSearchParameters; import com.constellio.model.services.records.reindexing.ReindexationMode; import com.constellio.model.services.records.reindexing.ReindexingServices; import com.constellio.model.services.search.query.logical.LogicalSearchQuery; import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition; import com.constellio.sdk.tests.ConstellioTest; public class DecommissioningSearchConditionFactoryAcceptTest extends ConstellioTest { RMSchemasRecordsServices rm; RMTestRecords records = new RMTestRecords(zeCollection); DecommissioningSearchConditionFactory factory; ContainerSearchParameters params; @Before public void setUp() throws Exception { givenDisabledAfterTestValidations(); prepareSystem( withZeCollection().withConstellioRMModule().withAllTestUsers().withRMTest(records) .withFoldersAndContainersOfEveryStatus().withDocumentsDecommissioningList() ); rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory()); factory = new DecommissioningSearchConditionFactory(zeCollection, getAppLayerFactory()); } @Test public void whenSearchingWithoutClosingDateAndWithFixedPeriodThenObtainsValidResults() throws Exception { givenActualTime(); assertThatResultsOf(factory.withoutClosingDateAndWithFixedPeriod(records.unitId_10)).isEmpty(); assertThatResultsOf(factory.withoutClosingDateAndWithFixedPeriod(records.unitId_10a)) .containsOnlyOnce(records.folder_A01, records.folder_A02, records.folder_A03); givenTimeIs(new LocalDate(2000, 11, 5)); assertThatResultsOf(factory.withoutClosingDateAndWithFixedPeriod(records.unitId_10a)) .containsOnlyOnce(records.folder_A01, records.folder_A02, records.folder_A03); givenTimeIs(new LocalDate(2000, 11, 4)); assertThatResultsOf(factory.withoutClosingDateAndWithFixedPeriod(records.unitId_10a)) .containsOnlyOnce(records.folder_A01, records.folder_A02); givenActualTime(); assertThatResultsOf(factory.withoutClosingDateAndWithFixedPeriod(records.unitId_30c)) .containsOnlyOnce(records.folder_C01); } @Test public void whenSearchingWithoutClosingDateAndWith888PeriodThenObtainsValidResults() throws Exception { givenActualTime(); assertThatResultsOf(factory.withoutClosingDateAndWith888Period(records.unitId_10a)) .containsOnlyOnce(records.folder_A04, records.folder_A05, records.folder_A06); givenTimeIs(new LocalDate(2000, 11, 5)); assertThatResultsOf(factory.withoutClosingDateAndWith888Period(records.unitId_10a)) .containsOnlyOnce(records.folder_A04, records.folder_A05, records.folder_A06); givenTimeIs(new LocalDate(2000, 11, 04)); assertThatResultsOf(factory.withoutClosingDateAndWith888Period(records.unitId_10a)) .containsOnlyOnce(records.folder_A04, records.folder_A05); givenActualTime(); assertThatResultsOf(factory.withoutClosingDateAndWith888Period(records.unitId_30c)) .containsOnlyOnce(records.folder_C02); } @Test public void whenSearchingWithoutClosingDateAndWith999PeriodThenObtainsValidResults() throws Exception { givenActualTime(); assertThatResultsOf(factory.withoutClosingDateAndWith999Period(records.unitId_10a)) .containsOnlyOnce(records.folder_A07, records.folder_A08, records.folder_A09); givenTimeIs(new LocalDate(2000, 11, 05)); assertThatResultsOf(factory.withoutClosingDateAndWith999Period(records.unitId_10a)) .containsOnlyOnce(records.folder_A07, records.folder_A08, records.folder_A09); givenTimeIs(new LocalDate(2000, 11, 04)); assertThatResultsOf(factory.withoutClosingDateAndWith999Period(records.unitId_10a)) .containsOnlyOnce(records.folder_A07, records.folder_A08); givenActualTime(); assertThatResultsOf(factory.withoutClosingDateAndWith999Period(records.unitId_30c)) .containsOnlyOnce(records.folder_C03); } @Test public void whenSearchingActiveToDepositThenObtainsValidResults() throws Exception { givenActualTime(); assertThatResultsOf(factory.activeToDeposit(records.unitId_10a)) .contains(records.folder_A(10, 12)).contains(records.folder_A(16, 21)).contains(records.folder_A(25, 27)) .hasSize(12); givenTimeIs(new LocalDate(2009, 10, 31)); assertThatResultsOf(factory.activeToDeposit(records.unitId_10a)) .contains(records.folder_A(10, 12)).contains(records.folder_A(16, 21)).contains(records.folder_A(25, 27)) .hasSize(12); givenTimeIs(new LocalDate(2007, 10, 31)); assertThatResultsOf(factory.activeToDeposit(records.unitId_10a)) .containsOnlyOnce(records.folder_A16, records.folder_A17, records.folder_A19, records.folder_A20, records.folder_A21, records.folder_A25, records.folder_A26, records.folder_A27); givenTimeIs(new LocalDate(2007, 10, 30)); assertThatResultsOf(factory.activeToDeposit(records.unitId_10a)) .containsOnlyOnce(records.folder_A19, records.folder_A20, records.folder_A25, records.folder_A26); givenActualTime(); assertThatResultsOf(factory.activeToDeposit(records.unitId_30c)) .containsOnlyOnce(records.folder_C04, records.folder_C07, records.folder_C09); } @Test public void whenSearchingActiveToDestructionThenObtainsValidResults() throws Exception { givenActualTime(); assertThatResultsOf(factory.activeToDestroy(records.unitId_10a)) .contains(records.folder_A(10, 15)).contains(records.folder_A(19, 24)).contains(records.folder_A(45, 47)) .hasSize(15); givenTimeIs(new LocalDate(2009, 10, 31)); assertThatResultsOf(factory.activeToDestroy(records.unitId_10a)) .contains(records.folder_A(10, 15)).contains(records.folder_A(19, 24)).contains(records.folder_A(45, 47)) .hasSize(15); givenTimeIs(new LocalDate(2004, 10, 31)); assertThatResultsOf(factory.activeToDestroy(records.unitId_10a)) .containsOnlyOnce(records.folder_A(13, 15)); givenTimeIs(new LocalDate(2004, 10, 30)); assertThatResultsOf(factory.activeToDestroy(records.unitId_10a)) .containsOnlyOnce(records.folder_A(13, 14)); givenActualTime(); assertThatResultsOf(factory.activeToDestroy(records.unitId_30c)) .containsOnlyOnce(records.folder_C04, records.folder_C05, records.folder_C06, records.folder_C07, records.folder_C08); } @Test public void whenSearchingActiveToTransferThenObtainsValidResults() throws Exception { givenActualTime(); assertThatResultsOf(factory.activeToTransferToSemiActive(records.unitId_10a)) .containsOnlyOnce(records.folder_A(10, 12)).containsOnlyOnce(records.folder_A(16, 27)); givenTimeIs(new LocalDate(2010, 11, 05)); assertThatResultsOf(factory.activeToTransferToSemiActive(records.unitId_10a)) .containsOnlyOnce(records.folder_A(10, 12)).containsOnlyOnce(records.folder_A(16, 27)); givenTimeIs(new LocalDate(2003, 10, 31)); assertThatResultsOf(factory.activeToTransferToSemiActive(records.unitId_10a)) .containsOnlyOnce(records.folder_A16, records.folder_A17, records.folder_A18, records.folder_A19, records.folder_A20, records.folder_A21); givenTimeIs(new LocalDate(2003, 10, 30)); assertThatResultsOf(factory.activeToTransferToSemiActive(records.unitId_10a)) .containsOnlyOnce(records.folder_A16, records.folder_A17, records.folder_A19, records.folder_A20); givenActualTime(); assertThatResultsOf(factory.activeToTransferToSemiActive(records.unitId_30c)) .containsOnlyOnce(records.folder_C04, records.folder_C07, records.folder_C08, records.folder_C09); } @Test public void whenSearchingSemiActiveToDepositThenObtainsValidResults() throws Exception { givenActualTime(); assertThatResultsOf(factory.semiActiveToDeposit(records.unitId_10a)) .contains(records.folder_A(42, 44)).contains(records.folder_A(48, 53)).contains(records.folder_A(57, 59)) .hasSize(12); System.out.println(records.getFolder_A44().getExpectedDepositDate()); givenTimeIs(new LocalDate(2010, 10, 31)); assertThatResultsOf(factory.semiActiveToDeposit(records.unitId_10a)) .contains(records.folder_A(42, 44)).contains(records.folder_A(48, 53)).contains(records.folder_A(57, 59)) .hasSize(12); givenTimeIs(new LocalDate(2008, 10, 31)); assertThatResultsOf(factory.semiActiveToDeposit(records.unitId_10a)) .contains(records.folder_A(51, 52)).contains(records.folder_A(57, 59)).hasSize(5); givenTimeIs(new LocalDate(2008, 10, 30)); assertThatResultsOf(factory.semiActiveToDeposit(records.unitId_10a)) .containsOnlyOnce(records.folder_A57, records.folder_A58); givenActualTime(); assertThatResultsOf(factory.semiActiveToDeposit(records.unitId_30c)) .containsOnlyOnce(records.folder_C30, records.folder_C33, records.folder_C35); } @Test public void whenSearchingSemiActiveToDestructionThenObtainsValidResults() throws Exception { givenActualTime(); assertThatResultsOf(factory.semiActiveToDestroy(records.unitId_10a)) .contains(records.folder_A(42, 44)).contains(records.folder_A(51, 56)).hasSize(9); givenTimeIs(new LocalDate(2010, 11, 5)); assertThatResultsOf(factory.semiActiveToDestroy(records.unitId_10a)) .contains(records.folder_A(42, 44)).contains(records.folder_A(51, 56)).hasSize(9); givenTimeIs(new LocalDate(2007, 10, 31)); assertThatResultsOf(factory.semiActiveToDestroy(records.unitId_10a)) .contains(records.folder_A(54, 55)).hasSize(2); givenTimeIs(new LocalDate(2007, 10, 30)); assertThatResultsOf(factory.semiActiveToDestroy(records.unitId_10a)).isEmpty(); givenActualTime(); assertThatResultsOf(factory.semiActiveToDestroy(records.unitId_30c)) .containsOnlyOnce(records.folder_C30, records.folder_C33, records.folder_C34); } @Test public void whenSearchingDocumentSemiActiveToDestructionThenObtainsValidResults() throws Exception { givenConfig(RMConfigs.DOCUMENT_RETENTION_RULES, true); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenDisabledAfterTestValidations(); waitForBatchProcess(); reindexIfRequired(); givenTimeIs(new LocalDate(2100, 11, 5)); assertThatResultsOf(factory.documentSemiActiveToDestroy(records.unitId_10a)) .contains(records.decommissionnableProcesInFolder_A(42, 44)) .contains(records.decommissionnableProcesInFolder_A(48, 50)) .contains(records.decommissionnableProcesInFolder_A(54, 59)).hasSize(24); givenTimeIs(new LocalDate(2007, 10, 31)); assertThatResultsOf(factory.documentSemiActiveToDestroy(records.unitId_10a)) .contains(records.decommissionnableProcesInFolder_A(48, 50)).hasSize(6); givenTimeIs(new LocalDate(2007, 10, 30)); assertThatResultsOf(factory.documentSemiActiveToDestroy(records.unitId_10a)) .contains(records.decommissionnableProcesInFolder_A(48, 49)).hasSize(4); } @Test public void whenSearchingDocumentActiveToDestructionThenObtainsValidResults() throws Exception { givenConfig(RMConfigs.DOCUMENT_RETENTION_RULES, true); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenDisabledAfterTestValidations(); assertThat(getAppLayerFactory().getSystemGlobalConfigsManager().isReindexingRequired()).isTrue(); //TODO Gabriel : Le changement de la config CALCULATED_CLOSING_DATE devrait demander une réindexation plutôt que partir un traîtement en lot reindexIfRequired(); waitForBatchProcess(); givenTimeIs(new LocalDate(2100, 11, 5)); assertThat(records.getFolder_A07().getExpectedDepositDate()).isEqualTo(date(2007, 10, 31)); assertThatResultsOf(factory.documentActiveToDestroy(records.unitId_10a)) .contains(records.decommissionnableProcesInFolder_A(1, 6)) .contains(records.decommissionnableProcesInFolder_A(10, 12)) .contains(records.decommissionnableProcesInFolder_A(16, 18)) .contains(records.decommissionnableProcesInFolder_A(22, 27)).hasSize(36); givenTimeIs(new LocalDate(2005, 10, 31)); assertThatResultsOf(factory.documentActiveToDestroy(records.unitId_10a)) .contains(records.decommissionnableProcesInFolder_A(4, 6)) .contains(records.decommissionnableProcesInFolder_A(10, 12)) .contains(records.decommissionnableProcesInFolder_A(16, 18)) .contains(records.decommissionnableProcesInFolder_A(22, 23)) .contains(records.decommissionnableProcesInFolder_A(25, 26)).hasSize(26); givenTimeIs(new LocalDate(2005, 10, 30)); assertThatResultsOf(factory.documentActiveToDestroy(records.unitId_10a)) .contains(records.decommissionnableProcesInFolder_A(10, 11)) .contains(records.decommissionnableProcesInFolder_A(16, 17)).hasSize(8); } @Test public void whenSearchingDocumentSemiActiveToConservationThenObtainsValidResults() throws Exception { givenConfig(RMConfigs.DOCUMENT_RETENTION_RULES, true); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenDisabledAfterTestValidations(); waitForBatchProcess(); reindexIfRequired(); givenTimeIs(new LocalDate(2100, 11, 5)); assertThatResultsOf(factory.documentSemiActiveToDeposit(records.unitId_10a)) .contains(records.decommissionnableContractsInFolder_A(42, 44)) .contains(records.decommissionnableContractsInFolder_A(48, 50)) .contains(records.decommissionnableContractsInFolder_A(54, 59)).hasSize(24); givenTimeIs(new LocalDate(2005, 10, 31)); assertThatResultsOf(factory.documentSemiActiveToDeposit(records.unitId_10a)) .contains(records.decommissionnableContractsInFolder_A(48, 50)).hasSize(6); givenTimeIs(new LocalDate(2005, 10, 30)); assertThatResultsOf(factory.documentSemiActiveToDeposit(records.unitId_10a)) .contains(records.decommissionnableContractsInFolder_A(48, 49)).hasSize(4); } @Test public void whenSearchingDocumentActiveToConservationThenObtainsValidResults() throws Exception { givenConfig(RMConfigs.DOCUMENT_RETENTION_RULES, true); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); assertThat(getAppLayerFactory().getSystemGlobalConfigsManager().isReindexingRequired()).isTrue(); //TODO Gabriel : Le changement de la config CALCULATED_CLOSING_DATE devrait demander une réindexation plutôt que partir un traîtement en lot reindexIfRequired(); waitForBatchProcess(); givenTimeIs(new LocalDate(2100, 11, 5)); assertThatResultsOf(factory.documentActiveToDeposit(records.unitId_10a)) .contains(records.decommissionnableContractsInFolder_A(1, 6)) .contains(records.decommissionnableContractsInFolder_A(10, 12)) .contains(records.decommissionnableContractsInFolder_A(16, 18)) .contains(records.decommissionnableContractsInFolder_A(22, 27)).hasSize(36); givenTimeIs(new LocalDate(2005, 10, 31)); assertThatResultsOf(factory.documentActiveToDeposit(records.unitId_10a)) .contains(records.decommissionnableContractsInFolder_A(4, 6)) .contains(records.decommissionnableContractsInFolder_A(10, 12)) .contains(records.decommissionnableContractsInFolder_A(16, 18)) .contains(records.decommissionnableContractsInFolder_A(22, 27)).hasSize(30); givenTimeIs(new LocalDate(2005, 10, 30)); assertThatResultsOf(factory.documentActiveToDeposit(records.unitId_10a)) .contains(records.decommissionnableContractsInFolder_A(4, 6)) .contains(records.decommissionnableContractsInFolder_A(10, 12)) .contains(records.decommissionnableContractsInFolder_A(16, 18)) .contains(records.decommissionnableContractsInFolder_A(22, 23)) .contains(records.decommissionnableContractsInFolder_A(25, 26)).hasSize(26); } @Test public void whenSearchingDocumentActiveToTransferThenObtainsValidResults() throws Exception { givenConfig(RMConfigs.DOCUMENT_RETENTION_RULES, true); givenConfig(RMConfigs.CALCULATED_CLOSING_DATE, true); givenDisabledAfterTestValidations(); assertThat(getAppLayerFactory().getSystemGlobalConfigsManager().isReindexingRequired()).isTrue(); //TODO Gabriel : Le changement de la config CALCULATED_CLOSING_DATE devrait demander une réindexation plutôt que partir un traîtement en lot reindexIfRequired(); waitForBatchProcess(); givenTimeIs(new LocalDate(2100, 11, 5)); assertThatResultsOf(factory.documentTransfer(records.unitId_10a)) .contains(records.decommissionnableProcesInFolder_A(1, 3)) .contains(records.decommissionnableProcesInFolder_A(10, 12)) .contains(records.decommissionnableProcesInFolder_A(22, 27)).hasSize(24); givenTimeIs(new LocalDate(2005, 10, 31)); assertThatResultsOf(factory.documentTransfer(records.unitId_10a)) .contains(records.decommissionnableProcesInFolder_A(10, 12)) .contains(records.decommissionnableProcesInFolder_A(22, 27)).hasSize(18); } @Test public void givenAdminWhenSearchingContainersThenValidResults() throws Exception { assertThatContainersCountWith(unit10().setWithStorage(true).setType(TRANSFERT_TO_SEMI_ACTIVE)).isEqualTo(5); assertThatContainersCountWith(unit10_filingA().setWithStorage(true).setType(TRANSFERT_TO_SEMI_ACTIVE)).isEqualTo(3); assertThatContainersListWith(unit10_filingA().setWithStorage(true).setType(TRANSFERT_TO_SEMI_ACTIVE)).containsOnly( records.containerId_bac11, records.containerId_bac12, records.containerId_bac13); assertThatContainersCountWith(unit11().setWithStorage(true).setType(TRANSFERT_TO_SEMI_ACTIVE)).isEqualTo(1); assertThatContainersCountWith(unit11_filingB().setWithStorage(true).setType(TRANSFERT_TO_SEMI_ACTIVE)).isEqualTo(1); assertThatContainersListWith(unit11_filingB().setWithStorage(true).setType(TRANSFERT_TO_SEMI_ACTIVE)).containsOnly( records.containerId_bac09); assertThatContainersCountWith(unit10().setWithStorage(false).setType(TRANSFERT_TO_SEMI_ACTIVE)).isEqualTo(3); assertThatContainersCountWith(unit10_filingA().setWithStorage(false).setType(TRANSFERT_TO_SEMI_ACTIVE)) .isEqualTo(3); assertThatContainersListWith(unit10_filingA().setWithStorage(false).setType(TRANSFERT_TO_SEMI_ACTIVE)).containsOnly( records.containerId_bac10, records.containerId_bac14, records.containerId_bac15); assertThatContainersCountWith(unit10().setWithStorage(true).setType(DEPOSIT)).isEqualTo(3); assertThatContainersCountWith(unit10_filingA().setWithStorage(true).setType(DEPOSIT)).isEqualTo(2); assertThatContainersListWith(unit10_filingA().setWithStorage(true).setType(DEPOSIT)).containsOnly( records.containerId_bac04, records.containerId_bac05); assertThatContainersCountWith(unit10().setWithStorage(false).setType(DEPOSIT)).isEqualTo(3); assertThatContainersCountWith(unit12().setWithStorage(false).setType(DEPOSIT)).isEqualTo(1); assertThatContainersCountWith(unit12_filingB().setWithStorage(false).setType(DEPOSIT)).isEqualTo(1); assertThatContainersListWith(unit12_filingB().setWithStorage(false).setType(DEPOSIT)).containsOnly( records.containerId_bac02); } @Test public void givenAdminWhenSearchingSubAdministrativeUnitThenOk() throws Exception { assertThat(factory.getVisibleSubAdministrativeUnitCount(records.unitId_10)).isEqualTo(3); } public org.assertj.core.api.LongAssert assertThatContainersCountWith(ContainerSearchParameters params) { long containers = factory.getVisibleContainersCount(params); return assertThat(containers); } public org.assertj.core.api.ListAssert<String> assertThatContainersListWith(ContainerSearchParameters params) { LogicalSearchCondition condition = factory.getVisibleContainersCondition(params); List<String> results = getModelLayerFactory().newSearchServices().searchRecordIds(new LogicalSearchQuery(condition)); return assertThat(results); } public org.assertj.core.api.ListAssert<String> assertThatResultsOf(LogicalSearchCondition condition) { List<String> results = getModelLayerFactory().newSearchServices().searchRecordIds(new LogicalSearchQuery(condition)); return assertThat(results); } private ContainerSearchParameters params() { return params = new ContainerSearchParameters(); } private ContainerSearchParameters unit10() { return params().setUserId(records.getAdmin().getId()).setAdminUnitId(records.unitId_10); } private ContainerSearchParameters unit10_filingA() { return params().setUserId(records.getAdmin().getId()).setAdminUnitId(records.unitId_10a); } private ContainerSearchParameters unit11() { return params().setUserId(records.getAdmin().getId()).setAdminUnitId(records.unitId_11); } private ContainerSearchParameters unit11_filingB() { return params().setUserId(records.getAdmin().getId()).setAdminUnitId(records.unitId_11b); } private ContainerSearchParameters unit12() { return params().setUserId(records.getAdmin().getId()).setAdminUnitId(records.unitId_12); } private ContainerSearchParameters unit12_filingB() { return params().setUserId(records.getAdmin().getId()).setAdminUnitId(records.unitId_12b); } }