package com.constellio.model.entities.search.logical.criterion; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; import java.util.Arrays; import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; import org.joda.time.LocalDateTime; import org.joda.time.LocalTime; 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.services.search.query.logical.criteria.IsContainingElementsCriterion; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.TestRecord; public class IsContainingElementsCriterionTest extends ConstellioTest { @Mock Metadata textMetadata; @Mock Metadata textMetadata1; @Mock Metadata referenceMetadata; @Mock Metadata numberMetadata; @Mock Metadata booleanMetadata; @Mock Metadata dateTimeMetadata; @Mock Metadata dateMetadata; @Mock Metadata contentMetadata; LocalDateTime dateTime = new LocalDateTime(2000, 10, 20, 10, 50); LocalDateTime dateTime2 = new LocalDateTime(2002, 10, 20, 22, 50); LocalDate date = new LocalDate(2000, 10, 20); LocalDate date2 = new LocalDate(2002, 10, 20); String textValue = "text value"; String textValue2 = "text value2"; int numberValueNegative1 = -1; int numberValue12 = 12; int numberValue100 = 100; @Before public void setUp() throws Exception { when(textMetadata.getDataStoreCode()).thenReturn("textMetadata"); when(textMetadata.getType()).thenReturn(MetadataValueType.STRING); when(textMetadata.isMultivalue()).thenReturn(true); when(referenceMetadata.getDataStoreCode()).thenReturn("referenceMetadata"); when(referenceMetadata.getType()).thenReturn(MetadataValueType.REFERENCE); when(referenceMetadata.isMultivalue()).thenReturn(true); when(numberMetadata.getDataStoreCode()).thenReturn("numberMetadata"); when(numberMetadata.getType()).thenReturn(MetadataValueType.NUMBER); when(numberMetadata.isMultivalue()).thenReturn(true); when(booleanMetadata.getDataStoreCode()).thenReturn("booleanMetadata"); when(booleanMetadata.getType()).thenReturn(MetadataValueType.BOOLEAN); when(booleanMetadata.isMultivalue()).thenReturn(true); when(dateTimeMetadata.getDataStoreCode()).thenReturn("dateTimeMetadata"); when(dateTimeMetadata.getType()).thenReturn(MetadataValueType.DATE_TIME); when(dateTimeMetadata.isMultivalue()).thenReturn(true); when(dateMetadata.getDataStoreCode()).thenReturn("dateMetadata"); when(dateMetadata.getType()).thenReturn(MetadataValueType.DATE); when(dateMetadata.isMultivalue()).thenReturn(true); when(contentMetadata.getDataStoreCode()).thenReturn("contentMetadata"); when(contentMetadata.getType()).thenReturn(MetadataValueType.CONTENT); when(contentMetadata.isMultivalue()).thenReturn(true); int offsetMillis = -1 * (DateTimeZone.getDefault().getOffset(dateTime.toDate().getTime())); int offsetMillis2 = -1 * (DateTimeZone.getDefault().getOffset(dateTime2.toDate().getTime())); } @Test public void givenOneValueWhenGettingSolrQueryThenQueryIsCorrect() { IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(numberValue12)); assertThat(criterion.getSolrQuery(numberMetadata)).isEqualTo("numberMetadata:\"12\""); } @Test public void givenThreeValuesWhenGettingSolrQueryThenQueryIsCorrect() { IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(numberValue12, numberValue100, numberValueNegative1)); assertThat(criterion.getSolrQuery(numberMetadata)).isEqualTo( "numberMetadata:\"12\" AND numberMetadata:\"100\" AND numberMetadata:\"\\-1\""); } @Test public void givenTextWhenGettingSolrQueryThenQueryIsCorrect() { IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(textValue, textValue2)); assertThat(criterion.getSolrQuery(textMetadata)) .isEqualTo("textMetadata:\"text\\ value\" AND textMetadata:\"text\\ value2\""); } @Test public void givenDateWhenGettingSolrQueryThenQueryIsCorrect() { IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(date, date2)); assertThat(criterion.getSolrQuery(dateMetadata)).isEqualTo( "dateMetadata:\"" + date.toLocalDateTime(LocalTime.MIDNIGHT) + "Z\" AND dateMetadata:\"" + date2 .toLocalDateTime(LocalTime.MIDNIGHT) + "Z\""); } @Test public void givenDateTimeWhenGettingSolrQueryThenQueryIsCorrect() { IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(dateTime, dateTime2)); assertThat(criterion.getSolrQuery(dateTimeMetadata)).isEqualTo( "dateTimeMetadata:\"" + dateTime + "Z\" AND dateTimeMetadata:\"" + dateTime2 + "Z\""); } @Test public void givenNumberMetadataWhenCheckingIsValidForThenReturnTrue() { IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(anInteger())); assertThat(criterion.isValidFor(numberMetadata)).isTrue(); } @Test public void givenTextMetadataWhenCheckingIsValidForThenReturnTrue() { IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(aString())); assertThat(criterion.isValidFor(textMetadata)).isTrue(); } @Test public void givenTextMetadataSingleValueMetadataWhenCheckingIsValidForThenReturnFalse() { when(textMetadata.isMultivalue()).thenReturn(false); IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(aString())); assertThat(criterion.isValidFor(textMetadata)).isFalse(); } @Test public void givenReferenceMetadataWhenCheckingIsValidForThenReturnTrue() { IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(anInteger())); assertThat(criterion.isValidFor(referenceMetadata)).isTrue(); } @Test public void givenDateTimeMetadataWhenCheckingIsValidForThenReturnTrue() { IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(aDateTime())); assertThat(criterion.isValidFor(dateTimeMetadata)).isTrue(); } @Test public void givenDateMetadataWhenCheckingIsValidForThenReturnTrue() { IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(aDate())); assertThat(criterion.isValidFor(dateMetadata)).isTrue(); } @Test public void givenContentMetadataWhenCheckingIsValidForThenReturnTrue() { IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(aString())); assertThat(criterion.isValidFor(contentMetadata)).isTrue(); } @Test public void givenValueContainsSpacesWhenGettingSolrQueryThenQueryIsCorrect() { String value = "value with spaces"; IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(value)); assertThat(criterion.getSolrQuery(textMetadata)).isEqualTo("textMetadata:\"value\\ with\\ spaces\""); } @Test public void givenValueContainsAsterisksWhenGettingSolrQueryThenQueryIsCorrect() { String value = "value*with*asterisks*"; IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(value)); assertThat(criterion.getSolrQuery(textMetadata)).isEqualTo("textMetadata:\"value\\*with\\*asterisks\\*\""); } @Test public void givenRecordWhenGettingSolrQueryThenQueryIsCorrect() { Record record1 = new TestRecord("code", "zeCollection", "zeId1"); Record record2 = new TestRecord("code", "zeCollection", "zeId2"); IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(record1, record2)); assertThat(criterion.getSolrQuery(referenceMetadata)) .isEqualTo("referenceMetadata:\"zeId1\" AND referenceMetadata:\"zeId2\""); } @Test public void givenValueContainsWildCardsWhenGettingSolrQueryThenQueryIsCorrect() { String value = "value?with?wildcards?"; IsContainingElementsCriterion criterion = new IsContainingElementsCriterion(Arrays.asList(value)); assertThat(criterion.getSolrQuery(textMetadata)).isEqualTo("textMetadata:\"value\\?with\\?wildcards\\?\""); } }