package com.constellio.model.services.schemas;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.constellio.data.dao.dto.records.RecordDTO;
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.entities.schemas.MetadataSchemaType;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.services.records.RecordImpl;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypeBuilder;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.TestRecord;
import com.constellio.sdk.tests.schemas.SchemasSetup;
public class RecordsModificationBuilderAcceptTest extends ConstellioTest {
RecordsModificationBuilder builder;
@Mock MetadataSchemasManager metadataSchemasManager;
MetadataSchemaTypes types;
MetadataSchemaType type1;
MetadataSchemaType type2;
MetadataSchemaType type3;
MetadataSchemaType type4;
Metadata type1M1;
Metadata type1Custom1M3;
Metadata type1Custom2M4;
Metadata type1M2;
Metadata type2M1;
Metadata type2M2;
Metadata type2M3;
Metadata type3M1;
Metadata type4M1;
RecordImpl aRecordOfType1WithModifiedMetadataM1;
RecordImpl aRecordOfType1WithModifiedMetadataM2;
RecordImpl aRecordOfType1WithModifiedCustom1MetadataM3;
RecordImpl aRecordOfType1WithModifiedCustom2MetadataM3;
RecordImpl aRecordOfType2WithModifiedMetadataM1AndM2;
RecordImpl aRecordOfType2WithModifiedMetadataM3;
RecordImpl aRecordOfType3WithModifiedMetadataM1;
RecordImpl aRecordOfType3WithoutModifiedMetadata;
RecordImpl aRecordOfType4WithModifiedMetadataM1;
@Mock RecordServices recordServices;
@Mock Record aRecordOfType5WithoutModifiedMetadata;
List<Record> records;
@Before
public void setUp()
throws Exception {
builder = new RecordsModificationBuilder(recordServices);
defineSchemaTypes();
aRecordOfType1WithModifiedMetadataM1 = savedRecordWithModifiedMetadatas("type1_default",
"aRecordOfType1WithModifiedMetadataM1", type1M1);
aRecordOfType1WithModifiedMetadataM2 = savedRecordWithModifiedMetadatas("type1_default",
"aRecordOfType1WithModifiedMetadataM2", type1M2);
aRecordOfType1WithModifiedCustom1MetadataM3 = savedRecordWithModifiedMetadatas("type1_custom1",
"aRecordOfType1WithModifiedCustom1MetadataM3", type1Custom1M3);
aRecordOfType1WithModifiedCustom2MetadataM3 = savedRecordWithModifiedMetadatas("type1_custom2",
"aRecordOfType1WithModifiedCustom2MetadataM4", type1Custom2M4);
aRecordOfType2WithModifiedMetadataM1AndM2 = savedRecordWithModifiedMetadatas("type2_default",
"aRecordOfType2WithModifiedMetadataM1AndM2", type2M1, type2M2);
aRecordOfType2WithModifiedMetadataM3 = savedRecordWithModifiedMetadatas("type2_default",
"aRecordOfType2WithModifiedMetadataM3", type2M3);
aRecordOfType3WithModifiedMetadataM1 = savedRecordWithModifiedMetadatas("type3_default",
"aRecordOfType3WithModifiedMetadataM1", type3M1);
aRecordOfType3WithoutModifiedMetadata = savedRecordWithModifiedMetadatas("type3_default",
"aRecordOfType3WithoutModifiedMetadata");
aRecordOfType4WithModifiedMetadataM1 = savedRecordWithModifiedMetadatas("type4_default",
"aRecordOfType4WithModifiedMetadataM1", type4M1);
aRecordOfType5WithoutModifiedMetadata = savedRecordWithModifiedMetadatas("type5_default",
"aRecordOfType5WithoutModifiedMetadata");
records = Arrays.asList(aRecordOfType1WithModifiedMetadataM1, aRecordOfType1WithModifiedMetadataM2,
aRecordOfType1WithModifiedCustom1MetadataM3, aRecordOfType1WithModifiedCustom2MetadataM3,
aRecordOfType2WithModifiedMetadataM1AndM2, aRecordOfType2WithModifiedMetadataM3,
aRecordOfType3WithModifiedMetadataM1, aRecordOfType3WithoutModifiedMetadata,
aRecordOfType4WithModifiedMetadataM1, aRecordOfType5WithoutModifiedMetadata);
}
@Test
public void whenBuildRecordModificationsThenBuildModificationsForEachTypes()
throws Exception {
List<RecordsModification> recordsModifications = builder.build(new Transaction(records), types);
assertThat(recordsModifications).hasSize(4);
assertThat(recordsModifications.get(0).getMetadataSchemaType()).isEqualTo(type1);
assertThat(recordsModifications.get(0).getModifiedMetadatas())
.containsOnly(type1M1, type1M2, type1Custom1M3, type1Custom2M4);
assertThat(recordsModifications.get(0).getRecords()).containsOnly(aRecordOfType1WithModifiedMetadataM1,
aRecordOfType1WithModifiedMetadataM2, aRecordOfType1WithModifiedCustom1MetadataM3,
aRecordOfType1WithModifiedCustom2MetadataM3);
assertThat(recordsModifications.get(1).getMetadataSchemaType()).isEqualTo(type3);
assertThat(recordsModifications.get(1).getModifiedMetadatas()).containsOnly(type3M1);
assertThat(recordsModifications.get(1).getRecords()).containsOnly(aRecordOfType3WithModifiedMetadataM1);
assertThat(recordsModifications.get(2).getMetadataSchemaType()).isEqualTo(type2);
assertThat(recordsModifications.get(2).getModifiedMetadatas()).containsOnly(type2M1, type2M2, type2M3);
assertThat(recordsModifications.get(2).getRecords()).containsOnly(aRecordOfType2WithModifiedMetadataM1AndM2,
aRecordOfType2WithModifiedMetadataM3);
assertThat(recordsModifications.get(3).getMetadataSchemaType()).isEqualTo(type4);
assertThat(recordsModifications.get(3).getModifiedMetadatas()).containsOnly(type4M1);
assertThat(recordsModifications.get(3).getRecords()).containsOnly(aRecordOfType4WithModifiedMetadataM1);
}
private RecordImpl savedRecordWithModifiedMetadatas(String schema, String id, Metadata... metadatas) {
Map<String, Object> fields = new HashMap<String, Object>();
fields.put("collection_s", zeCollection);
fields.put("schema_s", "zeSchema_default");
RecordImpl record = spy(new TestRecord(schema, "zeCollection", id));
record.refresh(1, new RecordDTO(id, 1, null, fields));
for (Metadata metadata : metadatas) {
record.set(metadata, "aNewValue");
}
return record;
}
private void defineSchemaTypes() {
RecordsModificationsBuilderAcceptSetup setup = new RecordsModificationsBuilderAcceptSetup("zeCollection");
define(metadataSchemasManager).using(setup);
types = metadataSchemasManager.getSchemaTypes("zeCollection");
doReturn(Arrays.asList("type5", "type1", "type3", "type2", "type4", "type6")).when(
types).getSchemaTypesSortedByDependency();
type1 = metadataSchemasManager.getSchemaTypes("zeCollection").getSchemaType("type1");
type2 = metadataSchemasManager.getSchemaTypes("zeCollection").getSchemaType("type2");
type3 = metadataSchemasManager.getSchemaTypes("zeCollection").getSchemaType("type3");
type4 = metadataSchemasManager.getSchemaTypes("zeCollection").getSchemaType("type4");
type1M1 = type1.getMetadata("type1_default_m1");
type1M2 = type1.getMetadata("type1_default_m2");
type1Custom1M3 = type1.getMetadata("type1_custom1_m3");
type1Custom2M4 = type1.getMetadata("type1_custom2_m4");
type2M1 = type2.getMetadata("type2_default_m1");
type2M2 = type2.getMetadata("type2_default_m2");
type2M3 = type2.getMetadata("type2_default_m3");
type3M1 = type3.getMetadata("type3_default_m1");
type4M1 = type4.getMetadata("type4_default_m1");
}
protected static class RecordsModificationsBuilderAcceptSetup extends SchemasSetup {
public RecordsModificationsBuilderAcceptSetup(String collection) {
super(collection);
}
@Override
public void setUp() {
MetadataSchemaTypeBuilder type1 = typesBuilder.createNewSchemaType("type1");
MetadataSchemaTypeBuilder type2 = typesBuilder.createNewSchemaType("type2");
MetadataSchemaTypeBuilder type3 = typesBuilder.createNewSchemaType("type3");
MetadataSchemaTypeBuilder type4 = typesBuilder.createNewSchemaType("type4");
MetadataSchemaTypeBuilder type5 = typesBuilder.createNewSchemaType("type5");
MetadataSchemaTypeBuilder type6 = typesBuilder.createNewSchemaType("type6");
type1.getDefaultSchema().create("m1").setType(MetadataValueType.STRING);
type1.getDefaultSchema().create("m2").setType(MetadataValueType.STRING);
type1.createCustomSchema("custom1").create("m3").setType(MetadataValueType.STRING);
type1.createCustomSchema("custom2").create("m4").setType(MetadataValueType.STRING);
type2.getDefaultSchema().create("m1").setType(MetadataValueType.STRING);
type2.getDefaultSchema().create("m2").setType(MetadataValueType.STRING);
type2.getDefaultSchema().create("m3").setType(MetadataValueType.STRING);
type3.getDefaultSchema().create("m1").setType(MetadataValueType.STRING);
type4.getDefaultSchema().create("m1").setType(MetadataValueType.STRING);
type5.getDefaultSchema().create("m1").setType(MetadataValueType.STRING);
type6.getDefaultSchema().create("m1").setType(MetadataValueType.STRING);
}
}
}