package com.constellio.app.services.records;
import static com.constellio.app.services.records.SystemCheckManager.BROKEN_REFERENCES_METRIC;
import static com.constellio.app.services.records.SystemCheckManager.CHECKED_REFERENCES_METRIC;
import static com.constellio.app.services.records.SystemCheckManagerAcceptanceTestResources.expectedMessage1;
import static com.constellio.app.services.records.SystemCheckManagerAcceptanceTestResources.expectedMessage2;
import static com.constellio.app.services.records.SystemCheckManagerAcceptanceTestResources.expectedMessage3;
import static com.constellio.app.services.records.SystemCheckManagerAcceptanceTestResources.expectedMessage4;
import static com.constellio.app.services.records.SystemCheckManagerAcceptanceTestResources.expectedMessage5;
import static com.constellio.app.services.records.SystemCheckManagerAcceptanceTestResources.expectedMessage6;
import static com.constellio.model.entities.schemas.Schemas.TITLE;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.ALL;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import static com.constellio.sdk.tests.TestUtils.asMap;
import static com.constellio.sdk.tests.TestUtils.extractingSimpleCodeAndParameters;
import static com.constellio.sdk.tests.TestUtils.frenchMessages;
import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsMultivalue;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;
import static org.joda.time.LocalDate.now;
import java.util.ArrayList;
import java.util.List;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.common.SolrInputDocument;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import com.constellio.app.modules.es.model.connectors.smb.ConnectorSmbFolder;
import com.constellio.app.modules.es.services.ESSchemasRecordsServices;
import com.constellio.app.modules.rm.RMConfigs;
import com.constellio.app.modules.rm.RMTestRecords;
import com.constellio.app.modules.rm.model.enums.AllowModificationOfArchivisticStatusAndExpectedDatesChoice;
import com.constellio.app.modules.rm.model.enums.FolderStatus;
import com.constellio.app.modules.rm.services.RMSchemasRecordsServices;
import com.constellio.app.modules.rm.wrappers.Category;
import com.constellio.app.modules.rm.wrappers.DecommissioningList;
import com.constellio.app.modules.rm.wrappers.Folder;
import com.constellio.app.modules.rm.wrappers.structures.DecomListFolderDetail;
import com.constellio.app.modules.robots.model.wrappers.Robot;
import com.constellio.app.modules.robots.services.RobotSchemaRecordServices;
import com.constellio.app.ui.pages.search.criteria.CriterionBuilder;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.SchemasRecordsServices;
import com.constellio.model.services.schemas.MetadataSchemaTypesAlteration;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.users.UserServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.TestRecord;
import com.constellio.sdk.tests.schemas.TestsSchemasSetup;
import com.constellio.sdk.tests.schemas.TestsSchemasSetup.AnotherSchemaMetadatas;
import com.constellio.sdk.tests.schemas.TestsSchemasSetup.ZeSchemaMetadatas;
public class SystemCheckManagerAcceptanceTest extends ConstellioTest {
TestsSchemasSetup setup = new TestsSchemasSetup(zeCollection);
ZeSchemaMetadatas zeSchema = setup.new ZeSchemaMetadatas();
AnotherSchemaMetadatas anotherSchema = setup.new AnotherSchemaMetadatas();
RMTestRecords records = new RMTestRecords(zeCollection);
@Before
public void setUp()
throws Exception {
givenTimeIs(new LocalDate(2014, 12, 12));
}
@Test
public void givenSystemWithBrokenSingleValueLinksWhenSystemCheckingThenFindThoseLinks()
throws Exception {
defineSchemasManager().using(setup.withAReferenceFromAnotherSchemaToZeSchema());
RecordServices recordServices = getModelLayerFactory().newRecordServices();
SystemCheckManager systemCheckManager = new SystemCheckManager(getAppLayerFactory());
Transaction transaction = new Transaction();
transaction.add(new TestRecord(zeSchema, "zeId").set(TITLE, "1"));
transaction.add(new TestRecord(anotherSchema, "recordWithProblem1").set(TITLE, "2")
.set(anotherSchema.referenceFromAnotherSchemaToZeSchema(), "zeId"));
transaction.add(new TestRecord(anotherSchema, "recordWithoutProblem").set(TITLE, "3")
.set(anotherSchema.referenceFromAnotherSchemaToZeSchema(), "zeId"));
transaction.add(new TestRecord(anotherSchema, "recordWithProblem2").set(TITLE, "4")
.set(anotherSchema.referenceFromAnotherSchemaToZeSchema(), "zeId"));
recordServices.execute(transaction);
SolrClient solrClient = getDataLayerFactory().newRecordDao().getBigVaultServer().getNestedSolrServer();
SolrInputDocument modificationBypassingIntegrityValidations = new SolrInputDocument();
modificationBypassingIntegrityValidations.setField("id", "recordWithProblem1");
modificationBypassingIntegrityValidations.setField("_version_", "1");
modificationBypassingIntegrityValidations.setField("referenceFromAnotherSchemaToZeSchemaId_s", asMap("set", "bad"));
solrClient.add(modificationBypassingIntegrityValidations);
modificationBypassingIntegrityValidations = new SolrInputDocument();
modificationBypassingIntegrityValidations.setField("id", "recordWithProblem2");
modificationBypassingIntegrityValidations.setField("_version_", "1");
modificationBypassingIntegrityValidations
.setField("referenceFromAnotherSchemaToZeSchemaId_s", asMap("set", "notGood"));
solrClient.add(modificationBypassingIntegrityValidations);
solrClient.commit();
//rams.put("metadataCode", referenceMetadata.getCode());
//params.put("record", recordId);
//params.put("brokenLinkRecordId
SystemCheckResults systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(systemCheckResults.getMetric(BROKEN_REFERENCES_METRIC)).isEqualTo(2);
assertThat(systemCheckResults.getMetric(CHECKED_REFERENCES_METRIC)).isEqualTo(3);
assertThat(systemCheckResults.repairedRecords.size()).isEqualTo(0);
assertThat(extractingSimpleCodeAndParameters(systemCheckResults.errors, "metadataCode", "record", "brokenLinkRecordId"))
.containsOnly(
tuple("SystemCheckResultsBuilder_brokenLink",
"anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema", "recordWithProblem1", "bad"),
tuple("SystemCheckResultsBuilder_brokenLink",
"anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema", "recordWithProblem2", "notGood")
);
assertThat(frenchMessages(systemCheckResults.errors)).containsOnly(
"La métadonnée anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema de l'enregistrement recordWithProblem1 référence un enregistrement inexistant : bad",
"La métadonnée anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema de l'enregistrement recordWithProblem2 référence un enregistrement inexistant : notGood"
);
assertThat(recordServices.getDocumentById("recordWithProblem1").get(anotherSchema.referenceFromAnotherSchemaToZeSchema()))
.isEqualTo("bad");
assertThat(recordServices.getDocumentById("recordWithProblem2").get(anotherSchema.referenceFromAnotherSchemaToZeSchema()))
.isEqualTo("notGood");
assertThat(new SystemCheckReportBuilder(systemCheckManager).build()).isEqualTo(expectedMessage1);
systemCheckResults = systemCheckManager.runSystemCheck(true);
assertThat(systemCheckResults.getMetric(BROKEN_REFERENCES_METRIC)).isEqualTo(2);
assertThat(systemCheckResults.getMetric(CHECKED_REFERENCES_METRIC)).isEqualTo(3);
assertThat(systemCheckResults.repairedRecords.size()).isEqualTo(2);
assertThat(extractingSimpleCodeAndParameters(systemCheckResults.errors, "metadataCode", "record", "brokenLinkRecordId"))
.containsOnly(
tuple("SystemCheckResultsBuilder_brokenLink",
"anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema", "recordWithProblem1", "bad"),
tuple("SystemCheckResultsBuilder_brokenLink",
"anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema", "recordWithProblem2", "notGood")
);
assertThat(recordServices.getDocumentById("recordWithProblem1").get(anotherSchema.referenceFromAnotherSchemaToZeSchema()))
.isNull();
assertThat(recordServices.getDocumentById("recordWithProblem2").get(anotherSchema.referenceFromAnotherSchemaToZeSchema()))
.isNull();
assertThat(new SystemCheckReportBuilder(systemCheckManager).build()).isEqualTo(expectedMessage2);
systemCheckResults = new SystemCheckManager(getAppLayerFactory()).runSystemCheck(false);
assertThat(systemCheckResults.getMetric(BROKEN_REFERENCES_METRIC)).isEqualTo(0);
assertThat(systemCheckResults.getMetric(CHECKED_REFERENCES_METRIC)).isEqualTo(1);
assertThat(systemCheckResults.repairedRecords.size()).isEqualTo(0);
assertThat(systemCheckResults.errors.getValidationErrors()).isEmpty();
assertThat(systemCheckResults.errors.getValidationWarnings()).isEmpty();
}
@Test
public void givenSystemWithBrokenMultiValueLinksWhenSystemCheckingThenFindThoseLinks()
throws Exception {
//TODO AFTER-TEST-VALIDATION-SEQ
givenDisabledAfterTestValidations();
defineSchemasManager().using(setup.withAReferenceFromAnotherSchemaToZeSchema(whichIsMultivalue));
RecordServices recordServices = getModelLayerFactory().newRecordServices();
Transaction transaction = new Transaction();
transaction.add(new TestRecord(zeSchema, "recordA").set(TITLE, "A"));
transaction.add(new TestRecord(zeSchema, "recordB").set(TITLE, "B"));
transaction.add(new TestRecord(zeSchema, "recordC").set(TITLE, "C"));
transaction.add(new TestRecord(anotherSchema, "recordWithProblem1").set(TITLE, "2")
.set(anotherSchema.referenceFromAnotherSchemaToZeSchema(), asList("recordC", "recordA", "recordB")));
transaction.add(new TestRecord(anotherSchema, "recordWithoutProblem").set(TITLE, "3")
.set(anotherSchema.referenceFromAnotherSchemaToZeSchema(), asList("recordA", "recordB")));
transaction.add(new TestRecord(anotherSchema, "recordWithProblem2").set(TITLE, "4")
.set(anotherSchema.referenceFromAnotherSchemaToZeSchema(), asList("recordA", "recordC")));
recordServices.execute(transaction);
SolrClient solrClient = getDataLayerFactory().newRecordDao().getBigVaultServer().getNestedSolrServer();
solrClient.deleteById("recordC");
solrClient.commit();
//rams.put("metadataCode", referenceMetadata.getCode());
//params.put("record", recordId);
//params.put("brokenLinkRecordId
SystemCheckManager systemCheckManager = new SystemCheckManager(getAppLayerFactory());
SystemCheckResults systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(systemCheckResults.getMetric(BROKEN_REFERENCES_METRIC)).isEqualTo(2);
assertThat(systemCheckResults.getMetric(CHECKED_REFERENCES_METRIC)).isEqualTo(7);
assertThat(systemCheckResults.repairedRecords.size()).isEqualTo(0);
assertThat(extractingSimpleCodeAndParameters(systemCheckResults.errors, "metadataCode", "record", "brokenLinkRecordId"))
.containsOnly(
tuple("SystemCheckResultsBuilder_brokenLink",
"anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema", "recordWithProblem1",
"recordC"),
tuple("SystemCheckResultsBuilder_brokenLink",
"anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema", "recordWithProblem2", "recordC")
);
assertThat(frenchMessages(systemCheckResults.errors)).containsOnly(
"La métadonnée anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema de l'enregistrement recordWithProblem1 référence un enregistrement inexistant : recordC",
"La métadonnée anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema de l'enregistrement recordWithProblem2 référence un enregistrement inexistant : recordC"
);
assertThat(recordServices.getDocumentById("recordWithProblem1").get(anotherSchema.referenceFromAnotherSchemaToZeSchema()))
.isEqualTo(asList("recordC", "recordA", "recordB"));
assertThat(recordServices.getDocumentById("recordWithProblem2").get(anotherSchema.referenceFromAnotherSchemaToZeSchema()))
.isEqualTo(asList("recordA", "recordC"));
assertThat(new SystemCheckReportBuilder(systemCheckManager).build()).isEqualTo(expectedMessage3);
systemCheckResults = systemCheckManager.runSystemCheck(true);
assertThat(systemCheckResults.getMetric(BROKEN_REFERENCES_METRIC)).isEqualTo(2);
assertThat(systemCheckResults.getMetric(CHECKED_REFERENCES_METRIC)).isEqualTo(7);
assertThat(systemCheckResults.repairedRecords.size()).isEqualTo(2);
assertThat(extractingSimpleCodeAndParameters(systemCheckResults.errors, "metadataCode", "record", "brokenLinkRecordId"))
.containsOnly(
tuple("SystemCheckResultsBuilder_brokenLink",
"anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema", "recordWithProblem1",
"recordC"),
tuple("SystemCheckResultsBuilder_brokenLink",
"anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema", "recordWithProblem2", "recordC")
);
assertThat(recordServices.getDocumentById("recordWithProblem1").get(anotherSchema.referenceFromAnotherSchemaToZeSchema()))
.isEqualTo(asList("recordA", "recordB"));
assertThat(recordServices.getDocumentById("recordWithProblem2").get(anotherSchema.referenceFromAnotherSchemaToZeSchema()))
.isEqualTo(asList("recordA"));
assertThat(new SystemCheckReportBuilder(systemCheckManager).build()).isEqualTo(expectedMessage4);
systemCheckResults = new SystemCheckManager(getAppLayerFactory()).runSystemCheck(false);
assertThat(systemCheckResults.getMetric(BROKEN_REFERENCES_METRIC)).isEqualTo(0);
assertThat(systemCheckResults.getMetric(CHECKED_REFERENCES_METRIC)).isEqualTo(5);
assertThat(systemCheckResults.repairedRecords.size()).isEqualTo(0);
assertThat(systemCheckResults.errors.getValidationErrors()).isEmpty();
assertThat(systemCheckResults.errors.getValidationWarnings()).isEmpty();
}
@Test
public void givenSystemWithReferenceMetadatasReferencingALogicallyDeletedRecordThenRepairable()
throws Exception {
//TODO AFTER-TEST-VALIDATION-SEQ
givenDisabledAfterTestValidations();
defineSchemasManager().using(setup.withAReferenceFromAnotherSchemaToZeSchema(whichIsMultivalue));
RecordServices recordServices = getModelLayerFactory().newRecordServices();
Transaction transaction = new Transaction();
transaction.add(new TestRecord(zeSchema, "recordA").set(TITLE, "A").set(Schemas.LOGICALLY_DELETED_STATUS, true));
transaction.add(new TestRecord(zeSchema, "recordB").set(TITLE, "B"));
transaction.add(new TestRecord(zeSchema, "recordC").set(TITLE, "C"));
recordServices.execute(transaction);
getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getMetadata(anotherSchema.referenceFromAnotherSchemaToZeSchema().getCode())
.setDefaultValue(asList("recordA", "recordD", "recordC"));
}
});
//params.put("metadataCode", referenceMetadata.getCode());
//params.put("record", recordId);
//params.put("brokenLinkRecordId
SystemCheckManager systemCheckManager = new SystemCheckManager(getAppLayerFactory());
SystemCheckResults systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(systemCheckResults.getMetric(BROKEN_REFERENCES_METRIC)).isEqualTo(2);
assertThat(systemCheckResults.getMetric(CHECKED_REFERENCES_METRIC)).isEqualTo(3);
assertThat(systemCheckResults.repairedRecords.size()).isEqualTo(0);
assertThat(extractingSimpleCodeAndParameters(systemCheckResults.errors, "metadataCode", "brokenLinkRecordId"))
.containsOnly(
tuple("SystemCheckResultsBuilder_brokenLinkInDefaultValues",
"anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema", "recordA"),
tuple("SystemCheckResultsBuilder_brokenLinkInDefaultValues",
"anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema", "recordD")
);
assertThat(frenchMessages(systemCheckResults.errors)).containsOnly(
"La métadonnée anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema référence un enregistrement inexistant dans sa valeur par défaut : recordA",
"La métadonnée anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema référence un enregistrement inexistant dans sa valeur par défaut : recordD"
);
assertThat(getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection)
.getMetadata("anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema").getDefaultValue())
.isEqualTo(asList("recordA", "recordD", "recordC"));
systemCheckResults = systemCheckManager.runSystemCheck(true);
assertThat(systemCheckResults.getMetric(BROKEN_REFERENCES_METRIC)).isEqualTo(2);
assertThat(systemCheckResults.getMetric(CHECKED_REFERENCES_METRIC)).isEqualTo(3);
assertThat(systemCheckResults.repairedRecords.size()).isEqualTo(0);
assertThat(extractingSimpleCodeAndParameters(systemCheckResults.errors, "metadataCode", "brokenLinkRecordId"))
.containsOnly(
tuple("SystemCheckResultsBuilder_brokenLinkInDefaultValues",
"anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema", "recordA"),
tuple("SystemCheckResultsBuilder_brokenLinkInDefaultValues",
"anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema", "recordD")
);
assertThat(frenchMessages(systemCheckResults.errors)).containsOnly(
"La métadonnée anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema référence un enregistrement inexistant dans sa valeur par défaut : recordA",
"La métadonnée anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema référence un enregistrement inexistant dans sa valeur par défaut : recordD"
);
assertThat(getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection)
.getMetadata("anotherSchemaType_default_referenceFromAnotherSchemaToZeSchema").getDefaultValue())
.isEqualTo(asList("recordC"));
}
@Test
public void givenRecordWithInvalidMetadataThenValidationErrorMessageIsSent()
throws Exception {
prepareSystem(
withZeCollection().withConstellioRMModule().withConstellioESModule().withAllTestUsers()
.withRMTest(records).withFoldersAndContainersOfEveryStatus().withDocumentsDecommissioningList()
);
inCollection(zeCollection).setCollectionTitleTo("Collection de test");
givenDisabledAfterTestValidations();
getModelLayerFactory().getMetadataSchemasManager().modify(zeCollection, new MetadataSchemaTypesAlteration() {
@Override
public void alter(MetadataSchemaTypesBuilder types) {
types.getDefaultSchema(Folder.SCHEMA_TYPE).get("title").setInputMask("AAAA-AAAA");
}
});
SystemCheckManager systemCheckManager = new SystemCheckManager(getAppLayerFactory());
SystemCheckResults systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(frenchMessages(systemCheckResults.errors)).contains(
"La valeur «Framboise» de la métadonnée «Titre» ne respecte pas le format «AAAA-AAAA»"
);
}
@Test
public void givenAuthorizationWithInvalidTargetThenDetectedAndFixed()
throws Exception {
prepareSystem(
withZeCollection().withConstellioRMModule().withConstellioESModule().withAllTestUsers()
.withRMTest(records).withFoldersAndContainersOfEveryStatus()
);
inCollection(zeCollection).setCollectionTitleTo("Collection de test");
SchemasRecordsServices schemas = new SchemasRecordsServices(zeCollection, getModelLayerFactory());
UserServices userServices = getModelLayerFactory().newUserServices();
User dakotaInZeCollection = userServices.getUserInCollection(dakota, zeCollection);
Transaction tx = new Transaction();
tx.add(schemas.newSolrAuthorizationDetailsWithId("zeInvalidAuth").setTarget("anInvalidRecord").setRoles(asList("R")));
tx.add(dakotaInZeCollection.set(Schemas.AUTHORIZATIONS, asList("zeInvalidAuth")));
getModelLayerFactory().newRecordServices().execute(tx);
assertThat(dakotaInZeCollection.getUserAuthorizations()).containsOnly("zeInvalidAuth");
SystemCheckManager systemCheckManager = new SystemCheckManager(getAppLayerFactory());
SystemCheckResults systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(frenchMessages(systemCheckResults.errors)).isEmpty();
assertThat(systemCheckResults.getMetric("core.brokenAuths")).isEqualTo(1);
systemCheckResults = systemCheckManager.runSystemCheck(true);
assertThat(frenchMessages(systemCheckResults.errors)).isEmpty();
assertThat(systemCheckResults.getMetric("core.brokenAuths")).isEqualTo(1);
systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(frenchMessages(systemCheckResults.errors)).isEmpty();
assertThat(systemCheckResults.getMetric("core.brokenAuths")).isEqualTo(0);
getModelLayerFactory().newRecordServices().refresh(dakotaInZeCollection);
assertThat(dakotaInZeCollection.getUserAuthorizations()).isEmpty();
}
@Test
public void givenLogicallyDeletedAdministrativeUnitsAndCategoriesThenRepairRestoreThem()
throws Exception {
RMTestRecords records = new RMTestRecords(zeCollection);
prepareSystem(withZeCollection().withConstellioRMModule().withAllTestUsers().withRMTest(records));
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
RecordServices recordServices = getModelLayerFactory().newRecordServices();
recordServices.add(rm.newFolder().setTitle("My folder").setAdministrativeUnitEntered(records.unitId_20)
.setOpenDate(now()).setCategoryEntered(records.categoryId_Z100).setRetentionRuleEntered(records.ruleId_1));
for (Category category : rm.searchCategorys(ALL)) {
recordServices.update(category.set(Schemas.LOGICALLY_DELETED_STATUS.getLocalCode(), true));
}
recordServices.logicallyDelete(records.getUnit12c().getWrappedRecord(), User.GOD);
recordServices.logicallyDelete(records.getUnit20d().getWrappedRecord(), User.GOD);
recordServices.logicallyDelete(records.getUnit20e().getWrappedRecord(), User.GOD);
recordServices.update(records.getUnit20().set(Schemas.LOGICALLY_DELETED_STATUS.getLocalCode(), true));
assertThat(records.getUnit20().isLogicallyDeletedStatus()).isTrue();
assertThat(records.getUnit12c().isLogicallyDeletedStatus()).isTrue();
assertThat(records.getCategory_X13().isLogicallyDeletedStatus()).isTrue();
assertThat(records.getCategory_Z().isLogicallyDeletedStatus()).isTrue();
assertThat(records.getCategory_Z100().isLogicallyDeletedStatus()).isTrue();
assertThat(records.getCategory_Z110().isLogicallyDeletedStatus()).isTrue();
assertThat(records.getCategory_Z112().isLogicallyDeletedStatus()).isTrue();
SystemCheckManager systemCheckManager = new SystemCheckManager(getAppLayerFactory());
SystemCheckResults systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(systemCheckResults.repairedRecords.size()).isEqualTo(0);
assertThat(extractingSimpleCodeAndParameters(systemCheckResults.errors, "schemaType", "recordId")).containsOnly(
SystemCheckManagerAcceptanceTestResources.expectedErrorsWhenLogicallyDeletedCategoriesAndUnits);
assertThat(frenchMessages(systemCheckResults.errors)).containsOnly(
SystemCheckManagerAcceptanceTestResources.expectedErrorsWhenLogicallyDeletedCategoriesAndUnitsErrorMessages
);
assertThat(statusOf(records.unitId_20)).isEqualTo(RecordStatus.LOGICALLY_DELETED);
assertThat(statusOf(records.unitId_12c)).isEqualTo(RecordStatus.LOGICALLY_DELETED);
assertThat(statusOf(records.categoryId_X13)).isEqualTo(RecordStatus.LOGICALLY_DELETED);
assertThat(statusOf(records.categoryId_Z)).isEqualTo(RecordStatus.LOGICALLY_DELETED);
assertThat(statusOf(records.categoryId_Z100)).isEqualTo(RecordStatus.LOGICALLY_DELETED);
assertThat(statusOf(records.categoryId_Z110)).isEqualTo(RecordStatus.LOGICALLY_DELETED);
assertThat(statusOf(records.categoryId_Z112)).isEqualTo(RecordStatus.LOGICALLY_DELETED);
assertThat(new SystemCheckReportBuilder(systemCheckManager).build()).isEqualTo(expectedMessage5);
systemCheckResults = systemCheckManager.runSystemCheck(true);
assertThat(systemCheckResults.repairedRecords.size()).isEqualTo(18);
assertThat(extractingSimpleCodeAndParameters(systemCheckResults.errors, "schemaType", "recordId")).containsOnly(
SystemCheckManagerAcceptanceTestResources.expectedErrorsWhenLogicallyDeletedCategoriesAndUnits);
assertThat(statusOf(records.unitId_20)).isEqualTo(RecordStatus.ACTIVE);
assertThat(statusOf(records.unitId_12c)).isEqualTo(RecordStatus.DELETED);
assertThat(statusOf(records.categoryId_X13)).isEqualTo(RecordStatus.DELETED);
assertThat(statusOf(records.categoryId_Z100)).isEqualTo(RecordStatus.ACTIVE);
assertThat(statusOf(records.categoryId_Z)).isEqualTo(RecordStatus.ACTIVE);
assertThat(statusOf(records.categoryId_Z110)).isEqualTo(RecordStatus.DELETED);
assertThat(statusOf(records.categoryId_Z112)).isEqualTo(RecordStatus.DELETED);
assertThat(new SystemCheckReportBuilder(systemCheckManager).build()).isEqualTo(expectedMessage6);
systemCheckResults = new SystemCheckManager(getAppLayerFactory()).runSystemCheck(false);
assertThat(systemCheckResults.repairedRecords.size()).isEqualTo(0);
assertThat(extractingSimpleCodeAndParameters(systemCheckResults.errors, "schemaType", "recordId")).isEmpty();
}
@Test
public void givenDecommissioningListWithInvalidFolderWhenRepairThenFixed()
throws Exception {
prepareSystem(
withZeCollection().withConstellioRMModule().withConstellioESModule().withAllTestUsers()
.withRMTest(records).withFoldersAndContainersOfEveryStatus().withDocumentsDecommissioningList()
);
inCollection(zeCollection).setCollectionTitleTo("Collection de test");
givenDisabledAfterTestValidations();
DecommissioningList list = records.getList01();
RMSchemasRecordsServices rm = new RMSchemasRecordsServices(zeCollection, getAppLayerFactory());
Folder zeFolder = rm.newFolderWithId("zeFolder").setTitle("ze title").setOpenDate(date(2016, 1, 1))
.setParentFolder(records.folder_A03);
getModelLayerFactory().newRecordServices().add(zeFolder);
List<DecomListFolderDetail> details = new ArrayList<>(list.getFolderDetails());
details.add(new DecomListFolderDetail().setFolderId(zeFolder.getId()));
list.setFolderDetails(details);
getModelLayerFactory().newRecordServices().update(list);
getModelLayerFactory().newRecordServices().logicallyDelete(zeFolder.getWrappedRecord(), User.GOD);
getDataLayerFactory().newRecordDao().getBigVaultServer().getNestedSolrServer().deleteById(zeFolder.getId());
getModelLayerFactory().newRecordServices().flush();
SystemCheckManager systemCheckManager = new SystemCheckManager(getAppLayerFactory());
SystemCheckResults systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(frenchMessages(systemCheckResults.errors)).contains(
"La métadonnée decommissioningList_default_folders de l'enregistrement list01 référence un enregistrement inexistant : zeFolder"
);
systemCheckResults = systemCheckManager.runSystemCheck(true);
assertThat(frenchMessages(systemCheckResults.errors)).contains(
"La métadonnée decommissioningList_default_folders de l'enregistrement list01 référence un enregistrement inexistant : zeFolder"
);
systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(frenchMessages(systemCheckResults.errors)).isEmpty();
}
@Test
public void givenDestructionOrDepositDateIsAfterTransferDateThenProblemFoundAndFixed()
throws Exception {
prepareSystem(withZeCollection().withConstellioRMModule().withConstellioESModule().withAllTestUsers()
.withRMTest(records).withFoldersAndContainersOfEveryStatus());
givenConfig(RMConfigs.ALLOW_MODIFICATION_OF_ARCHIVISTIC_STATUS_AND_EXPECTED_DATES,
AllowModificationOfArchivisticStatusAndExpectedDatesChoice.ENABLED);
Transaction transaction = new Transaction();
//Probleme
transaction.add(records.getFolder_A01().setManualArchivisticStatus(FolderStatus.SEMI_ACTIVE)
.setActualTransferDate(date(2015, 1, 1)).setManualExpectedDestructionDate(date(2014, 1, 1)));
//Probleme
transaction.add(records.getFolder_A02().setManualArchivisticStatus(FolderStatus.SEMI_ACTIVE)
.setActualTransferDate(date(2015, 1, 1)).setManualExpectedDepositDate(date(2014, 1, 1)));
//OK
transaction.add(records.getFolder_A03().setManualArchivisticStatus(FolderStatus.SEMI_ACTIVE)
.setActualTransferDate(date(2015, 1, 1)).setManualExpectedDepositDate(date(2015, 1, 1)));
//Probleme
transaction.add(records.getFolder_A04().setManualArchivisticStatus(FolderStatus.ACTIVE)
.setManualExpectedTransferDate(date(2015, 1, 1)).setManualExpectedDestructionDate(date(2014, 1, 1)));
//Probleme
transaction.add(records.getFolder_A05().setManualArchivisticStatus(FolderStatus.ACTIVE)
.setManualExpectedTransferDate(date(2015, 1, 1)).setManualExpectedDepositDate(date(2014, 1, 1)));
//OK
transaction.add(records.getFolder_A06().setManualArchivisticStatus(FolderStatus.ACTIVE)
.setManualExpectedTransferDate(date(2015, 1, 1)).setManualExpectedDepositDate(date(2015, 1, 1)));
getModelLayerFactory().newRecordServices().execute(transaction);
SystemCheckManager systemCheckManager = new SystemCheckManager(getAppLayerFactory());
SystemCheckResults systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(frenchMessages(systemCheckResults.errors)).contains(
"Dossier A01-Abeille : Date de destruction avant la date de transfert",
"Dossier A02-Aigle : Date de versement avant la date de transfert",
"Dossier A04-Baleine : Date de destruction avant la date de transfert",
"Dossier A05-Belette : Date de versement avant la date de transfert"
);
systemCheckResults = systemCheckManager.runSystemCheck(true);
assertThat(frenchMessages(systemCheckResults.errors)).contains(
"Dossier A01-Abeille : Date de destruction avant la date de transfert",
"Dossier A02-Aigle : Date de versement avant la date de transfert",
"Dossier A04-Baleine : Date de destruction avant la date de transfert",
"Dossier A05-Belette : Date de versement avant la date de transfert"
);
systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(frenchMessages(systemCheckResults.errors)).isEmpty();
}
@Test
public void givenOldFloatingRobotActionsWhenDiagnoseAndRepairThenRemoved()
throws Exception {
prepareSystem(withZeCollection().withConstellioRMModule().withConstellioESModule().withRobotsModule()
.withAllTestUsers().withRMTest(records).withFoldersAndContainersOfEveryStatus());
RobotSchemaRecordServices robotsSchemas = new RobotSchemaRecordServices(zeCollection, getAppLayerFactory());
ESSchemasRecordsServices es = new ESSchemasRecordsServices(zeCollection, getAppLayerFactory());
Robot robot = robotsSchemas.newRobot().setCode("Term").setTitle("Inator");
Transaction tx = new Transaction();
tx.add(robot.setSchemaFilter(es.connectorSmbFolder.schemaType().getCode()));
tx.add(robotsSchemas.newActionParameters());
tx.add(robotsSchemas.newActionParameters());
String parameter = tx.add(robotsSchemas.newActionParameters()).getId();
robot.setActionParameters(parameter);
robot.setSearchCriterion(new CriterionBuilder(ConnectorSmbFolder.SCHEMA_TYPE)
.where(es.connectorSmbFolder.url()).isContainingText("sharepoint://"));
getModelLayerFactory().newRecordServices().execute(tx);
SearchServices searchServices = getModelLayerFactory().newSearchServices();
LogicalSearchQuery query = new LogicalSearchQuery(from(robotsSchemas.actionParameters.schemaType()).returnAll());
assertThat(searchServices.getResultsCount(query)).isEqualTo(3);
SystemCheckManager systemCheckManager = new SystemCheckManager(getAppLayerFactory());
SystemCheckResults systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(frenchMessages(systemCheckResults.errors)).isEmpty();
assertThat(systemCheckResults.getMetric("robots.unusedRobotActions")).isEqualTo(2);
assertThat(searchServices.getResultsCount(query)).isEqualTo(3);
systemCheckResults = systemCheckManager.runSystemCheck(true);
assertThat(frenchMessages(systemCheckResults.errors)).isEmpty();
assertThat(systemCheckResults.getMetric("robots.unusedRobotActions")).isEqualTo(2);
assertThat(searchServices.getResultsCount(query)).isEqualTo(1);
systemCheckResults = systemCheckManager.runSystemCheck(false);
assertThat(frenchMessages(systemCheckResults.errors)).isEmpty();
assertThat(systemCheckResults.getMetric("robots.unusedRobotActions")).isEqualTo(0);
assertThat(searchServices.getResultsCount(query)).isEqualTo(1);
}
private enum RecordStatus {ACTIVE, LOGICALLY_DELETED, DELETED}
private RecordStatus statusOf(String id) {
try {
Record record = getModelLayerFactory().newRecordServices().getDocumentById(id);
return record.<Boolean>get(Schemas.LOGICALLY_DELETED_STATUS) ? RecordStatus.LOGICALLY_DELETED : RecordStatus.ACTIVE;
} catch (Exception e) {
return RecordStatus.DELETED;
}
}
}