package com.constellio.model.entities.schemas;
import static com.constellio.sdk.tests.TestUtils.asMap;
import static com.constellio.sdk.tests.TestUtils.asSet;
import static com.constellio.sdk.tests.TestUtils.mockMetadata;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.Taxonomy;
import com.constellio.model.entities.schemas.validation.RecordValidator;
import com.constellio.sdk.tests.ConstellioTest;
public class MetadataSchemaTest extends ConstellioTest {
Map<Language, String> labels;
@Before
public void setUp()
throws Exception {
labels = new HashMap<>();
labels.put(Language.French, "zeLabel");
}
@Test
public void whenGetTaxonomySchemasMetadataWithChildOfRelationshipThenReturnCorrectMetadatas()
throws Exception {
Metadata firstTypeParentRelationToFirstType = mockMetadata("first_default_parentRelationToFirst");
Metadata secondTypeParentRelationToFirstType = mockMetadata("second_default_parentRelationToFirst");
Metadata secondTypeParentRelationToSecondType = mockMetadata("second_default_parentRelationToSecond");
Metadata secondTypeRelationToSecondType = mockMetadata("second_default_relationToSecond");
Metadata secondTypeParentRelationToThirdType = mockMetadata("second_default_parentRelationToThird");
when(firstTypeParentRelationToFirstType.isChildOfRelationship()).thenReturn(true);
when(secondTypeParentRelationToFirstType.isChildOfRelationship()).thenReturn(true);
when(secondTypeParentRelationToSecondType.isChildOfRelationship()).thenReturn(true);
when(secondTypeParentRelationToThirdType.isChildOfRelationship()).thenReturn(true);
when(firstTypeParentRelationToFirstType.getType()).thenReturn(MetadataValueType.REFERENCE);
when(secondTypeParentRelationToFirstType.getType()).thenReturn(MetadataValueType.REFERENCE);
when(secondTypeParentRelationToSecondType.getType()).thenReturn(MetadataValueType.REFERENCE);
when(secondTypeParentRelationToSecondType.getType()).thenReturn(MetadataValueType.REFERENCE);
when(secondTypeParentRelationToThirdType.getType()).thenReturn(MetadataValueType.REFERENCE);
when(firstTypeParentRelationToFirstType.getAllowedReferences()).thenReturn(new AllowedReferences("first", null));
when(secondTypeParentRelationToFirstType.getAllowedReferences()).thenReturn(new AllowedReferences("first", null));
when(secondTypeParentRelationToSecondType.getAllowedReferences())
.thenReturn(new AllowedReferences("second", null));
when(secondTypeParentRelationToThirdType.getAllowedReferences())
.thenReturn(new AllowedReferences(null, asSet("third_custom1")));
Taxonomy firstTaxonomy = Taxonomy.createPublic("taxo1", "taxo1", "zeCollection", Arrays.asList("first", "second"));
Taxonomy secondTaxonomy = Taxonomy.createPublic("taxo1", "taxo1", "zeCollection", Arrays.asList("third"));
List<Metadata> metadatas = Arrays.asList(secondTypeParentRelationToFirstType, secondTypeParentRelationToSecondType,
secondTypeParentRelationToThirdType, secondTypeRelationToSecondType);
List<Taxonomy> taxonomies = Arrays.asList(firstTaxonomy, secondTaxonomy);
MetadataSchema schema = new MetadataSchema("default", "second_default", "zeCollection", labels, metadatas, false,
true, new HashSet<RecordValidator>(), null);
MetadataSchemaType schemaType = new MetadataSchemaType("second", "zeCollection", asMap(Language.French, "titre"),
new ArrayList<MetadataSchema>(), schema, true, true, true, false);
List<Metadata> returnedMetadatas = schemaType.getTaxonomySchemasMetadataWithChildOfRelationship(taxonomies);
assertThat(returnedMetadatas).containsOnly(secondTypeParentRelationToFirstType, secondTypeParentRelationToSecondType);
}
@Test
public void whenGetTaxonomyReferencesThenReturnCorrectReferences()
throws Exception {
Taxonomy firstTaxonomy = Taxonomy.createPublic("taxo1", "taxo1", "zeCollection", Arrays.asList("t1", "t2"));
Taxonomy secondTaxonomy = Taxonomy.createPublic("taxo2", "taxo2", "zeCollection", Arrays.asList("t3", "t4"));
List<Taxonomy> taxonomies = Arrays.asList(firstTaxonomy, secondTaxonomy);
Metadata taxonomyRelationToT4 = mockTaxonomyRefMetadata("t5_default_taxoRelationToT4", "t4");
Metadata relationToT4 = mockRefMetadata("t5_default_relationToT4", "t4");
Metadata relationToT3Custom = mockRefMetadata("t5_default_relationToT3Custom", asSet("t3_custom"));
Metadata taxonomyRelationToT3Custom = mockTaxonomyRefMetadata("t5_default_taxoRelationToT3Custom", asSet("t3_custom"));
Metadata relationToOtherSchema = mockRefMetadata("t5_default_relationToOther", "other");
Metadata textMetadata = mockedTextMetadata();
List<Metadata> metadatas = Arrays
.asList(relationToT4, taxonomyRelationToT4, relationToT3Custom, taxonomyRelationToT3Custom, relationToOtherSchema,
textMetadata);
MetadataSchema schema = new MetadataSchema("default", "zeType_default", "zeCollection", labels, metadatas, false,
true, new HashSet<RecordValidator>(), null);
List<Metadata> returnedMetadatas = schema.getTaxonomyRelationshipReferences(taxonomies);
assertThat(returnedMetadatas).containsOnly(taxonomyRelationToT4, taxonomyRelationToT3Custom);
}
@Test
public void whenGetTaxonomyReferencesOfSchemaPartOfAnotherTaxonomiesThenOnlyReturnTaxonomiesForWhichTheSchemaIsntPartsOf()
throws Exception {
Taxonomy firstTaxonomy = Taxonomy.createPublic("taxo1", "taxo1", "zeCollection", Arrays.asList("t1", "t2"));
Taxonomy secondTaxonomy = Taxonomy.createPublic("taxo2", "taxo2", "zeCollection", Arrays.asList("t3", "t4"));
List<Taxonomy> taxonomies = Arrays.asList(firstTaxonomy, secondTaxonomy);
Metadata relationToT4 = mockRefMetadata("t2_default_relationToT4", "t4");
Metadata taxonomyRelationToT4 = mockTaxonomyRefMetadata("t2_default_taxoRelationToT4", "t4");
Metadata relationToT3Custom = mockRefMetadata("t2_default_relationToT3Custom", asSet("t3_custom"));
Metadata taxonomyRelationToT3Custom = mockTaxonomyRefMetadata("t2_default_taxoRelationToT3Custom", asSet("t3_custom"));
Metadata relationToOtherSchema = mockRefMetadata("t2_default_relationToOther", "other");
Metadata relationToT1 = mockRefMetadata("t2_default_parentT1", "t1");
Metadata relationToT2 = mockRefMetadata("t2_default_parentT2", "t2");
Metadata textMetadata = mockedTextMetadata();
List<Metadata> metadatas = Arrays
.asList(relationToT4, taxonomyRelationToT4, relationToT3Custom, taxonomyRelationToT3Custom, relationToOtherSchema,
textMetadata, relationToT1, relationToT2);
MetadataSchema schema = new MetadataSchema("default", "t2_default", "zeCollection", labels, metadatas, false,
true, new HashSet<RecordValidator>(), null);
List<Metadata> returnedMetadatas = schema.getTaxonomyRelationshipReferences(taxonomies);
assertThat(returnedMetadatas).containsOnly(taxonomyRelationToT4, taxonomyRelationToT3Custom);
}
private Metadata mockedTextMetadata() {
Metadata textMetadata = mock(Metadata.class, "textMetadata");
when(textMetadata.getType()).thenReturn(MetadataValueType.STRING);
return textMetadata;
}
private Metadata mockTaxonomyRefMetadata(String code, String type) {
Metadata metadata = mockRefMetadata(code, type);
when(metadata.isTaxonomyRelationship()).thenReturn(true);
return metadata;
}
private Metadata mockTaxonomyRefMetadata(String code, Set<String> schemas) {
Metadata metadata = mockRefMetadata(code, schemas);
when(metadata.isTaxonomyRelationship()).thenReturn(true);
return metadata;
}
private Metadata mockRefMetadata(String code, String type) {
String localCode = code.split("_")[2];
Metadata metadata = mock(Metadata.class, code);
when(metadata.getCode()).thenReturn(code);
when(metadata.getLocalCode()).thenReturn(localCode);
when(metadata.getType()).thenReturn(MetadataValueType.REFERENCE);
when(metadata.getAllowedReferences()).thenReturn(new AllowedReferences(type, null));
return metadata;
}
private Metadata mockRefMetadata(String code, Set<String> schemas) {
String localCode = code.split("_")[2];
Metadata metadata = mock(Metadata.class, code);
when(metadata.getCode()).thenReturn(code);
when(metadata.getLocalCode()).thenReturn(localCode);
when(metadata.getType()).thenReturn(MetadataValueType.REFERENCE);
when(metadata.getAllowedReferences()).thenReturn(new AllowedReferences(null, schemas));
return metadata;
}
}