package com.constellio.model.services.records; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import java.util.ArrayList; import java.util.List; import org.joda.time.LocalDateTime; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import com.constellio.model.entities.calculators.CalculatorParameters; import com.constellio.model.entities.calculators.MetadataValueCalculator; import com.constellio.model.entities.calculators.dependencies.Dependency; import com.constellio.model.entities.calculators.dependencies.LocalDependency; import com.constellio.model.entities.calculators.dependencies.ReferenceDependency; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.RecordUpdateOptions; import com.constellio.model.entities.records.Transaction; import com.constellio.model.entities.records.TransactionRecordsReindexation; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.services.records.cache.CachedRecordServices; import com.constellio.model.services.schemas.MetadataList; 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 RecordAutomaticMetadataServicesCopyAcceptanceTest extends ConstellioTest { RecordUpdateOptions options = new RecordUpdateOptions(); CachedRecordServices recordServices; RecordProvider recordProvider; RecordAutomaticMetadataServices services; String idReferencedRecordWithAStringAndADateValue, idReferencedRecordWithAnotherDateValue, idReferencedRecordWithoutValue; RecordImpl record; String aString = aString(); LocalDateTime aDate = aDateTime(); LocalDateTime anotherDate = aDateTime(); List<String> aStringList = asList(aString(), aString()); List<LocalDateTime> aDateList = asList(aDateTime(), aDateTime()); List<LocalDateTime> anotherDateList = asList(aDateTime(), aDateTime()); TestsSchemasSetup schemas; ZeSchemaMetadatas zeSchema; AnotherSchemaMetadatas anotherSchema; @Mock Metadata firstReindexedMetadata, secondReindexedMetadata; TransactionRecordsReindexation reindexedMetadata; @Before public void setUp() { schemas = new TestsSchemasSetup(); zeSchema = schemas.new ZeSchemaMetadatas(); anotherSchema = schemas.new AnotherSchemaMetadatas(); record = new TestRecord(zeSchema); services = new RecordAutomaticMetadataServices(getModelLayerFactory().getMetadataSchemasManager(), getModelLayerFactory().getTaxonomiesManager(), getModelLayerFactory().getSystemConfigurationsManager(), getModelLayerFactory().getModelLayerLogger(), getModelLayerFactory().newSearchServices()); recordServices = spy((CachedRecordServices) getModelLayerFactory().newRecordServices()); recordProvider = new RecordProvider(recordServices, null, new ArrayList<Record>(), new Transaction()); reindexedMetadata = new TransactionRecordsReindexation(new MetadataList(firstReindexedMetadata, secondReindexedMetadata)); } @Test public void givenCopiedMetadataOfNewRecordUsingSingleValueReferenceWhenUpdatingThenCopyValue() throws Exception { givenSchemaWithTextAndDateCopiedEntryUsingSingleValueReferenceAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); record.set(zeSchema.secondReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(aString); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(aDate); } @Test public void givenCopiedMetadataOfNewRecordUsingMultivalueReferenceWhenUpdatingThenCopyValue() throws Exception { givenSchemaWithTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue)); record.set(zeSchema.secondReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue, idReferencedRecordWithAnotherDateValue)); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(asList(aString)); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(asList(aDate, anotherDate)); } @Test public void givenCopiedMultivalueMetadataOfNewRecordWhenUpdatingThenCopyValue() throws Exception { givenSchemaWithMultivalueTextAndDateCopiedEntryAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); record.set(zeSchema.secondReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(aStringList); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(aDateList); } @Test public void givenCopiedMultivalueMetadataOfNewRecordWithMultivalueReferencesWhenUpdatingThenCopyValue() throws Exception { givenSchemaWithMultivalueTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue, idReferencedRecordWithAStringAndADateValue)); record.set(zeSchema.secondReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue, idReferencedRecordWithAnotherDateValue)); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); List<String> expectedStrings = new ArrayList<>(); expectedStrings.addAll(aStringList); expectedStrings.addAll(aStringList); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(expectedStrings); List<LocalDateTime> expectedDates = new ArrayList<>(); expectedDates.addAll(aDateList); expectedDates.addAll(anotherDateList); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(expectedDates); } @Test public void givenCopiedMetadataOfNewRecordReferencingARecordWithoutCopiedValueWhenUpdatingThenCopiedValueIsNull() throws Exception { givenSchemaWithTextAndDateCopiedEntryUsingSingleValueReferenceAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), idReferencedRecordWithoutValue); record.set(zeSchema.secondReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isNull(); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(aDate); } @Test public void givenCopiedMetadataOfNewRecordReferencingMutlipleRecordsWithoutCopiedValueWhenUpdatingThenCopiedValueIsNull() throws Exception { givenSchemaWithTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithoutValue)); record.set(zeSchema.secondReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue, idReferencedRecordWithoutValue)); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(new ArrayList<>()); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(asList(aDate)); } @Test public void givenCopiedMultivalueMetadataOfNewRecordReferencingARecordWithoutCopiedValueWhenUpdatingThenCopiedValueIsEmptyList() throws Exception { givenSchemaWithMultivalueTextAndDateCopiedEntryAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), idReferencedRecordWithoutValue); record.set(zeSchema.secondReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(new ArrayList<>()); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(aDateList); } @Test public void givenCopiedMultivalueMetadataOfNewRecordWithMultivalueReferencesToRecordsWithoutValueWhenUpdatingThenCopiedValueIsEmptyList() throws Exception { givenSchemaWithMultivalueTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithoutValue, idReferencedRecordWithoutValue)); record.set(zeSchema.secondReferenceToAnotherSchema(), asList(idReferencedRecordWithoutValue, idReferencedRecordWithAStringAndADateValue)); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(new ArrayList<>()); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(aDateList); } @Test public void givenCopiedMetadataOfNewRecordWithoutReferencedValueWhenUpdatingThenCopiedValueIsNull() throws Exception { givenSchemaWithTextAndDateCopiedEntryUsingSingleValueReferenceAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(aString); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isNull(); } @Test public void givenCopiedMetadataOfNewRecordWithUndefinedReferenceListWhenUpdatingThenCopiedValueIsEmptyLust() throws Exception { givenSchemaWithTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue)); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(asList(aString)); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(new ArrayList<>()); } @Test public void givenCopiedMetadataOfNewRecordWithEmptyReferenceListWhenUpdatingThenCopiedValueIsEmptyLust() throws Exception { givenSchemaWithTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue)); record.set(zeSchema.secondReferenceToAnotherSchema(), new ArrayList<>()); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(asList(aString)); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(new ArrayList<>()); } @Test public void givenCopiedMultivalueMetadataOfNewRecordWithoutReferencedValueWhenUpdatingThenCopiedValueIsEmptyList() throws Exception { givenSchemaWithMultivalueTextAndDateCopiedEntryAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(aStringList); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(new ArrayList<>()); } @Test public void givenCopiedMultivalueMetadataOfNewRecordWithUndefinedReferencesListValueWhenUpdatingThenCopiedValueIsEmptyList() throws Exception { givenSchemaWithMultivalueTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue)); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.getList(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(aStringList); assertThat(record.getList(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(new ArrayList<>()); } @Test public void givenCopiedMultivalueMetadataOfNewRecordWithEmptyReferencesListValueWhenUpdatingThenCopiedValueIsEmptyList() throws Exception { givenSchemaWithMultivalueTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), new ArrayList<>()); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue)); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(aStringList); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(new ArrayList<>()); } @Test public void givenCopiedMetadataOfExistingRecordWhenUpdatingThenDoNotCopyIfReferenceIsNotModified() throws Exception { givenSchemaWithTextAndDateCopiedEntryUsingSingleValueReferenceAndSomeRecordsInOtherSchema(); reset(recordServices); record.set(zeSchema.firstReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); record.set(zeSchema.secondReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); add(); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.getModifiedValues().isEmpty()); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(aString); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(aDate); verifyZeroInteractions(recordServices); } @Test public void givenCopiedMetadataOfExistingRecordWhenUpdatingThenDoNotCopyIfReferenceListIsNotModified() throws Exception { givenSchemaWithTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema(); reset(recordServices); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue)); record.set(zeSchema.secondReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue)); add(); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.getModifiedValues().isEmpty()); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(asList(aString)); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(asList(aDate)); verifyZeroInteractions(recordServices); } @Test public void givenCopiedMultivalueMetadataOfExistingRecordWhenUpdatingThenDoNotCopyIfReferenceIsNotModified() throws Exception { givenSchemaWithMultivalueTextAndDateCopiedEntryAndSomeRecordsInOtherSchema(); reset(recordServices); record.set(zeSchema.firstReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); record.set(zeSchema.secondReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); add(); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.getModifiedValues().isEmpty()); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(aStringList); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(aDateList); verifyZeroInteractions(recordServices); } @Test public void givenCopiedMultivalueMetadataOfExistingRecordWithMultivalueReferencesWhenUpdatingThenDoNotCopyIfReferenceIsNotModified() throws Exception { givenSchemaWithMultivalueTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema(); reset(recordServices); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue)); record.set(zeSchema.secondReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue)); add(); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.getModifiedValues().isEmpty()); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(aStringList); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(aDateList); verifyZeroInteractions(recordServices); } @Test public void givenCopiedMetadataOfExistingRecordWhenUpdatingThenOnlyCopyValuesWithDifferentReference() throws Exception { givenSchemaWithTextAndDateCopiedEntryUsingSingleValueReferenceAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); record.set(zeSchema.secondReferenceToAnotherSchema(), idReferencedRecordWithoutValue); add(); record.set(zeSchema.secondReferenceToAnotherSchema(), idReferencedRecordWithAnotherDateValue); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(aString); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(anotherDate); verify(recordServices).getDocumentById(idReferencedRecordWithAnotherDateValue); verify(recordServices, never()).getDocumentById(idReferencedRecordWithoutValue); verify(recordServices, never()).getDocumentById(idReferencedRecordWithAStringAndADateValue); } @Test public void givenCopiedMetadataOfExistingRecordWhenUpdatingThenOnlyCopyValuesWithDifferentReferenceList() throws Exception { givenSchemaWithTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue, idReferencedRecordWithAStringAndADateValue)); record.set(zeSchema.secondReferenceToAnotherSchema(), asList(idReferencedRecordWithoutValue)); add(); record.set(zeSchema.secondReferenceToAnotherSchema(), asList(idReferencedRecordWithAnotherDateValue)); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(asList(aString, aString)); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(asList(anotherDate)); verify(recordServices).getDocumentById(idReferencedRecordWithAnotherDateValue); verify(recordServices, never()).getDocumentById(idReferencedRecordWithoutValue); verify(recordServices, never()).getDocumentById(idReferencedRecordWithAStringAndADateValue); } @Test public void givenCopiedMultivalueMetadataOfExistingRecordWhenUpdatingThenOnlyCopyValuesWithDifferentReferences() throws Exception { givenSchemaWithMultivalueTextAndDateCopiedEntryAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), idReferencedRecordWithAStringAndADateValue); record.set(zeSchema.secondReferenceToAnotherSchema(), idReferencedRecordWithoutValue); add(); record.set(zeSchema.secondReferenceToAnotherSchema(), idReferencedRecordWithAnotherDateValue); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(aStringList); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(anotherDateList); verify(recordServices).getDocumentById(idReferencedRecordWithAnotherDateValue); verify(recordServices, never()).getDocumentById(idReferencedRecordWithoutValue); verify(recordServices, never()).getDocumentById(idReferencedRecordWithAStringAndADateValue); } public void givenCopiedMultivalueMetadataOfExistingRecordWithMultivalueReferencesWhenUpdatingThenOnlyCopyValuesWithDifferentReferences() throws Exception { givenSchemaWithMultivalueTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema(); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue)); record.set(zeSchema.secondReferenceToAnotherSchema(), asList(idReferencedRecordWithoutValue)); add(); record.set(zeSchema.firstReferenceToAnotherSchema(), asList(idReferencedRecordWithAStringAndADateValue)); record.set(zeSchema.secondReferenceToAnotherSchema(), asList(idReferencedRecordWithAnotherDateValue)); services.updateAutomaticMetadatas(record, recordProvider, reindexedMetadata, options); assertThat(record.get(zeSchema.stringCopiedFromFirstReferenceStringMeta())).isEqualTo(aStringList); assertThat(record.get(zeSchema.dateCopiedFromSecondReferenceDateMeta())).isEqualTo(anotherDateList); verify(recordServices).getDocumentById(idReferencedRecordWithAnotherDateValue); verify(recordServices, never()).getDocumentById(idReferencedRecordWithoutValue); verify(recordServices, never()).getDocumentById(idReferencedRecordWithAStringAndADateValue); } private List<String> toCodeList(List<Metadata> metadatas) { List<String> codes = new ArrayList<>(); for (Metadata metadata : metadatas) { codes.add(metadata.getCode()); } return codes; } private <T> MetadataValueCalculator<T> newCalculatorWithLocalDependencies(final String... dependenciesCode) { return new MetadataValueCalculator<T>() { @Override public T calculate(CalculatorParameters parameters) { throw new UnsupportedOperationException("TODO"); } @Override public T getDefaultValue() { throw new UnsupportedOperationException("TODO"); } @Override public MetadataValueType getReturnType() { throw new UnsupportedOperationException("TODO"); } @Override public List<? extends Dependency> getDependencies() { List<Dependency> dependencies = new ArrayList<>(); for (String dependencyCode : dependenciesCode) { dependencies.add(LocalDependency.toAString(dependencyCode).whichIsRequired()); } return dependencies; } @Override public boolean isMultiValue() { return false; } }; } private <T> MetadataValueCalculator<T> newCalculatorWithReferenceDependencies(final String... dependenciesCode) { return new MetadataValueCalculator<T>() { @Override public T calculate(CalculatorParameters parameters) { throw new UnsupportedOperationException("TODO"); } @Override public T getDefaultValue() { throw new UnsupportedOperationException("TODO"); } @Override public MetadataValueType getReturnType() { throw new UnsupportedOperationException("TODO"); } @Override public List<? extends Dependency> getDependencies() { List<Dependency> dependencies = new ArrayList<>(); for (String dependencyCode : dependenciesCode) { dependencies.add(ReferenceDependency.toAString(dependencyCode, "notImportant").whichIsRequired()); } return dependencies; } @Override public boolean isMultiValue() { return false; } }; } private void add() throws RecordServicesException { RecordServices recordServices = getModelLayerFactory().newRecordServices(); recordServices.add(record); } protected void givenSchemaWithTextAndDateCopiedEntryUsingSingleValueReferenceAndSomeRecordsInOtherSchema() throws Exception { defineSchemasManager().using( schemas.withTwoMetadatasCopyingAnotherSchemaValuesUsingTwoDifferentReferenceMetadata(false, false, false)); defineAnotherSchemaRecordsWithSinglevalueMetadata(); } protected void givenSchemaWithTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema() throws Exception { defineSchemasManager().using( schemas.withTwoMetadatasCopyingAnotherSchemaValuesUsingTwoDifferentReferenceMetadata(false, true, false)); defineAnotherSchemaRecordsWithSinglevalueMetadata(); } protected void givenSchemaWithMultivalueTextAndDateCopiedEntryAndSomeRecordsInOtherSchema() throws Exception { defineSchemasManager().using( schemas.withTwoMetadatasCopyingAnotherSchemaValuesUsingTwoDifferentReferenceMetadata(true, false, false)); defineAnotherSchemaRecordsWithMultivaluesMetadata(); } protected void givenSchemaWithMultivalueTextAndDateCopiedEntryUsingMultivalueReferencesAndSomeRecordsInOtherSchema() throws Exception { defineSchemasManager().using( schemas.withTwoMetadatasCopyingAnotherSchemaValuesUsingTwoDifferentReferenceMetadata(true, true, false)); defineAnotherSchemaRecordsWithMultivaluesMetadata(); } private void defineAnotherSchemaRecordsWithSinglevalueMetadata() throws RecordServicesException { Record record = new TestRecord(anotherSchema); record.set(anotherSchema.stringMetadata(), aString); record.set(anotherSchema.dateMetadata(), aDate); recordServices.add(record); idReferencedRecordWithAStringAndADateValue = record.getId(); record = new TestRecord(anotherSchema); record.set(anotherSchema.dateMetadata(), anotherDate); recordServices.add(record); idReferencedRecordWithAnotherDateValue = record.getId(); record = new TestRecord(anotherSchema); recordServices.add(record); idReferencedRecordWithoutValue = record.getId(); } private void defineAnotherSchemaRecordsWithMultivaluesMetadata() throws RecordServicesException { Record record = new TestRecord(anotherSchema); record.set(anotherSchema.stringMetadata(), aStringList); record.set(anotherSchema.dateMetadata(), aDateList); recordServices.add(record); idReferencedRecordWithAStringAndADateValue = record.getId(); record = new TestRecord(anotherSchema); record.set(anotherSchema.dateMetadata(), anotherDateList); recordServices.add(record); idReferencedRecordWithAnotherDateValue = record.getId(); record = new TestRecord(anotherSchema); recordServices.add(record); idReferencedRecordWithoutValue = record.getId(); } }