package com.constellio.model.services.records.validators;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalDateTime;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.frameworks.validation.ValidationErrors;
import com.constellio.model.services.schemas.validators.MetadataValueTypeValidator;
import com.constellio.sdk.tests.ConstellioTest;
public class MetadataValueTypeValidatorTest extends ConstellioTest {
static final String UNDERSCORE = "_";
static final String MULTI_VALUES_NOT_ALLOWED_IN_SINGLE_VALUE_METADATA = "multiValuesNotAllowedInSingleValueMetadata";
static final String SINGLE_VALUE_NOT_ALLOWED_IN_MULTI_VALUES_METADATA = "singleValueNotAllowedInMultiValuesMetadata";
static final String METADATA_CODE = "metadataCode";
static final String METADATA_LABEL = "metadataLabel";
@Mock Metadata textMetadata;
@Mock Metadata booleanMetadata;
@Mock Metadata aNumberMetadata;
@Mock Metadata dateMetadata;
@Mock Metadata referenceMetadata;
@Mock Record record;
MetadataValueTypeValidator validator;
String aStringValue = "aStringValue";
Boolean aBooleanValue = false;
Integer aNumberValue = 5;
LocalDateTime aDateValue = new LocalDateTime();
String aReferenceValue = "aReferenceValue";
List<String> aListOfStringValues = new ArrayList<String>();
List<Boolean> aListOfBooleanValues = new ArrayList<Boolean>();
List<Integer> aListOfNumberValues = new ArrayList<Integer>();
List<LocalDateTime> aListOfDateValues = new ArrayList<LocalDateTime>();
@SuppressWarnings("rawtypes") List anEmptyList = new ArrayList();
ValidationErrors validationErrors;
@Before
public void setUp() {
aListOfStringValues.add(aStringValue);
aListOfBooleanValues.add(aBooleanValue);
aListOfNumberValues.add(aNumberValue);
aListOfDateValues.add(aDateValue);
List<Metadata> metadatas = new ArrayList<>();
metadatas.add(textMetadata);
metadatas.add(booleanMetadata);
metadatas.add(aNumberMetadata);
metadatas.add(dateMetadata);
metadatas.add(referenceMetadata);
when(textMetadata.getType()).thenReturn(MetadataValueType.STRING);
when(booleanMetadata.getType()).thenReturn(MetadataValueType.BOOLEAN);
when(aNumberMetadata.getType()).thenReturn(MetadataValueType.NUMBER);
when(dateMetadata.getType()).thenReturn(MetadataValueType.DATE_TIME);
when(referenceMetadata.getType()).thenReturn(MetadataValueType.REFERENCE);
validator = new MetadataValueTypeValidator(metadatas);
validationErrors = new ValidationErrors();
}
@Test
public void givenAllValuesAreTheRightTypeWhenValidatingThenEmptyErrorsList() {
when(record.get(textMetadata)).thenReturn(aStringValue);
when(record.get(booleanMetadata)).thenReturn(aBooleanValue);
when(record.get(aNumberMetadata)).thenReturn(aNumberValue);
when(record.get(dateMetadata)).thenReturn(aDateValue);
when(record.get(referenceMetadata)).thenReturn(aReferenceValue);
validator.validate(record, validationErrors);
assertThat(validationErrors.getValidationErrors()).isEmpty();
}
@Test
public void givenAllValuesAreTheWrongTypeWhenValidatingThenSixErrorsInList() {
when(record.get(textMetadata)).thenReturn(aDateValue);
when(record.get(booleanMetadata)).thenReturn(aReferenceValue);
when(record.get(aNumberMetadata)).thenReturn(aStringValue);
when(record.get(dateMetadata)).thenReturn(aNumberValue);
when(record.get(referenceMetadata)).thenReturn(aDateValue);
validator.validate(record, validationErrors);
assertThat(validationErrors.getValidationErrors()).hasSize(5);
}
@Test
public void givenAllMetadatasAsMultivalueWithAListOfRightTypeValuesWhenValidateThenNoErrorInList()
throws Exception {
when(record.get(textMetadata)).thenReturn(aListOfStringValues);
when(record.get(booleanMetadata)).thenReturn(aListOfBooleanValues);
when(record.get(aNumberMetadata)).thenReturn(aListOfNumberValues);
when(record.get(dateMetadata)).thenReturn(aListOfDateValues);
when(record.get(referenceMetadata)).thenReturn(aListOfStringValues);
when(textMetadata.isMultivalue()).thenReturn(true);
when(booleanMetadata.isMultivalue()).thenReturn(true);
when(aNumberMetadata.isMultivalue()).thenReturn(true);
when(dateMetadata.isMultivalue()).thenReturn(true);
when(referenceMetadata.isMultivalue()).thenReturn(true);
validator.validate(record, validationErrors);
assertThat(validationErrors.getValidationErrors()).hasSize(0);
}
@Test
public void givenAllMetadatasAsMultivalueWithAListOfWrongTypeValuesWhenValidateThenErrorsInList()
throws Exception {
when(record.get(textMetadata)).thenReturn(aListOfBooleanValues);
when(record.get(booleanMetadata)).thenReturn(aListOfStringValues);
when(record.get(aNumberMetadata)).thenReturn(aListOfDateValues);
when(record.get(dateMetadata)).thenReturn(aListOfNumberValues);
when(record.get(referenceMetadata)).thenReturn(aListOfBooleanValues);
when(textMetadata.isMultivalue()).thenReturn(true);
when(booleanMetadata.isMultivalue()).thenReturn(true);
when(aNumberMetadata.isMultivalue()).thenReturn(true);
when(dateMetadata.isMultivalue()).thenReturn(true);
when(referenceMetadata.isMultivalue()).thenReturn(true);
validator.validate(record, validationErrors);
assertThat(validationErrors.getValidationErrors()).hasSize(5);
}
}