package com.constellio.model.services.batch.controller; import static com.constellio.model.entities.schemas.MetadataValueType.STRING; import static com.constellio.model.entities.schemas.Schemas.CODE; import static com.constellio.model.entities.schemas.Schemas.TITLE; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import java.util.HashMap; import java.util.Map; import org.junit.Test; import com.constellio.model.entities.batchprocess.BatchProcessAction; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.services.batch.actions.ChangeValueOfMetadataBatchProcessAction; import com.constellio.model.services.batch.manager.BatchProcessesManager; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.schemas.builders.MetadataSchemaBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; import com.constellio.model.services.search.query.logical.ongoing.OngoingLogicalSearchConditionWithDataStoreFields; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.TestRecord; import com.constellio.sdk.tests.schemas.MetadataSchemaTypesConfigurator; import com.constellio.sdk.tests.schemas.TestsSchemasSetup; import com.constellio.sdk.tests.schemas.TestsSchemasSetup.AnotherSchemaMetadatas; public class BatchProcessActionTypeChangeAcceptanceTest extends ConstellioTest { TestsSchemasSetup schemas = new TestsSchemasSetup(); TestsSchemasSetup.ZeSchemaMetadatas zeSchema = schemas.new ZeSchemaMetadatas(); AnotherSchemaMetadatas anotherSchema = schemas.new AnotherSchemaMetadatas(); BatchProcessesManager batchProcessesManager; RecordServices recordServices; String type1Id = "type1"; String type2Id = "type2"; String type3Id = "type3"; OngoingLogicalSearchConditionWithDataStoreFields fromZeSchemaWhereTitle; Metadata type, metadataA, metadataB, metadataC; @Test public void givenTypeHasLinkedSchemaWhenChangeTypeOfFolderInBatchProcessActionThenAlsoChangeSchema() throws Exception { setup(true); batchProcessesManager.addPendingBatchProcess(fromZeSchemaWhereTitle.isEqualTo("apple"), setTypeTo(type1Id), null); waitForBatchProcess(); assertThat(record("r1").get(type)).isEqualTo(type1Id); assertThat(record("r1").getSchemaCode()).isEqualTo("zeSchemaType_custom1"); assertThat(record("r1").get(metadataA)).isEqualTo("v2"); assertThat(record("r1").get(metadataB)).isEqualTo("v3"); assertThat(record("r1").get(metadataC)).isNull(); assertThat(record("r2").get(type)).isEqualTo(type1Id); assertThat(record("r2").getSchemaCode()).isEqualTo("zeSchemaType_custom1"); assertThat(record("r2").get(metadataA)).isEqualTo("v2"); assertThat(record("r2").get(metadataB)).isEqualTo("v3"); assertThat(record("r2").get(metadataC)).isNull(); assertThat(record("r3").get(type)).isNull(); assertThat(record("r3").getSchemaCode()).isEqualTo("zeSchemaType_default"); assertThat(record("r3").get(metadataA)).isEqualTo("v1"); assertThat(record("r3").get(metadataB)).isNull(); assertThat(record("r3").get(metadataC)).isNull(); batchProcessesManager.addPendingBatchProcess(fromZeSchemaWhereTitle.isEqualTo("apple"), setTypeTo(type2Id), null); waitForBatchProcess(); assertThat(record("r1").get(type)).isEqualTo(type2Id); assertThat(record("r1").getSchemaCode()).isEqualTo("zeSchemaType_custom2"); assertThat(record("r1").get(metadataA)).isEqualTo("v1"); assertThat(record("r1").get(metadataB)).isNull(); assertThat(record("r1").get(metadataC)).isEqualTo("v4"); assertThat(record("r2").get(type)).isEqualTo(type2Id); assertThat(record("r2").getSchemaCode()).isEqualTo("zeSchemaType_custom2"); assertThat(record("r2").get(metadataA)).isEqualTo("v1"); assertThat(record("r2").get(metadataB)).isNull(); assertThat(record("r2").get(metadataC)).isEqualTo("v4"); assertThat(record("r3").get(type)).isNull(); assertThat(record("r3").getSchemaCode()).isEqualTo("zeSchemaType_default"); assertThat(record("r3").get(metadataA)).isEqualTo("v1"); assertThat(record("r3").get(metadataB)).isNull(); assertThat(record("r3").get(metadataC)).isNull(); batchProcessesManager.addPendingBatchProcess(fromZeSchemaWhereTitle.isEqualTo("apple"), setTypeTo(type3Id), null); waitForBatchProcess(); assertThat(record("r1").get(type)).isEqualTo(type3Id); assertThat(record("r1").getSchemaCode()).isEqualTo("zeSchemaType_default"); assertThat(record("r1").get(metadataA)).isEqualTo("v1"); assertThat(record("r1").get(metadataB)).isNull(); assertThat(record("r1").get(metadataC)).isNull(); assertThat(record("r2").get(type)).isEqualTo(type3Id); assertThat(record("r2").getSchemaCode()).isEqualTo("zeSchemaType_default"); assertThat(record("r2").get(metadataA)).isEqualTo("v1"); assertThat(record("r2").get(metadataB)).isNull(); assertThat(record("r2").get(metadataC)).isNull(); assertThat(record("r3").get(type)).isNull(); assertThat(record("r3").getSchemaCode()).isEqualTo("zeSchemaType_default"); assertThat(record("r3").get(metadataA)).isEqualTo("v1"); assertThat(record("r3").get(metadataB)).isNull(); assertThat(record("r3").get(metadataC)).isNull(); batchProcessesManager.addPendingBatchProcess(fromZeSchemaWhereTitle.isEqualTo("apple"), setTypeTo(null), null); waitForBatchProcess(); assertThat(record("r1").get(type)).isNull(); assertThat(record("r1").getSchemaCode()).isEqualTo("zeSchemaType_default"); assertThat(record("r1").get(metadataA)).isEqualTo("v1"); assertThat(record("r1").get(metadataB)).isNull(); assertThat(record("r1").get(metadataC)).isNull(); assertThat(record("r2").get(type)).isNull(); assertThat(record("r2").getSchemaCode()).isEqualTo("zeSchemaType_default"); assertThat(record("r2").get(metadataA)).isEqualTo("v1"); assertThat(record("r2").get(metadataB)).isNull(); assertThat(record("r2").get(metadataC)).isNull(); assertThat(record("r3").get(type)).isNull(); assertThat(record("r3").getSchemaCode()).isEqualTo("zeSchemaType_default"); assertThat(record("r3").get(metadataA)).isEqualTo("v1"); assertThat(record("r3").get(metadataB)).isNull(); assertThat(record("r3").get(metadataC)).isNull(); } @Test public void givenTypeHasNoLinkedSchemaWhenChangeTypeOfFolderInBatchProcessActionThenAlsoChangeSchema() throws Exception { setup(false); batchProcessesManager.addPendingBatchProcess(fromZeSchemaWhereTitle.isEqualTo("apple"), setTypeTo(type1Id), null); waitForBatchProcess(); assertThat(record("r1").get(type)).isEqualTo(type1Id); assertThat(record("r1").getSchemaCode()).isEqualTo("zeSchemaType_default"); assertThat(record("r1").get(metadataA)).isEqualTo("v1"); assertThat(record("r1").get(metadataB)).isNull(); assertThat(record("r1").get(metadataC)).isNull(); assertThat(record("r2").get(type)).isEqualTo(type1Id); assertThat(record("r2").getSchemaCode()).isEqualTo("zeSchemaType_default"); assertThat(record("r2").get(metadataA)).isEqualTo("v1"); assertThat(record("r2").get(metadataB)).isNull(); assertThat(record("r2").get(metadataC)).isNull(); assertThat(record("r3").get(type)).isNull(); assertThat(record("r3").getSchemaCode()).isEqualTo("zeSchemaType_default"); assertThat(record("r3").get(metadataA)).isEqualTo("v1"); assertThat(record("r3").get(metadataB)).isNull(); assertThat(record("r3").get(metadataC)).isNull(); } // ------------------------------------------------------------------------------------------------------------------- private void setup(boolean withLinkedSchema) throws Exception { prepareSystem(withZeCollection()); defineSchemasManager().using(schemas.with(twoCustomSchemasAndType(withLinkedSchema))); recordServices = getModelLayerFactory().newRecordServices(); batchProcessesManager = getModelLayerFactory().getBatchProcessesManager(); setupTypeRecords(withLinkedSchema); type = zeSchema.metadata("type"); metadataA = zeSchema.metadata("metadataA"); metadataB = zeSchema.type().getSchema("custom1").get("metadataB"); metadataC = zeSchema.type().getSchema("custom2").get("metadataC"); fromZeSchemaWhereTitle = from(zeSchema.type()).where(TITLE); Record record1 = recordServices.newRecordWithSchema(zeSchema.instance(), "r1").set(TITLE, "apple"); Record record2 = recordServices.newRecordWithSchema(zeSchema.instance(), "r2").set(TITLE, "apple"); Record record3 = recordServices.newRecordWithSchema(zeSchema.instance(), "r3").set(TITLE, "orange"); recordServices.execute(new Transaction(record1, record2, record3)); } private BatchProcessAction setTypeTo(String type1Id) { Map<String, Object> values = new HashMap<>(); values.put("zeSchemaType_default_type", type1Id); return new ChangeValueOfMetadataBatchProcessAction(values); } private void setupTypeRecords(boolean withLinkedSchema) throws Exception { Record type1 = new TestRecord(anotherSchema, type1Id).set(CODE, "code1").set(TITLE, "title1"); Record type2 = new TestRecord(anotherSchema, type2Id).set(CODE, "code2").set(TITLE, "title2"); Record type3 = new TestRecord(anotherSchema, type3Id).set(CODE, "code3").set(TITLE, "title3"); if (withLinkedSchema) { type1.set(anotherSchema.metadata("linkedSchema"), "custom1"); type2.set(anotherSchema.metadata("linkedSchema"), "custom2"); } recordServices.execute(new Transaction(asList(type1, type2, type3))); } private MetadataSchemaTypesConfigurator twoCustomSchemasAndType(final boolean linkedSchema) { return new MetadataSchemaTypesConfigurator() { @Override public void configure(MetadataSchemaTypesBuilder schemaTypes) { MetadataSchemaTypeBuilder anotherSchema = schemaTypes.getSchemaType("anotherSchemaType"); schemaTypes.getSchema("zeSchemaType_default").create("type").defineReferencesTo(anotherSchema); MetadataSchemaBuilder custom1 = schemaTypes.getSchemaType("zeSchemaType").createCustomSchema("custom1"); MetadataSchemaBuilder custom2 = schemaTypes.getSchemaType("zeSchemaType").createCustomSchema("custom2"); schemaTypes.getSchema("zeSchemaType_default").create("metadataA").setType(STRING).setDefaultValue("v1"); custom1.get("metadataA").setDefaultValue("v2"); custom1.create("metadataB").setType(STRING).setDefaultValue("v3"); custom2.create("metadataC").setType(STRING).setDefaultValue("v4"); anotherSchema.getDefaultSchema().create("code").setType(STRING); if (linkedSchema) { anotherSchema.getDefaultSchema().create("linkedSchema").setType(STRING); } } }; } }