package com.constellio.model.services.schemas;
import static com.constellio.model.entities.schemas.MetadataValueType.STRING;
import static com.constellio.sdk.tests.schemas.TestsSchemasSetup.whichIsCalculatedUsingPattern;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import org.junit.Test;
import com.constellio.model.entities.schemas.preparationSteps.CalculateMetadatasRecordPreparationStep;
import com.constellio.model.entities.schemas.preparationSteps.RecordPreparationStep;
import com.constellio.model.entities.schemas.preparationSteps.SequenceRecordPreparationStep;
import com.constellio.model.entities.schemas.preparationSteps.UpdateCreationModificationUsersAndDateRecordPreparationStep;
import com.constellio.model.entities.schemas.preparationSteps.ValidateCyclicReferencesRecordPreparationStep;
import com.constellio.model.entities.schemas.preparationSteps.ValidateMetadatasRecordPreparationStep;
import com.constellio.model.entities.schemas.preparationSteps.ValidateUsingSchemaValidatorsRecordPreparationStep;
import com.constellio.model.services.schemas.builders.MetadataSchemaBuilder;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilder;
import com.constellio.model.services.schemas.testimpl.TestRecordValidator1;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.schemas.MetadataSchemaTypesConfigurator;
import com.constellio.sdk.tests.schemas.TestsSchemasSetup;
import com.constellio.sdk.tests.schemas.TestsSchemasSetup.ZeSchemaMetadatas;
public class RecordPreparationStepsAcceptanceTest extends ConstellioTest {
TestsSchemasSetup setup = new TestsSchemasSetup();
ZeSchemaMetadatas zeSchema = setup.new ZeSchemaMetadatas();
@Test
public void givenTypicalSchemasWithoutValidatorsThenTypicalPreparationSteps()
throws Exception {
defineSchemasManager().using(setup.withAStringMetadata()
.withAnotherStringMetadata(whichIsCalculatedUsingPattern("'Calculated : ' + stringMetadata")));
List<RecordPreparationStep> steps = zeSchema.instance().getPreparationSteps();
assertThat(steps).extracting("class.name").containsExactly(
UpdateCreationModificationUsersAndDateRecordPreparationStep.class.getName(),
ValidateMetadatasRecordPreparationStep.class.getName(),
CalculateMetadatasRecordPreparationStep.class.getName(),
ValidateCyclicReferencesRecordPreparationStep.class.getName(),
ValidateMetadatasRecordPreparationStep.class.getName(),
ValidateUsingSchemaValidatorsRecordPreparationStep.class.getName()
);
assertThat(((ValidateMetadatasRecordPreparationStep) steps.get(1)).getMetadatasCodes())
.containsOnly(zeSchema.stringMetadata().getCode(), zeSchema.metadata("title").getCode());
assertThat(((CalculateMetadatasRecordPreparationStep) steps.get(2)).getMetadatasCodes())
.containsOnly(zeSchema.anotherStringMetadata().getCode(), "zeSchemaType_default_tokens",
"zeSchemaType_default_allauthorizations", "zeSchemaType_default_pathParts", "zeSchemaType_default_path",
"zeSchemaType_default_parentpath", "zeSchemaType_default_inheritedauthorizations",
"zeSchemaType_default_principalpath", "zeSchemaType_default_attachedAncestors",
"zeSchemaType_default_allRemovedAuths", "zeSchemaType_default_autocomplete");
assertThat(((ValidateMetadatasRecordPreparationStep) steps.get(4)).getMetadatasCodes())
.containsOnly(zeSchema.anotherStringMetadata().getCode(), "zeSchemaType_default_tokens",
"zeSchemaType_default_allauthorizations", "zeSchemaType_default_pathParts", "zeSchemaType_default_path",
"zeSchemaType_default_parentpath", "zeSchemaType_default_inheritedauthorizations",
"zeSchemaType_default_principalpath", "zeSchemaType_default_attachedAncestors",
"zeSchemaType_default_allRemovedAuths", "zeSchemaType_default_autocomplete");
assertThat(((ValidateUsingSchemaValidatorsRecordPreparationStep) steps.get(5)).getValidators()).isEmpty();
}
@Test
public void givenTypicalSchemasWithValidatorsThenTypicalPreparationSteps()
throws Exception {
defineSchemasManager().using(setup.withAStringMetadata()
.withAnotherStringMetadata(whichIsCalculatedUsingPattern("'Calculated : ' + stringMetadata"))
.withRecordValidator(TestRecordValidator1.class));
List<RecordPreparationStep> steps = zeSchema.instance().getPreparationSteps();
assertThat(steps).extracting("class.name").containsExactly(
UpdateCreationModificationUsersAndDateRecordPreparationStep.class.getName(),
ValidateMetadatasRecordPreparationStep.class.getName(),
CalculateMetadatasRecordPreparationStep.class.getName(),
ValidateCyclicReferencesRecordPreparationStep.class.getName(),
ValidateMetadatasRecordPreparationStep.class.getName(),
ValidateUsingSchemaValidatorsRecordPreparationStep.class.getName()
);
assertThat(((ValidateMetadatasRecordPreparationStep) steps.get(1)).getMetadatasCodes())
.contains(zeSchema.stringMetadata().getCode());
assertThat(((CalculateMetadatasRecordPreparationStep) steps.get(2)).getMetadatasCodes())
.contains(zeSchema.anotherStringMetadata().getCode());
assertThat(((ValidateMetadatasRecordPreparationStep) steps.get(4)).getMetadatasCodes())
.contains(zeSchema.anotherStringMetadata().getCode());
assertThat(((ValidateUsingSchemaValidatorsRecordPreparationStep) steps.get(5)).getValidators()).extracting("class.name")
.contains(TestRecordValidator1.class.getName());
}
@Test
public void givenDynamicSequenceMetadataWithoutMetadatasDependingOnItThenSequenceStepAtLast()
throws Exception {
defineSchemasManager().using(setup.withAStringMetadata()
.withAnotherStringMetadata(whichIsCalculatedUsingPattern("'Calculated : ' + stringMetadata"))
.withRecordValidator(TestRecordValidator1.class).withADynamicSequence());
List<RecordPreparationStep> steps = zeSchema.instance().getPreparationSteps();
assertThat(steps).extracting("class.name").containsExactly(
UpdateCreationModificationUsersAndDateRecordPreparationStep.class.getName(),
ValidateMetadatasRecordPreparationStep.class.getName(),
CalculateMetadatasRecordPreparationStep.class.getName(),
ValidateCyclicReferencesRecordPreparationStep.class.getName(),
ValidateMetadatasRecordPreparationStep.class.getName(),
ValidateUsingSchemaValidatorsRecordPreparationStep.class.getName(),
SequenceRecordPreparationStep.class.getName()
);
assertThat(((ValidateMetadatasRecordPreparationStep) steps.get(1)).getMetadatasCodes())
.contains(zeSchema.stringMetadata().getCode());
assertThat(((CalculateMetadatasRecordPreparationStep) steps.get(2)).getMetadatasCodes())
.contains(zeSchema.anotherStringMetadata().getCode())
.doesNotContain("zeSchemaType_default_metaDependentOfSeq1", "zeSchemaType_default_metaDependentOfSeq4",
"zeSchemaType_default_metaDependentOfSeq3", "zeSchemaType_default_metaDependentOfSeq2");
assertThat(((ValidateMetadatasRecordPreparationStep) steps.get(4)).getMetadatasCodes())
.contains(zeSchema.anotherStringMetadata().getCode())
.doesNotContain("zeSchemaType_default_metaDependentOfSeq1", "zeSchemaType_default_metaDependentOfSeq4",
"zeSchemaType_default_metaDependentOfSeq3", "zeSchemaType_default_metaDependentOfSeq2");
assertThat(((ValidateUsingSchemaValidatorsRecordPreparationStep) steps.get(5)).getValidators()).extracting("class.name")
.contains(TestRecordValidator1.class.getName());
assertThat(((SequenceRecordPreparationStep) steps.get(6)).getMetadatasCodes())
.containsExactly("zeSchemaType_default_dynamicSequenceMetadata");
}
@Test
public void givenDynamicSequenceMetadataThenMetadataAndThoseDependingOnItAreCalculatedAndValidatedAtTheEnd()
throws Exception {
defineSchemasManager().using(setup.withAStringMetadata()
.withAnotherStringMetadata(whichIsCalculatedUsingPattern("'Calculated : ' + stringMetadata"))
.withRecordValidator(TestRecordValidator1.class)
.withADynamicSequence().with(new MetadataSchemaTypesConfigurator() {
@Override
public void configure(MetadataSchemaTypesBuilder schemaTypes) {
MetadataSchemaBuilder zeSchema = schemaTypes.getSchema("zeSchemaType_default");
zeSchema.create("metaDependentOfSeq1").setType(STRING).defineDataEntry().asJexlScript(
"dynamicSequenceMetadata + 'test'");
zeSchema.create("metaDependentOfSeq2").setType(STRING).defineDataEntry().asJexlScript(
"metaDependentOfSeq1 + metaDependentOfSeq3");
zeSchema.create("metaDependentOfSeq3").setType(STRING).defineDataEntry().asJexlScript(
"dynamicSequenceMetadata + metaDependentOfSeq4 + metaDependentOfSeq1");
zeSchema.create("metaDependentOfSeq4").setType(STRING).defineDataEntry().asJexlScript(
"dynamicSequenceMetadata + anotherStringMetadata");
zeSchema.create("metaDependentOfSeq0").setType(STRING).defineDataEntry().asJexlScript(
"'test' + metaDependentOfSeq2");
}
}));
List<RecordPreparationStep> steps = zeSchema.instance().getPreparationSteps();
assertThat(steps).extracting("class.name").containsExactly(
UpdateCreationModificationUsersAndDateRecordPreparationStep.class.getName(),
ValidateMetadatasRecordPreparationStep.class.getName(),
CalculateMetadatasRecordPreparationStep.class.getName(),
ValidateCyclicReferencesRecordPreparationStep.class.getName(),
ValidateMetadatasRecordPreparationStep.class.getName(),
ValidateUsingSchemaValidatorsRecordPreparationStep.class.getName(),
SequenceRecordPreparationStep.class.getName(),
CalculateMetadatasRecordPreparationStep.class.getName(),
ValidateMetadatasRecordPreparationStep.class.getName(),
ValidateUsingSchemaValidatorsRecordPreparationStep.class.getName()
);
assertThat(((ValidateMetadatasRecordPreparationStep) steps.get(1)).getMetadatasCodes())
.contains(zeSchema.stringMetadata().getCode());
assertThat(((CalculateMetadatasRecordPreparationStep) steps.get(2)).getMetadatasCodes())
.contains(zeSchema.anotherStringMetadata().getCode())
.doesNotContain("zeSchemaType_default_metaDependentOfSeq1", "zeSchemaType_default_metaDependentOfSeq4",
"zeSchemaType_default_metaDependentOfSeq3", "zeSchemaType_default_metaDependentOfSeq2",
"zeSchemaType_default_metaDependentOfSeq0");
assertThat(((ValidateMetadatasRecordPreparationStep) steps.get(4)).getMetadatasCodes())
.contains(zeSchema.anotherStringMetadata().getCode())
.doesNotContain("zeSchemaType_default_metaDependentOfSeq1", "zeSchemaType_default_metaDependentOfSeq4",
"zeSchemaType_default_metaDependentOfSeq3", "zeSchemaType_default_metaDependentOfSeq2",
"zeSchemaType_default_metaDependentOfSeq0");
assertThat(((ValidateUsingSchemaValidatorsRecordPreparationStep) steps.get(5)).getValidators()).extracting("class.name")
.contains(TestRecordValidator1.class.getName());
assertThat(((SequenceRecordPreparationStep) steps.get(6)).getMetadatasCodes())
.containsExactly("zeSchemaType_default_dynamicSequenceMetadata");
assertThat(((CalculateMetadatasRecordPreparationStep) steps.get(7)).getMetadatasCodes())
.containsExactly("zeSchemaType_default_metaDependentOfSeq1", "zeSchemaType_default_metaDependentOfSeq4",
"zeSchemaType_default_metaDependentOfSeq3", "zeSchemaType_default_metaDependentOfSeq2",
"zeSchemaType_default_metaDependentOfSeq0");
assertThat(((ValidateMetadatasRecordPreparationStep) steps.get(8)).getMetadatasCodes())
.containsExactly("zeSchemaType_default_metaDependentOfSeq1", "zeSchemaType_default_metaDependentOfSeq4",
"zeSchemaType_default_metaDependentOfSeq3", "zeSchemaType_default_metaDependentOfSeq2",
"zeSchemaType_default_metaDependentOfSeq0");
assertThat(((ValidateUsingSchemaValidatorsRecordPreparationStep) steps.get(9)).getValidators()).extracting("class.name")
.contains(TestRecordValidator1.class.getName());
}
@Test
public void givenFixedSequenceMetadataThenMetadataAndThoseDependingOnItAreCalculatedAndValidatedAtTheEnd()
throws Exception {
defineSchemasManager().using(setup.withAStringMetadata()
.withAnotherStringMetadata(whichIsCalculatedUsingPattern("'Calculated : ' + stringMetadata"))
.withRecordValidator(TestRecordValidator1.class)
.withAFixedSequence().with(new MetadataSchemaTypesConfigurator() {
@Override
public void configure(MetadataSchemaTypesBuilder schemaTypes) {
MetadataSchemaBuilder zeSchema = schemaTypes.getSchema("zeSchemaType_default");
zeSchema.create("metaDependentOfSeq1").setType(STRING).defineDataEntry().asJexlScript(
"fixedSequenceMetadata + 'test'");
zeSchema.create("metaDependentOfSeq2").setType(STRING).defineDataEntry().asJexlScript(
"metaDependentOfSeq1 + metaDependentOfSeq3");
zeSchema.create("metaDependentOfSeq0").setType(STRING).defineDataEntry().asJexlScript(
"'test' + metaDependentOfSeq2");
zeSchema.create("metaDependentOfSeq3").setType(STRING).defineDataEntry().asJexlScript(
"fixedSequenceMetadata + metaDependentOfSeq4 + metaDependentOfSeq1");
zeSchema.create("metaDependentOfSeq4").setType(STRING).defineDataEntry().asJexlScript(
"fixedSequenceMetadata + anotherStringMetadata");
}
}));
List<RecordPreparationStep> steps = zeSchema.instance().getPreparationSteps();
assertThat(steps).extracting("class.name").containsExactly(
UpdateCreationModificationUsersAndDateRecordPreparationStep.class.getName(),
ValidateMetadatasRecordPreparationStep.class.getName(),
CalculateMetadatasRecordPreparationStep.class.getName(),
ValidateCyclicReferencesRecordPreparationStep.class.getName(),
ValidateMetadatasRecordPreparationStep.class.getName(),
ValidateUsingSchemaValidatorsRecordPreparationStep.class.getName(),
SequenceRecordPreparationStep.class.getName(),
CalculateMetadatasRecordPreparationStep.class.getName(),
ValidateMetadatasRecordPreparationStep.class.getName(),
ValidateUsingSchemaValidatorsRecordPreparationStep.class.getName()
);
assertThat(((ValidateMetadatasRecordPreparationStep) steps.get(1)).getMetadatasCodes())
.contains(zeSchema.stringMetadata().getCode());
assertThat(((CalculateMetadatasRecordPreparationStep) steps.get(2)).getMetadatasCodes())
.contains(zeSchema.anotherStringMetadata().getCode())
.doesNotContain("zeSchemaType_default_metaDependentOfSeq1", "zeSchemaType_default_metaDependentOfSeq4",
"zeSchemaType_default_metaDependentOfSeq3", "zeSchemaType_default_metaDependentOfSeq2",
"zeSchemaType_default_metaDependentOfSeq0");
assertThat(((ValidateMetadatasRecordPreparationStep) steps.get(4)).getMetadatasCodes())
.contains(zeSchema.anotherStringMetadata().getCode())
.doesNotContain("zeSchemaType_default_metaDependentOfSeq1", "zeSchemaType_default_metaDependentOfSeq4",
"zeSchemaType_default_metaDependentOfSeq3", "zeSchemaType_default_metaDependentOfSeq2",
"zeSchemaType_default_metaDependentOfSeq0");
assertThat(((ValidateUsingSchemaValidatorsRecordPreparationStep) steps.get(5)).getValidators()).extracting("class.name")
.contains(TestRecordValidator1.class.getName());
assertThat(((SequenceRecordPreparationStep) steps.get(6)).getMetadatasCodes())
.containsExactly("zeSchemaType_default_fixedSequenceMetadata");
assertThat(((CalculateMetadatasRecordPreparationStep) steps.get(7)).getMetadatasCodes())
.containsExactly("zeSchemaType_default_metaDependentOfSeq1", "zeSchemaType_default_metaDependentOfSeq4",
"zeSchemaType_default_metaDependentOfSeq3", "zeSchemaType_default_metaDependentOfSeq2",
"zeSchemaType_default_metaDependentOfSeq0");
assertThat(((ValidateMetadatasRecordPreparationStep) steps.get(8)).getMetadatasCodes())
.containsExactly("zeSchemaType_default_metaDependentOfSeq1", "zeSchemaType_default_metaDependentOfSeq4",
"zeSchemaType_default_metaDependentOfSeq3", "zeSchemaType_default_metaDependentOfSeq2",
"zeSchemaType_default_metaDependentOfSeq0");
assertThat(((ValidateUsingSchemaValidatorsRecordPreparationStep) steps.get(9)).getValidators()).extracting("class.name")
.contains(TestRecordValidator1.class.getName());
}
}