package com.constellio.model.services.taxonomies;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
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.schemas.Metadata;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup;
import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup.DocumentSchema;
import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup.FolderSchema;
import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup.Taxonomy1FirstSchemaType;
import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup.Taxonomy1SecondSchemaType;
import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup.Taxonomy2CustomSchema;
import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup.Taxonomy2DefaultSchema;
import com.constellio.sdk.tests.setups.TwoTaxonomiesContainingFolderAndDocumentsSetup.TaxonomyRecords;
public class TaxonomiesPathsAcceptanceTest extends ConstellioTest {
TaxonomiesManager taxonomiesManager;
TwoTaxonomiesContainingFolderAndDocumentsSetup schemas =
new TwoTaxonomiesContainingFolderAndDocumentsSetup(zeCollection);
Taxonomy1FirstSchemaType taxonomy1FirstSchema = schemas.new Taxonomy1FirstSchemaType();
Taxonomy1SecondSchemaType taxonomy1SecondSchema = schemas.new Taxonomy1SecondSchemaType();
Taxonomy2DefaultSchema taxonomy2DefaultSchema = schemas.new Taxonomy2DefaultSchema();
Taxonomy2CustomSchema taxonomy2CustomSchema = schemas.new Taxonomy2CustomSchema();
FolderSchema folderSchema = schemas.new FolderSchema();
DocumentSchema documentSchema = schemas.new DocumentSchema();
TaxonomyRecords records;
MetadataSchemasManager schemasManager;
RecordServices recordServices;
private static String taxo1Path(Record... records) {
String collection = "";
StringBuilder sb = new StringBuilder(collection + "/taxo1");
for (Record record : records) {
sb.append("/");
sb.append(record.getId());
}
return sb.toString();
}
private static String taxo2Path(Record... records) {
String collection = "";
StringBuilder sb = new StringBuilder(collection + "/taxo2");
for (Record record : records) {
sb.append("/");
sb.append(record.getId());
}
return sb.toString();
}
@Before
public void setUp()
throws Exception {
schemasManager = getModelLayerFactory().getMetadataSchemasManager();
recordServices = getModelLayerFactory().newRecordServices();
defineSchemasManager().using(schemas);
taxonomiesManager = getModelLayerFactory().getTaxonomiesManager();
for (Taxonomy taxonomy : schemas.getTaxonomies()) {
taxonomiesManager.addTaxonomy(taxonomy, schemasManager);
}
records = schemas.givenTaxonomyRecords(recordServices);
}
@Test
public void whenAddingRootTaxonomyItemThenHasCorrectPath()
throws Exception {
Record record = recordServices.newRecordWithSchema(taxonomy1FirstSchema.instance());
recordServices.add(record);
assertThatPathIsEqualTo(record, taxo1Path(record));
}
@Test
public void whenAddingNodeTaxonomyItemThenHasCorrectPath()
throws Exception {
Record record = recordServices.newRecordWithSchema(taxonomy1FirstSchema.instance());
record.set(taxonomy1FirstSchema.parent(), records.taxo1_firstTypeItem2);
recordServices.add(record);
assertThatPathIsEqualTo(record, taxo1Path(records.taxo1_firstTypeItem2, record));
}
@Test
public void whenAddingNodeTaxonomyItemOfSecondTypeThenHasCorrectPath()
throws Exception {
Record record = recordServices.newRecordWithSchema(taxonomy1SecondSchema.instance());
record.set(taxonomy1SecondSchema.parentOfType2(), records.taxo1_firstTypeItem2_firstTypeItem2_secondTypeItem2);
recordServices.add(record);
assertThatPathIsEqualTo(record, taxo1Path(records.taxo1_firstTypeItem2, records.taxo1_firstTypeItem2_firstTypeItem2,
records.taxo1_firstTypeItem2_firstTypeItem2_secondTypeItem2, record));
}
@Test
public void givenTransactionOfMultipleRecordsAddedChildBeforeParentsWhenExecutingHaveCorrectPath()
throws Exception {
Record firstTypeRecord = recordServices.newRecordWithSchema(taxonomy1FirstSchema.instance());
Record firstTypeLevel2Record = recordServices.newRecordWithSchema(taxonomy1FirstSchema.instance());
Record secondTypeRecord = recordServices.newRecordWithSchema(taxonomy1SecondSchema.instance());
firstTypeLevel2Record.set(taxonomy1FirstSchema.parent(), firstTypeRecord);
secondTypeRecord.set(taxonomy1SecondSchema.parentOfType1(), firstTypeLevel2Record);
Transaction transaction = new Transaction();
transaction.addUpdate(secondTypeRecord);
transaction.addUpdate(firstTypeLevel2Record);
transaction.addUpdate(firstTypeRecord);
recordServices.execute(transaction);
assertThatPathIsEqualTo(firstTypeRecord, taxo1Path(firstTypeRecord));
assertThatPathIsEqualTo(firstTypeLevel2Record, taxo1Path(firstTypeRecord, firstTypeLevel2Record));
assertThatPathIsEqualTo(secondTypeRecord, taxo1Path(firstTypeRecord, firstTypeLevel2Record, secondTypeRecord));
}
@Test
public void givenMultipleRecordsOfDifferentLevelsWithTaxonomyItemInTheirPathWhenTheTaxonomyItemIsMovedThenAllPathModified()
throws Exception {
Record firstTypeRecord = recordServices.newRecordWithSchema(taxonomy1FirstSchema.instance());
Record firstTypeLvl2Record = recordServices.newRecordWithSchema(taxonomy1FirstSchema.instance());
Record secondTypeRecord = recordServices.newRecordWithSchema(taxonomy1SecondSchema.instance());
Record folder = recordServices.newRecordWithSchema(folderSchema.instance());
firstTypeLvl2Record.set(taxonomy1FirstSchema.parent(), firstTypeRecord);
secondTypeRecord.set(taxonomy1SecondSchema.parentOfType1(), firstTypeLvl2Record);
folder.set(folderSchema.taxonomy1(), secondTypeRecord);
recordServices.execute(new Transaction(Arrays.asList(firstTypeRecord, firstTypeLvl2Record, secondTypeRecord, folder)));
assertThatPathIsEqualTo(folder, taxo1Path(firstTypeRecord, firstTypeLvl2Record, secondTypeRecord, folder));
firstTypeRecord.set(taxonomy1FirstSchema.parent(), records.taxo1_firstTypeItem2);
recordServices.update(firstTypeRecord);
recordServices.refresh(firstTypeRecord, firstTypeLvl2Record, secondTypeRecord, folder);
assertThatPathIsEqualTo(firstTypeLvl2Record,
taxo1Path(records.taxo1_firstTypeItem2, firstTypeRecord, firstTypeLvl2Record));
assertThatPathIsEqualTo(secondTypeRecord,
taxo1Path(records.taxo1_firstTypeItem2, firstTypeRecord, firstTypeLvl2Record, secondTypeRecord));
assertThatPathIsEqualTo(folder,
taxo1Path(records.taxo1_firstTypeItem2, firstTypeRecord, firstTypeLvl2Record, secondTypeRecord, folder));
secondTypeRecord.set(taxonomy1SecondSchema.parentOfType1(), records.taxo1_firstTypeItem2);
recordServices.update(secondTypeRecord);
recordServices.refresh(folder);
assertThatPathIsEqualTo(secondTypeRecord, taxo1Path(records.taxo1_firstTypeItem2, secondTypeRecord));
assertThatPathIsEqualTo(folder, taxo1Path(records.taxo1_firstTypeItem2, secondTypeRecord, folder));
}
@Test
public void givenRecordsUsingMultipleTaxonomiesAndMultipleElements()
throws RecordServicesException {
Record folder = recordServices.newRecordWithSchema(folderSchema.instance());
folder.set(folderSchema.taxonomy1(), records.taxo1_firstTypeItem2_secondTypeItem1);
folder.set(folderSchema.taxonomy2(), Arrays.asList(records.taxo2_defaultSchemaItem2_customSchemaItem1,
records.taxo2_defaultSchemaItem2_customSchemaItem2));
Record subFolder = recordServices.newRecordWithSchema(folderSchema.instance());
subFolder.set(folderSchema.parent(), folder);
subFolder.set(folderSchema.taxonomy1(), records.taxo1_firstTypeItem2_secondTypeItem1);
subFolder.set(folderSchema.taxonomy2(), Arrays.asList(records.taxo2_defaultSchemaItem2_customSchemaItem1,
records.taxo2_defaultSchemaItem2_customSchemaItem2));
recordServices.execute(new Transaction(subFolder, folder));
List<String> folderPaths = new ArrayList<>();
folderPaths.add(taxo1Path(records.taxo1_firstTypeItem2, records.taxo1_firstTypeItem2_secondTypeItem1, folder));
folderPaths
.add(taxo2Path(records.taxo2_defaultSchemaItem2, records.taxo2_defaultSchemaItem2_customSchemaItem1, folder));
folderPaths
.add(taxo2Path(records.taxo2_defaultSchemaItem2, records.taxo2_defaultSchemaItem2_customSchemaItem2, folder));
assertThatPathIsEqualTo(folder, folderPaths);
List<String> subFolderPaths = new ArrayList<>();
subFolderPaths.add(
taxo1Path(records.taxo1_firstTypeItem2, records.taxo1_firstTypeItem2_secondTypeItem1, folder, subFolder));
subFolderPaths
.add(taxo2Path(records.taxo2_defaultSchemaItem2, records.taxo2_defaultSchemaItem2_customSchemaItem1, folder,
subFolder));
subFolderPaths
.add(taxo2Path(records.taxo2_defaultSchemaItem2, records.taxo2_defaultSchemaItem2_customSchemaItem2, folder,
subFolder));
//subFolderPaths.add(taxo1Path(records.taxo1_firstTypeItem2, records.taxo1_firstTypeItem2_secondTypeItem1, subFolder));
// subFolderPaths.add(taxo2Path(records.taxo2_defaultSchemaItem2, records.taxo2_defaultSchemaItem2_customSchemaItem1,
// subFolder));
// subFolderPaths.add(taxo2Path(records.taxo2_defaultSchemaItem2, records.taxo2_defaultSchemaItem2_customSchemaItem2,
// subFolder));
assertThatPathIsEqualTo(subFolder, subFolderPaths);
//**
//Change taxonomy 2 in parent folders, all recalculated with new path
//**
folder.set(folderSchema.taxonomy2(),
Arrays.asList(records.taxo2_defaultSchemaItem2_defaultSchemaItem2_customSchemaItem1));
recordServices.update(folder);
recordServices.refresh(subFolder);
folderPaths = new ArrayList<>();
folderPaths.add(taxo1Path(records.taxo1_firstTypeItem2, records.taxo1_firstTypeItem2_secondTypeItem1, folder));
folderPaths
.add(taxo2Path(records.taxo2_defaultSchemaItem2, records.taxo2_defaultSchemaItem2_defaultSchemaItem2,
records.taxo2_defaultSchemaItem2_defaultSchemaItem2_customSchemaItem1, folder));
assertThatPathIsEqualTo(folder, folderPaths);
subFolderPaths = new ArrayList<>();
subFolderPaths
.add(taxo1Path(records.taxo1_firstTypeItem2, records.taxo1_firstTypeItem2_secondTypeItem1, folder, subFolder));
subFolderPaths.add(taxo2Path(records.taxo2_defaultSchemaItem2, records.taxo2_defaultSchemaItem2_defaultSchemaItem2,
records.taxo2_defaultSchemaItem2_defaultSchemaItem2_customSchemaItem1, folder, subFolder));
subFolderPaths.add(taxo2Path(records.taxo2_defaultSchemaItem2, records.taxo2_defaultSchemaItem2_customSchemaItem1,
subFolder));
subFolderPaths.add(taxo2Path(records.taxo2_defaultSchemaItem2, records.taxo2_defaultSchemaItem2_customSchemaItem2,
subFolder));
assertThatPathIsEqualTo(subFolder, subFolderPaths);
//**
//Make subFolder a root folder, paths of parent folder are removed
//**
subFolder.set(folderSchema.parent(), null);
recordServices.update(subFolder);
subFolderPaths = new ArrayList<>();
subFolderPaths.add(taxo1Path(records.taxo1_firstTypeItem2, records.taxo1_firstTypeItem2_secondTypeItem1, subFolder));
subFolderPaths.add(taxo2Path(records.taxo2_defaultSchemaItem2, records.taxo2_defaultSchemaItem2_customSchemaItem1,
subFolder));
subFolderPaths.add(taxo2Path(records.taxo2_defaultSchemaItem2, records.taxo2_defaultSchemaItem2_customSchemaItem2,
subFolder));
assertThatPathIsEqualTo(subFolder, subFolderPaths);
}
private void assertThatPathIsEqualTo(Record record, String path) {
Metadata pathMetadata = schemas.getMetadata(record.getSchemaCode() + "_path");
assertThat((List) record.get(pathMetadata)).containsOnly(path);
}
private void assertThatPathIsEqualTo(Record record, List<String> paths) {
Metadata pathMetadata = schemas.getMetadata(record.getSchemaCode() + "_path");
assertThat((List<String>) record.get(pathMetadata)).containsOnly(paths.toArray(new String[0]));
}
}