package com.constellio.model.services.schemas;
import static com.constellio.sdk.tests.TestUtils.mockMetadata;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.constellio.model.entities.schemas.AllowedReferences;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.sdk.tests.ConstellioTest;
public class MetadataListTest extends ConstellioTest {
MetadataList metadataList;
Collection<Metadata> metadatas1;
Collection<Metadata> metadatas2;
Metadata metadata1 = mockMetadata("type1_default_metadata1");
Metadata metadata2 = mockMetadata("type1_default_metadata2");
Metadata metadata3 = mockMetadata("type1_default_metadata3");
Metadata USRmetadata4 = mockMetadata("type1_default_USRmetadata4");
@Mock AllowedReferences allowedReferencesMetadata1;
@Mock AllowedReferences allowedReferencesMetadata2;
@Mock AllowedReferences allowedReferencesMetadata3;
@Mock AllowedReferences allowedReferencesUSRmetadata4;
@Before
public void setup()
throws Exception {
when(metadata1.getDataStoreCode()).thenReturn("metadata1_s");
when(metadata2.getDataStoreCode()).thenReturn("metadata2_s");
when(metadata3.getDataStoreCode()).thenReturn("metadata3_s");
when(USRmetadata4.getDataStoreCode()).thenReturn("USRmetadata4_s");
metadatas1 = new ArrayList<>();
metadatas1.add(metadata1);
metadatas1.add(metadata2);
metadatas2 = new ArrayList<>();
metadatas2.add(metadata3);
metadatas2.add(USRmetadata4);
metadataList = spy(new MetadataList());
}
@Test
public void whenNewMetadataListWithCollectionThenTheyAreAdded()
throws Exception {
metadataList = spy(new MetadataList(metadatas1));
assertThat(metadataList.nestedList).hasSize(2);
assertThat(metadataList.nestedList.get(0)).isEqualTo(metadata1);
assertThat(metadataList.codeIndex.get("type1_default_metadata1")).isEqualTo(metadata1);
assertThat(metadataList.codeIndex.get("type1_default_metadata1")).isEqualTo(metadata1);
assertThat(metadataList.datastoreCodeIndex.get("metadata1_s")).isEqualTo(metadata1);
assertThat(metadataList.nestedList.get(1)).isEqualTo(metadata2);
assertThat(metadataList.codeIndex.get("type1_default_metadata2")).isEqualTo(metadata2);
assertThat(metadataList.codeIndex.get("type1_default_metadata2")).isEqualTo(metadata2);
assertThat(metadataList.datastoreCodeIndex.get("metadata2_s")).isEqualTo(metadata2);
}
@Test
public void whenEvaluatingIfContainingAMetadataThenWorkNoMatterIfAMetadataIsFromACustomSchema()
throws Exception {
Metadata defaultMetadata1 = mockMetadata("type1_default_metadata1");
Metadata customMetadata1 = mockMetadata("type1_custom_metadata1");
doReturn(defaultMetadata1).when(customMetadata1).getInheritance();
Metadata defaultMetadata2 = mockMetadata("type1_default_metadata2");
Metadata customMetadata2 = mockMetadata("type1_custom_metadata2");
doReturn(defaultMetadata2).when(customMetadata2).getInheritance();
Metadata customMetadataWithoutInheritance = mockMetadata("type1_custom_metadataWithoutInheritance");
Metadata defaultUSRmetadata4 = mockMetadata("type1_default_USRmetadata4");
Metadata customUSRmetadata4 = mockMetadata("type1_custom_USRmetadata4");
Metadata defaultMetadata1InAnotherType = mockMetadata("type2_default_metadata1");
Metadata customMetadata1InAnotherType = mockMetadata("type2_custom_metadata1");
metadataList.add(defaultMetadata1);
metadataList.add(customMetadata2);
metadataList.add(customMetadataWithoutInheritance);
assertThat(metadataList.contains(defaultMetadata1)).isTrue();
assertThat(metadataList.contains(customMetadata1)).isTrue();
assertThat(metadataList.contains(defaultMetadata2)).isTrue();
assertThat(metadataList.contains(customMetadata2)).isTrue();
assertThat(metadataList.contains(customMetadataWithoutInheritance)).isTrue();
assertThat(metadataList.contains(defaultUSRmetadata4)).isFalse();
assertThat(metadataList.contains(customUSRmetadata4)).isFalse();
assertThat(metadataList.contains(defaultMetadata1InAnotherType)).isFalse();
assertThat(metadataList.contains(customMetadata1InAnotherType)).isFalse();
}
@Test
public void whenAddTwiceSameMetadataThenAddedOnce()
throws Exception {
metadataList.add(metadata1);
metadataList.add(metadata1);
assertThat(metadataList.nestedList).hasSize(1);
assertThat(metadataList.nestedList.get(0)).isEqualTo(metadata1);
assertThat(metadataList.codeIndex.get("type1_default_metadata1")).isEqualTo(metadata1);
assertThat(metadataList.codeIndex.get("type1_default_metadata1")).isEqualTo(metadata1);
assertThat(metadataList.datastoreCodeIndex.get("metadata1_s")).isEqualTo(metadata1);
}
@Test
public void whenAddAllTwiceThenAddOnce()
throws Exception {
metadataList.addAll(metadatas1);
metadataList.addAll(metadatas1);
assertThat(metadataList.nestedList).hasSize(2);
assertThat(metadataList.nestedList.get(0)).isEqualTo(metadata1);
assertThat(metadataList.codeIndex.get("type1_default_metadata1")).isEqualTo(metadata1);
assertThat(metadataList.codeIndex.get("type1_default_metadata1")).isEqualTo(metadata1);
assertThat(metadataList.datastoreCodeIndex.get("metadata1_s")).isEqualTo(metadata1);
assertThat(metadataList.nestedList.get(1)).isEqualTo(metadata2);
assertThat(metadataList.codeIndex.get("type1_default_metadata2")).isEqualTo(metadata2);
assertThat(metadataList.codeIndex.get("type1_default_metadata2")).isEqualTo(metadata2);
assertThat(metadataList.datastoreCodeIndex.get("metadata2_s")).isEqualTo(metadata2);
}
@Test
public void givenMetadatasWhenAddAllToIndexThenAddAll()
throws Exception {
metadataList.addAll(metadatas1);
metadataList.addAll(1, metadatas2);
assertThat(metadataList.nestedList).hasSize(4);
assertThat(metadataList.nestedList.get(0)).isEqualTo(metadata1);
assertThat(metadataList.nestedList.get(1)).isEqualTo(metadata3);
assertThat(metadataList.nestedList.get(2)).isEqualTo(USRmetadata4);
assertThat(metadataList.nestedList.get(3)).isEqualTo(metadata2);
assertThat(metadataList.codeIndex.get("type1_default_metadata1")).isEqualTo(metadata1);
assertThat(metadataList.codeIndex.get("type1_default_metadata1")).isEqualTo(metadata1);
assertThat(metadataList.datastoreCodeIndex.get("metadata1_s")).isEqualTo(metadata1);
assertThat(metadataList.codeIndex.get("type1_default_metadata2")).isEqualTo(metadata2);
assertThat(metadataList.codeIndex.get("type1_default_metadata2")).isEqualTo(metadata2);
assertThat(metadataList.datastoreCodeIndex.get("metadata2_s")).isEqualTo(metadata2);
assertThat(metadataList.codeIndex.get("type1_default_metadata3")).isEqualTo(metadata3);
assertThat(metadataList.codeIndex.get("type1_default_metadata3")).isEqualTo(metadata3);
assertThat(metadataList.datastoreCodeIndex.get("metadata3_s")).isEqualTo(metadata3);
assertThat(metadataList.codeIndex.get("type1_default_USRmetadata4")).isEqualTo(USRmetadata4);
assertThat(metadataList.codeIndex.get("type1_default_USRmetadata4")).isEqualTo(USRmetadata4);
assertThat(metadataList.datastoreCodeIndex.get("USRmetadata4_s")).isEqualTo(USRmetadata4);
}
@Test
public void givenMetadatasWhenAddAllTwiceToIndexThenAddAllOnce()
throws Exception {
metadataList.addAll(metadatas1);
metadataList.addAll(1, metadatas1);
assertThat(metadataList.nestedList).hasSize(2);
assertThat(metadataList.nestedList.get(0)).isEqualTo(metadata1);
assertThat(metadataList.nestedList.get(1)).isEqualTo(metadata2);
assertThat(metadataList.codeIndex.get("type1_default_metadata1")).isEqualTo(metadata1);
assertThat(metadataList.codeIndex.get("type1_default_metadata1")).isEqualTo(metadata1);
assertThat(metadataList.datastoreCodeIndex.get("metadata1_s")).isEqualTo(metadata1);
assertThat(metadataList.codeIndex.get("type1_default_metadata2")).isEqualTo(metadata2);
assertThat(metadataList.codeIndex.get("type1_default_metadata2")).isEqualTo(metadata2);
assertThat(metadataList.datastoreCodeIndex.get("metadata2_s")).isEqualTo(metadata2);
}
@Test
public void whenContainsThenReturnFalse()
throws Exception {
assertThat(metadataList.nestedList).isEmpty();
assertThat(metadataList.contains(metadata1)).isFalse();
assertThat(metadataList.containsAll(metadatas1)).isFalse();
}
@Test
public void givenMetadatasWhenContainsThenReturnTrue()
throws Exception {
metadataList.add(metadata1);
assertThat(metadataList.nestedList).hasSize(1);
assertThat(metadataList.contains(metadata1)).isTrue();
}
@Test
public void givenMetadatasWhenAddToIndexThenAdded()
throws Exception {
metadataList.addAll(metadatas1);
metadataList.add(1, USRmetadata4);
assertThat(metadataList.nestedList).hasSize(3);
assertThat(metadataList.codeIndex.get("type1_default_USRmetadata4")).isEqualTo(USRmetadata4);
assertThat(metadataList.codeIndex.get("type1_default_USRmetadata4")).isEqualTo(USRmetadata4);
assertThat(metadataList.datastoreCodeIndex.get("USRmetadata4_s")).isEqualTo(USRmetadata4);
}
@Test
public void givenMetadatasWhenAddAnAlreadyExistentToIndexThenAdded()
throws Exception {
metadataList.addAll(metadatas1);
metadataList.add(1, metadata1);
assertThat(metadataList.nestedList).hasSize(2);
assertThat(metadataList.nestedList.get(0)).isEqualTo(metadata1);
assertThat(metadataList.nestedList.get(1)).isEqualTo(metadata2);
assertThat(metadataList.codeIndex.get("type1_default_metadata1")).isEqualTo(metadata1);
assertThat(metadataList.codeIndex.get("type1_default_metadata1")).isEqualTo(metadata1);
assertThat(metadataList.datastoreCodeIndex.get("metadata1_s")).isEqualTo(metadata1);
assertThat(metadataList.codeIndex.get("type1_default_metadata2")).isEqualTo(metadata2);
assertThat(metadataList.codeIndex.get("type1_default_metadata2")).isEqualTo(metadata2);
assertThat(metadataList.datastoreCodeIndex.get("metadata2_s")).isEqualTo(metadata2);
assertThat(metadataList.codeIndex.get("type1_default_metadata3")).isNull();
assertThat(metadataList.codeIndex.get("type1_default_metadata3")).isNull();
assertThat(metadataList.datastoreCodeIndex.get("metadata3_s")).isNull();
}
@Test
public void givenMetadatasWhenRemoveThenRemoved()
throws Exception {
metadataList.addAll(metadatas1);
metadataList.remove(metadata1);
assertThat(metadataList.nestedList).hasSize(1);
assertThat(metadataList.nestedList.get(0)).isEqualTo(metadata2);
assertThat(metadataList.contains(metadata1)).isFalse();
}
@Test
public void givenMetadatasWhenRemoveFromIndexThenRemoved()
throws Exception {
metadataList.addAll(metadatas1);
metadataList.remove(0);
assertThat(metadataList.nestedList).hasSize(1);
assertThat(metadataList.nestedList.get(0)).isEqualTo(metadata2);
assertThat(metadataList.contains(metadata1)).isFalse();
}
@Test
public void givenMetadatasWhenRemoveAllThenTheyAreRemoved()
throws Exception {
metadataList.addAll(metadatas1);
metadataList.removeAll(metadatas1);
assertThat(metadataList.nestedList).isEmpty();
assertThat(metadataList.contains(metadata1)).isFalse();
}
@Test
public void givenMetadatasWhenRetainAllThenTheyAreRetained()
throws Exception {
metadataList.addAll(metadatas1);
metadataList.addAll(metadatas2);
metadataList.retainAll(metadatas1);
assertThat(metadataList.nestedList).hasSize(2);
assertThat(metadataList.contains(metadata1)).isTrue();
assertThat(metadataList.contains(metadata2)).isTrue();
assertThat(metadataList.contains(metadata3)).isFalse();
assertThat(metadataList.contains(USRmetadata4)).isFalse();
}
@Test
public void givenMetadatasWhenClearThenAllAreRemovedInIndexes()
throws Exception {
metadataList.addAll(metadatas1);
metadataList.addAll(metadatas2);
metadataList.clear();
assertThat(metadataList.nestedList).isEmpty();
assertThat(metadataList.contains(metadata1)).isFalse();
assertThat(metadataList.contains(metadata2)).isFalse();
assertThat(metadataList.contains(metadata3)).isFalse();
assertThat(metadataList.contains(USRmetadata4)).isFalse();
}
@Test
public void givenMetadatasWhenSetThenSetToIndexes()
throws Exception {
metadataList.addAll(metadatas1);
metadataList.set(0, metadata3);
assertThat(metadataList.nestedList).hasSize(2);
assertThat(metadataList.nestedList.get(0)).isEqualTo(metadata3);
assertThat(metadataList.contains(metadata3)).isTrue();
assertThat(metadataList.contains(metadata1)).isFalse();
}
@Test
public void whenFilterReferencesToThenReturnTwo()
throws Exception {
when(metadata1.getAllowedReferences()).thenReturn(allowedReferencesMetadata1);
when(allowedReferencesMetadata1.getTypeWithAllowedSchemas()).thenReturn("type2");
when(metadata2.getAllowedReferences()).thenReturn(allowedReferencesMetadata2);
when(allowedReferencesMetadata2.getTypeWithAllowedSchemas()).thenReturn("type2");
when(metadata3.getAllowedReferences()).thenReturn(allowedReferencesMetadata3);
when(allowedReferencesMetadata3.getTypeWithAllowedSchemas()).thenReturn("type1");
when(USRmetadata4.getAllowedReferences()).thenReturn(allowedReferencesUSRmetadata4);
when(allowedReferencesUSRmetadata4.getTypeWithAllowedSchemas()).thenReturn("type1");
when(metadata1.getType()).thenReturn(MetadataValueType.REFERENCE);
when(metadata2.getType()).thenReturn(MetadataValueType.REFERENCE);
when(metadata3.getType()).thenReturn(MetadataValueType.REFERENCE);
when(USRmetadata4.getType()).thenReturn(MetadataValueType.REFERENCE);
metadataList.addAll(metadatas1);
metadataList.addAll(metadatas2);
MetadataList filteredMetadataList = metadataList.onlyReferencesToType("type1");
assertThat(filteredMetadataList.nestedList).hasSize(2);
assertThat(filteredMetadataList.nestedList.get(0)).isEqualTo(metadata3);
assertThat(filteredMetadataList.nestedList.get(1)).isEqualTo(USRmetadata4);
assertThat(filteredMetadataList.contains(metadata3)).isTrue();
assertThat(filteredMetadataList.contains(USRmetadata4)).isTrue();
}
@Test
public void whenFilterChildOfThenReturnTwo()
throws Exception {
when(metadata1.isChildOfRelationship()).thenReturn(false);
when(metadata2.isChildOfRelationship()).thenReturn(true);
when(metadata3.isChildOfRelationship()).thenReturn(false);
when(USRmetadata4.isChildOfRelationship()).thenReturn(true);
when(metadata1.getType()).thenReturn(MetadataValueType.REFERENCE);
when(metadata2.getType()).thenReturn(MetadataValueType.REFERENCE);
when(metadata3.getType()).thenReturn(MetadataValueType.REFERENCE);
when(USRmetadata4.getType()).thenReturn(MetadataValueType.REFERENCE);
metadataList.addAll(metadatas1);
metadataList.addAll(metadatas2);
MetadataList filteredMetadataList = metadataList.onlyParentReferences();
assertThat(filteredMetadataList.nestedList).hasSize(2);
assertThat(filteredMetadataList.nestedList.get(0)).isEqualTo(metadata2);
assertThat(filteredMetadataList.nestedList.get(1)).isEqualTo(USRmetadata4);
assertThat(filteredMetadataList.contains(metadata2)).isTrue();
assertThat(filteredMetadataList.contains(USRmetadata4)).isTrue();
}
@Test
public void whenFilterNonParentReferencesThenReturnTwo()
throws Exception {
when(metadata1.isChildOfRelationship()).thenReturn(false);
when(metadata2.isChildOfRelationship()).thenReturn(true);
when(metadata3.isChildOfRelationship()).thenReturn(false);
when(USRmetadata4.isChildOfRelationship()).thenReturn(true);
when(metadata1.getType()).thenReturn(MetadataValueType.REFERENCE);
when(metadata2.getType()).thenReturn(MetadataValueType.REFERENCE);
when(metadata3.getType()).thenReturn(MetadataValueType.REFERENCE);
when(USRmetadata4.getType()).thenReturn(MetadataValueType.REFERENCE);
metadataList.addAll(metadatas1);
metadataList.addAll(metadatas2);
MetadataList filteredMetadataList = metadataList.onlyNonParentReferences();
assertThat(filteredMetadataList.nestedList).hasSize(2);
assertThat(filteredMetadataList.nestedList.get(0)).isEqualTo(metadata1);
assertThat(filteredMetadataList.nestedList.get(1)).isEqualTo(metadata3);
assertThat(filteredMetadataList.contains(metadata1)).isTrue();
assertThat(filteredMetadataList.contains(metadata3)).isTrue();
}
@Test
public void whenFilterEnableThenReturnTwo()
throws Exception {
when(metadata1.isEnabled()).thenReturn(false);
when(metadata2.isEnabled()).thenReturn(true);
when(metadata3.isEnabled()).thenReturn(false);
when(USRmetadata4.isEnabled()).thenReturn(true);
metadataList.addAll(metadatas1);
metadataList.addAll(metadatas2);
MetadataList filteredMetadataList = metadataList.onlyEnabled();
assertThat(filteredMetadataList.nestedList).hasSize(2);
assertThat(filteredMetadataList.nestedList.get(0)).isEqualTo(metadata2);
assertThat(filteredMetadataList.nestedList.get(1)).isEqualTo(USRmetadata4);
assertThat(filteredMetadataList.contains(metadata2)).isTrue();
assertThat(filteredMetadataList.contains(USRmetadata4)).isTrue();
}
@Test
public void whenGetOnlyUSRMetadatasThenOK()
throws Exception {
metadataList.add(metadata1);
metadataList.add(metadata2);
metadataList.add(metadata3);
metadataList.add(USRmetadata4);
assertThat(metadataList.onlyUSR().toLocalCodesList()).containsOnly("USRmetadata4");
}
}