package com.constellio.model.services.schemas.validators; import static com.constellio.sdk.tests.TestUtils.asMap; import static com.constellio.sdk.tests.TestUtils.mockMetadata; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.entry; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import java.util.*; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import com.constellio.model.entities.Language; import com.constellio.model.entities.schemas.AllowedReferences; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.MetadataSchemaType; import com.constellio.model.entities.schemas.MetadataValueType; import com.constellio.model.frameworks.validation.ValidationErrors; import com.constellio.model.frameworks.validation.ValidationException; import com.constellio.model.services.schemas.MetadataList; import com.constellio.sdk.tests.ConstellioTest; public class MetadataSchemaTypeValidatorTest extends ConstellioTest { private static final String aMetadataLabel = "aMetadataLabel"; private static final String aMetadataCode = "aMetadataCode"; MetadataList customSchema2Metadatas; private MetadataSchemaTypeValidator validator; @Mock private ValidationErrors validationErrors; @Mock private Map<String, Object> parameters; @Mock private MetadataSchemaType schemaType; @Mock private MetadataSchema defaultSchema; private MetadataList defaultMetadatas; private Metadata defaultMetadata1 = mockMetadata("zeType_default_metadata1"); private Metadata defaultMetadata2 = mockMetadata("zeType_default_metadata2"); private Metadata defaultMetadata3 = mockMetadata("zeType_default_metadata3"); @Mock private MetadataSchema customSchema1; private MetadataList customMetadatas; private Metadata customMetadata1 = mockMetadata("zeType_custom1_customMetadata1"); private Metadata customMetadata2 = mockMetadata("zeType_custom1_customMetadata2"); @Mock private MetadataSchema customSchema2; @Mock private Metadata aMetadata; private Set<String> allowedSchemas; @Mock private AllowedReferences allowedReferences; @Before public void setup() { validator = spy(new MetadataSchemaTypeValidator()); configureSchemas(); allowedSchemas = new HashSet<String>(); } @Test public void whenValidatingSchemaTypeThenAllSchemasValidated() { doNothing().when(validator).validateReferenceMetadata(any(Metadata.class), eq(validationErrors)); validator.validate(schemaType, validationErrors); verify(validator, times(1)).validateDefaultSchema(defaultSchema, validationErrors); verify(validator, times(1)).validateCustomSchema(customSchema1, validationErrors); verify(validator, times(1)).validateCustomSchema(customSchema2, validationErrors); } @Test public void whenValidatingMetadataThenEveryValidationCalled() { doNothing().when(validator).validateReferenceMetadata(any(Metadata.class), eq(validationErrors)); validator.validateMetadata(aMetadata, validationErrors); verify(validator, times(1)).validateMetadataBasicInfo(aMetadata, validationErrors); verify(validator, times(1)).validateReferenceMetadata(aMetadata, validationErrors); } @Test public void whenValidatingReferenceMetadataWithAllowedReferencesThenNoErrorAdded() throws ValidationException { allowedSchemas.add(aMetadataCode); when(aMetadata.getAllowedReferences()).thenReturn(allowedReferences); when(allowedReferences.getAllowedSchemas()).thenReturn(allowedSchemas); when(aMetadata.getType()).thenReturn(MetadataValueType.REFERENCE); validator.validateReferenceMetadata(aMetadata, validationErrors); verifyZeroInteractions(validationErrors); } @Test public void whenValidatingNonReferenceMetadataWithNoAllowedReferencesThenNoErrorAdded() throws ValidationException { when(aMetadata.getAllowedReferences()).thenReturn(allowedReferences); when(allowedReferences.getAllowedSchemas()).thenReturn(allowedSchemas); when(aMetadata.getType()).thenReturn(MetadataValueType.STRING); validator.validateReferenceMetadata(aMetadata, validationErrors); verifyZeroInteractions(validationErrors); } @Test public void whenValidatingReferenceMetadataWithNoAllowedReferencesThenRightErrorAdded() { when(aMetadata.getAllowedReferences()).thenReturn(allowedReferences); when(allowedReferences.getAllowedSchemas()).thenReturn(allowedSchemas); when(aMetadata.getType()).thenReturn(MetadataValueType.REFERENCE); doReturn(parameters).when(validator).createMapWithCode(aMetadata); validator.validateReferenceMetadata(aMetadata, validationErrors); verify(validationErrors, times(1)).add(validator.getClass(), "NoAllowedReferencesInReferenceMetadata", parameters); } @Test public void whenValidatingNonReferenceMetadataWithAllowedReferencesThenRightErrorAdded() { allowedSchemas.add(aMetadataCode); when(aMetadata.getAllowedReferences()).thenReturn(allowedReferences); when(allowedReferences.getAllowedSchemas()).thenReturn(allowedSchemas); when(aMetadata.getType()).thenReturn(MetadataValueType.STRING); doReturn(parameters).when(validator).createMapWithCodeLabelAndType(aMetadata); validator.validateReferenceMetadata(aMetadata, validationErrors); verify(validationErrors, times(1)).add(validator.getClass(), "AllowedReferencesInNonReferenceMetadata", parameters); } @Test public void whenValidatingInheritedMetadataThenBasicInfoNotValidated() { when(customMetadata1.getInheritance()).thenReturn(aMetadata); doNothing().when(validator).validateReferenceMetadata(any(Metadata.class), eq(validationErrors)); validator.validateMetadata(customMetadata1, validationErrors); verify(validator, never()).validateMetadataBasicInfo(customMetadata1, validationErrors); verify(validator, times(1)).validateReferenceMetadata(customMetadata1, validationErrors); } @Test public void whenValidatingMetadataBasicInfoThenLabelAndTypeValidated() { validator.validateMetadataBasicInfo(aMetadata, validationErrors); verify(validator, times(1)).validateMetadataLabelNotNull(aMetadata, validationErrors); verify(validator, times(1)).validateMetadataTypeNotNull(aMetadata, validationErrors); } @Test public void whenValidatingDefaultSchemaThenAllDefaultMetadatasValidated() { doNothing().when(validator).validateReferenceMetadata(any(Metadata.class), eq(validationErrors)); validator.validateDefaultSchema(defaultSchema, validationErrors); verify(validator, times(1)).validateMetadata(defaultMetadata1, validationErrors); verify(validator, times(1)).validateMetadata(defaultMetadata2, validationErrors); verify(validator, times(1)).validateMetadata(defaultMetadata3, validationErrors); } @Test public void whenValidatingCustomSchemaThenAllCustomMetadatasValidated() { doNothing().when(validator).validateReferenceMetadata(any(Metadata.class), eq(validationErrors)); validator.validateCustomSchema(customSchema1, validationErrors); verify(validator, times(1)).validateMetadata(customMetadata1, validationErrors); verify(validator, times(1)).validateMetadata(customMetadata2, validationErrors); } @Test public void givenMetadataHasLabelWhenValidatingLabelThenNoErrorAdded() { Map<Language, String> labels = new HashMap<Language, String>(); labels.put(Language.French, aMetadataLabel); when(aMetadata.getLabels()).thenReturn(labels); validator.validateMetadataLabelNotNull(aMetadata, validationErrors); verifyZeroInteractions(validationErrors); } @Test public void givenMetadataHasNoLabelWhenValidatingLabelThenCorrectErrorAdded() { doReturn(parameters).when(validator).createMapWithCode(aMetadata); validator.validateMetadataLabelNotNull(aMetadata, validationErrors); verify(validationErrors, times(1)).add(validator.getClass(), "NoLabelInNonInheritedMetadata", parameters); } @Test public void givenMetadataHasNoTypeWhenValidatingTypeThenCorrectErrorAdded() { doReturn(parameters).when(validator).createMapWithCode(aMetadata); validator.validateMetadataTypeNotNull(aMetadata, validationErrors); verify(validationErrors, times(1)).add(validator.getClass(), "NoTypeInNonInheritedMetadata", parameters); } @Test public void givenMetadataHasTypeWhenValidatingTypeThenNoErrorAdded() { when(aMetadata.getType()).thenReturn(MetadataValueType.STRING); validator.validateMetadataTypeNotNull(aMetadata, validationErrors); verifyZeroInteractions(validationErrors); } @Test public void whenCreatingMapWithCodeAndLabelThenContentIsCorrect() { when(aMetadata.getLocalCode()).thenReturn(aMetadataCode); when(aMetadata.getLabelsByLanguageCodes()).thenReturn(asMap("fr", aMetadataLabel)); Map<String, Object> returnedMap = validator.createMapWithCode(aMetadata); assertThat(returnedMap).containsOnly( entry("localCode", aMetadataCode), entry("label", asMap("fr", aMetadataLabel)) ); } @Test public void whenCreatingMapWithCodeLabelAndTypeThenContentIsCorrect() { when(aMetadata.getLocalCode()).thenReturn(aMetadataCode); when(aMetadata.getLabelsByLanguageCodes()).thenReturn(asMap("fr", aMetadataLabel)); when(aMetadata.getType()).thenReturn(MetadataValueType.STRING); Map<String, Object> returnedMap = validator.createMapWithCodeLabelAndType(aMetadata); assertThat(returnedMap).containsOnly( entry("localCode", aMetadataCode), entry("type", "STRING"), entry("label", asMap("fr", aMetadataLabel)) ); } private void configureSchemas() { defaultMetadatas = new MetadataList(defaultMetadata1, defaultMetadata2, defaultMetadata3); List<MetadataSchema> customSchemas = Arrays.asList(customSchema1, customSchema2); customMetadatas = new MetadataList(customMetadata1, customMetadata2); when(schemaType.getDefaultSchema()).thenReturn(defaultSchema); when(schemaType.getSchemas()).thenReturn(customSchemas); when(defaultSchema.getMetadatas()).thenReturn(defaultMetadatas); when(customSchema1.getMetadatas()).thenReturn(customMetadatas); when(customSchema2.getMetadatas()).thenReturn(customMetadatas); when(aMetadata.getAllowedReferences()).thenReturn(allowedReferences); when(allowedReferences.getAllowedSchemas()).thenReturn(allowedSchemas); } }