package com.constellio.model.services.schemas; import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichHasDefaultValue; import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsMultivalue; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import org.joda.time.LocalDate; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Test; import com.constellio.data.utils.Delayed; import com.constellio.model.entities.Taxonomy; 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.MetadataSchema; import com.constellio.model.entities.schemas.MetadataSchemaType; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.schemas.builders.MetadataBuilder_EnumClassTest.AValidEnum; import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder; 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 MetadataSchemasManagerDefaultValueAcceptanceTest extends ConstellioTest { LocalDate zeUltimateDate = new LocalDate(2015, 06, 02); LocalDate anotherDate = new LocalDate(2014, 11, 25); LocalDateTime shishOClock = new LocalDateTime(); LocalDateTime tockOClock = shishOClock.minusHours(42); MetadataSchemasManager otherMetadataSchemasManager; TestsSchemasSetup schemas = new TestsSchemasSetup(); ZeSchemaMetadatas zeSchema = schemas.new ZeSchemaMetadatas(); AnotherSchemaMetadatas anotherSchema = schemas.new AnotherSchemaMetadatas(); String record1Id = "record1Id"; String record2Id = "record2Id"; String record3Id = "record3Id"; String parentOfRecord12Id = "parentOfRecord12"; String parentOfRecord3Id = "parentOfRecord3"; @Test public void givenReferenceMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas .withAParentReferenceFromAnotherSchemaToZeSchema() .withAParentReferenceFromZeSchemaToZeSchema()); givenOtherTypeRecords(); schemas.modify(new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchemaType(anotherSchema.typeCode()).getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema") .setDefaultValue(record1Id); } }); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()).isEqualTo(record1Id); assertThat(newAnotherSchemaRecord().get(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema"))) .isEqualTo(record1Id); schemas.modify(new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchemaType(anotherSchema.typeCode()).getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema") .setDefaultValue(record2Id); } }); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()).isEqualTo(record2Id); assertThat(newAnotherSchemaRecord().get(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema"))) .isEqualTo(record2Id); } //@Test //No longer working that way, logically delete is not blocked when there is a default value public void givenReferenceMetadataWithDefaultValueWhenDeletingRecordThenRemoveDefaultValue() throws Exception { defineSchemasManager().using(schemas .withAParentReferenceFromAnotherSchemaToZeSchema() .withAParentReferenceFromZeSchemaToZeSchema()); givenOtherTypeRecords(); schemas.modify(new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchemaType(anotherSchema.typeCode()).getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema") .setDefaultValue(record2Id); } }); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()).isEqualTo(record2Id); deleteRecord(record2Id); schemas.refresh(); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()).isNull(); } @Test public void givenReferenceMetadataWithDefaultValueWhenDeletingParentRecordThenRemoveDefaultValue() throws Exception { defineSchemasManager().using(schemas .withAParentReferenceFromAnotherSchemaToZeSchema() .withAParentReferenceFromZeSchemaToZeSchema()); givenOtherTypeRecords(); schemas.modify(new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchemaType(anotherSchema.typeCode()).getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema") .setDefaultValue(record2Id); } }); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()).isEqualTo(record2Id); deleteRecord(parentOfRecord3Id); schemas.refresh(); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()).isEqualTo(record2Id); deleteRecord(parentOfRecord12Id); schemas.refresh(); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()).isNull(); } @Test public void givenMultivalueReferenceMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas .withAParentReferenceFromAnotherSchemaToZeSchema(whichIsMultivalue) .withAParentReferenceFromZeSchemaToZeSchema()); givenOtherTypeRecords(); schemas.modify(new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchemaType(anotherSchema.typeCode()).getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema") .setDefaultValue(asList(record1Id, record2Id)); } }); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()) .isEqualTo(asList(record1Id, record2Id)); assertThat(newAnotherSchemaRecord().get(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema"))) .isEqualTo(asList(record1Id, record2Id)); schemas.modify(new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchemaType(anotherSchema.typeCode()).getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema") .setDefaultValue(asList(record1Id, record3Id)); } }); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()) .isEqualTo(asList(record1Id, record3Id)); assertThat(newAnotherSchemaRecord().get(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema"))) .isEqualTo(asList(record1Id, record3Id)); } //@Test //No longer working that way, logically delete is not blocked when there is a default value public void givenMultivalueReferenceMetadataWithDefaultValueWhenDeletingRecordThenRemoveDefaultValue() throws Exception { defineSchemasManager().using(schemas .withAParentReferenceFromAnotherSchemaToZeSchema(whichIsMultivalue) .withAParentReferenceFromZeSchemaToZeSchema()); givenOtherTypeRecords(); schemas.modify(new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchemaType(anotherSchema.typeCode()).getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema") .setDefaultValue(asList(record1Id, record2Id)); } }); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()) .isEqualTo(asList(record1Id, record2Id)); deleteRecord(record2Id); schemas.refresh(); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()).isEqualTo(asList(record1Id)); deleteRecord(record1Id); schemas.refresh(); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()).isNull(); } @Test public void givenMultivalueReferenceMetadataWithDefaultValueWhenDeletingParentRecordThenRemoveDefaultValue() throws Exception { defineSchemasManager().using(schemas .withAParentReferenceFromAnotherSchemaToZeSchema(whichIsMultivalue) .withAParentReferenceFromZeSchemaToZeSchema()); // givenTaxonomyOfZeSchema(); givenOtherTypeRecords(); schemas.modify(new MetadataSchemaTypesAlteration() { @Override public void alter(MetadataSchemaTypesBuilder types) { types.getSchemaType(anotherSchema.typeCode()).getDefaultSchema().get("referenceFromAnotherSchemaToZeSchema") .setDefaultValue(asList(record1Id, record3Id)); } }); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()) .isEqualTo(asList(record1Id, record3Id)); deleteRecord(parentOfRecord12Id); schemas.refresh(); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()).isEqualTo(asList(record3Id)); deleteRecord(parentOfRecord3Id); schemas.refresh(); assertThat(anotherSchema.metadata("referenceFromAnotherSchemaToZeSchema").getDefaultValue()).isNull(); } @Test public void givenStringMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withAStringMetadata(whichHasDefaultValue("<?Ze default valué:;&>"))); assertThat(zeSchema.stringMetadata().getDefaultValue()).isEqualTo("<?Ze default valué:;&>"); assertThat(newZeSchemaRecord().get(zeSchema.stringMetadata())).isEqualTo("<?Ze default valué:;&>"); } @Test public void givenMultivalueStringMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withAStringMetadata(whichIsMultivalue, whichHasDefaultValue(asList("value1", "value2")))); assertThat(zeSchema.stringMetadata().getDefaultValue()).isEqualTo(asList("value1", "value2")); assertThat(newZeSchemaRecord().get(zeSchema.stringMetadata())).isEqualTo(asList("value1", "value2")); } @Test public void givenTextMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withALargeTextMetadata(whichHasDefaultValue("<?Ze default valué:;&>"))); assertThat(zeSchema.largeTextMetadata().getDefaultValue()).isEqualTo("<?Ze default valué:;&>"); assertThat(newZeSchemaRecord().get(zeSchema.largeTextMetadata())).isEqualTo("<?Ze default valué:;&>"); } @Test public void givenMultivalueTextMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withALargeTextMetadata(whichIsMultivalue, whichHasDefaultValue(asList("value1", "value2")))); assertThat(zeSchema.largeTextMetadata().getDefaultValue()).isEqualTo(asList("value1", "value2")); assertThat(newZeSchemaRecord().get(zeSchema.largeTextMetadata())).isEqualTo(asList("value1", "value2")); } @Test public void givenDateMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withADateMetadata(whichHasDefaultValue(zeUltimateDate))); assertThat(zeSchema.dateMetadata().getDefaultValue()).isEqualTo(zeUltimateDate); assertThat(newZeSchemaRecord().get(zeSchema.dateMetadata())).isEqualTo(zeUltimateDate); } @Test public void givenMultivalueDateMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withADateMetadata(whichIsMultivalue, whichHasDefaultValue(asList(zeUltimateDate, anotherDate)))); assertThat(zeSchema.dateMetadata().getDefaultValue()).isEqualTo(asList(zeUltimateDate, anotherDate)); assertThat(newZeSchemaRecord().get(zeSchema.dateMetadata())).isEqualTo(asList(zeUltimateDate, anotherDate)); } @Test public void givenDateTimeMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withADateTimeMetadata(whichHasDefaultValue(shishOClock))); assertThat(zeSchema.dateTimeMetadata().getDefaultValue()).isEqualTo(shishOClock); assertThat(newZeSchemaRecord().get(zeSchema.dateTimeMetadata())).isEqualTo(shishOClock); } @Test public void givenMultivalueDateTimeMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withADateTimeMetadata(whichIsMultivalue, whichHasDefaultValue(asList(shishOClock, tockOClock)))); assertThat(zeSchema.dateTimeMetadata().getDefaultValue()).isEqualTo(asList(shishOClock, tockOClock)); assertThat(newZeSchemaRecord().get(zeSchema.dateTimeMetadata())).isEqualTo(asList(shishOClock, tockOClock)); } @Test public void givenBooleanMetadataWithFalseDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withABooleanMetadata(whichHasDefaultValue(false))); assertThat(zeSchema.booleanMetadata().getDefaultValue()).isEqualTo(Boolean.FALSE); assertThat(newZeSchemaRecord().get(zeSchema.booleanMetadata())).isEqualTo(Boolean.FALSE); } @Test public void givenBooleanMetadataWithTrueDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withABooleanMetadata(whichHasDefaultValue(true))); assertThat(zeSchema.booleanMetadata().getDefaultValue()).isEqualTo(Boolean.TRUE); assertThat(newZeSchemaRecord().get(zeSchema.booleanMetadata())).isEqualTo(Boolean.TRUE); } @Test public void givenBooleanMetadataWithNullDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withABooleanMetadata(whichHasDefaultValue(null))); assertThat(zeSchema.booleanMetadata().getDefaultValue()).isNull(); assertThat(newZeSchemaRecord().get(zeSchema.booleanMetadata())).isNull(); } @Test public void givenMultivalueBooleanMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withABooleanMetadata(whichIsMultivalue, whichHasDefaultValue(asList(true, false, true)))); assertThat(zeSchema.booleanMetadata().getDefaultValue()).isEqualTo(asList(true, false, true)); assertThat(newZeSchemaRecord().get(zeSchema.booleanMetadata())).isEqualTo(asList(true, false, true)); } //@Test public void givenIntegerMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withAnIntegerMetadata(whichHasDefaultValue(12))); assertThat(zeSchema.integerMetadata().getDefaultValue()).isEqualTo(12); assertThat(newZeSchemaRecord().get(zeSchema.integerMetadata())).isEqualTo(12); } //@Test public void givenMultivalueIntegerMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withAnIntegerMetadata(whichIsMultivalue, whichHasDefaultValue(asList(12, 34, 56)))); assertThat(zeSchema.integerMetadata().getDefaultValue()).isEqualTo(asList(12, 34, 56)); assertThat(newZeSchemaRecord().get(zeSchema.integerMetadata())).isEqualTo(asList(12, 34, 56)); } @Test public void givenNumberMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withANumberMetadata(whichHasDefaultValue(12.34))); assertThat(zeSchema.numberMetadata().getDefaultValue()).isEqualTo(12.34); assertThat(newZeSchemaRecord().get(zeSchema.numberMetadata())).isEqualTo(12.34); } @Test public void givenNumberMetadataWithZeroDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withANumberMetadata(whichHasDefaultValue(0.0))); assertThat(zeSchema.numberMetadata().getDefaultValue()).isEqualTo(0.0); assertThat(newZeSchemaRecord().get(zeSchema.numberMetadata())).isEqualTo(0.0); assertThat(newZeSchemaRecord().isModified(zeSchema.numberMetadata())).isTrue(); } @Test public void givenMultivalueNumberMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withANumberMetadata(whichIsMultivalue, whichHasDefaultValue(asList(12.34, 34.56, 56.78)))); assertThat(zeSchema.numberMetadata().getDefaultValue()).isEqualTo(asList(12.34, 34.56, 56.78)); assertThat(newZeSchemaRecord().get(zeSchema.numberMetadata())).isEqualTo(asList(12.34, 34.56, 56.78)); } @Test public void givenEnumMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withAnEnumMetadata(AValidEnum.class, whichHasDefaultValue(AValidEnum.SECOND_VALUE))); assertThat(zeSchema.enumMetadata().getDefaultValue()).isEqualTo(AValidEnum.SECOND_VALUE); assertThat(newZeSchemaRecord().get(zeSchema.enumMetadata())).isEqualTo(AValidEnum.SECOND_VALUE); } @Test public void givenMultivalueEnumMetadataWithDefaultValueThenValueSaved() throws Exception { defineSchemasManager().using(schemas.withAnEnumMetadata(AValidEnum.class, whichIsMultivalue, whichHasDefaultValue(asList(AValidEnum.SECOND_VALUE, AValidEnum.FIRST_VALUE, AValidEnum.SECOND_VALUE)))); assertThat(zeSchema.enumMetadata().getDefaultValue()) .isEqualTo(asList(AValidEnum.SECOND_VALUE, AValidEnum.FIRST_VALUE, AValidEnum.SECOND_VALUE)); assertThat(newZeSchemaRecord().get(zeSchema.enumMetadata())) .isEqualTo(asList(AValidEnum.SECOND_VALUE, AValidEnum.FIRST_VALUE, AValidEnum.SECOND_VALUE)); } @Before public void setUp() throws Exception { otherMetadataSchemasManager = new MetadataSchemasManager(getModelLayerFactory(), new Delayed<>(getAppLayerFactory().getModulesManager())); } private MetadataSchemaType zeType() { return otherMetadataSchemasManager.getSchemaTypes(zeCollection).getSchemaType("zeSchemaType"); } private MetadataSchema zeTypeDefaultSchema() { return otherMetadataSchemasManager.getSchemaTypes(zeCollection).getSchemaType("zeSchemaType").getDefaultSchema(); } private void deleteRecord(String id) { RecordServices recordServices = getModelLayerFactory().newRecordServices(); Record record = recordServices.getDocumentById(id); recordServices.logicallyDelete(record, User.GOD); recordServices.physicallyDelete(record, User.GOD); } private Record newZeSchemaRecord() { return getModelLayerFactory().newRecordServices().newRecordWithSchema(zeSchema.instance()); } private Record newAnotherSchemaRecord() { return getModelLayerFactory().newRecordServices().newRecordWithSchema(anotherSchema.instance()); } private void givenTaxonomyOfZeSchema() { Taxonomy taxonomy = new Taxonomy("zeTaxo", "zeTaxo", zeCollection, zeSchema.typeCode()); getModelLayerFactory().getTaxonomiesManager().addTaxonomy(taxonomy, getModelLayerFactory().getMetadataSchemasManager()); } private void givenOtherTypeRecords() throws Exception { Record record1 = new TestRecord(zeSchema, record1Id); Record record2 = new TestRecord(zeSchema, record2Id); Record record3 = new TestRecord(zeSchema, record3Id); record1.set(zeSchema.parentReferenceFromZeSchemaToZeSchema(), parentOfRecord12Id); record2.set(zeSchema.parentReferenceFromZeSchemaToZeSchema(), parentOfRecord12Id); record3.set(zeSchema.parentReferenceFromZeSchemaToZeSchema(), parentOfRecord3Id); Record parentOfRecord12 = new TestRecord(zeSchema, parentOfRecord12Id); Record parentOfRecord3 = new TestRecord(zeSchema, parentOfRecord3Id); getModelLayerFactory().newRecordServices() .execute(new Transaction().addAll(record1, record2, record3, parentOfRecord12, parentOfRecord3)); } }