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.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.services.search.query.logical.criteria.IsInCriterion;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.TestRecord;
public class IsInCriterionTest extends ConstellioTest {
@Mock Metadata textMetadata;
@Mock Metadata referenceMetadata;
@Mock Metadata numberMetadata;
@Mock Metadata booleanMetadata;
@Mock Metadata dateMetadata;
@Mock Metadata contentMetadata;
LocalDateTime date = new LocalDateTime(2001, 9, 15, 9, 40);
LocalDateTime date2 = new LocalDateTime(2003, 10, 20, 10, 50);
int intValue1 = 1;
int intValue20 = 20;
int intValue100 = 100;
String atextValue = "a text value";
String zetextValue = "ze text value";
@Before
public void setUp()
throws Exception {
when(textMetadata.getDataStoreCode()).thenReturn("textMetadata");
when(textMetadata.getType()).thenReturn(MetadataValueType.STRING);
when(referenceMetadata.getDataStoreCode()).thenReturn("referenceMetadata");
when(referenceMetadata.getType()).thenReturn(MetadataValueType.REFERENCE);
when(numberMetadata.getDataStoreCode()).thenReturn("numberMetadata");
when(numberMetadata.getType()).thenReturn(MetadataValueType.NUMBER);
when(booleanMetadata.getDataStoreCode()).thenReturn("booleanMetadata");
when(booleanMetadata.getType()).thenReturn(MetadataValueType.BOOLEAN);
when(dateMetadata.getDataStoreCode()).thenReturn("dateTimeMetadata");
when(dateMetadata.getType()).thenReturn(MetadataValueType.DATE_TIME);
when(contentMetadata.getDataStoreCode()).thenReturn("contentMetadata");
when(contentMetadata.getType()).thenReturn(MetadataValueType.CONTENT);
}
@Test
public void whenGettingSolrQueryThenQueryIsCorrect() {
IsInCriterion criterion = new IsInCriterion(Arrays.asList(intValue1, intValue20, intValue100));
assertThat(criterion.getSolrQuery(numberMetadata)).isEqualTo(
"numberMetadata:\"1\" OR numberMetadata:\"20\" OR numberMetadata:\"100\"");
}
@Test
public void whenGettingSolrQueryWithLongsThenQueryIsCorrect() {
long longValue1 = 1l;
long longValue20 = 20l;
long longValue100 = 100l;
IsInCriterion criterion = new IsInCriterion(Arrays.asList(longValue1, longValue20, longValue100));
assertThat(criterion.getSolrQuery(numberMetadata)).isEqualTo(
"numberMetadata:\"1\" OR numberMetadata:\"20\" OR numberMetadata:\"100\"");
}
@Test
public void whenGettingSolrQueryWithFloatsThenQueryIsCorrect() {
float floatValue1 = 1.0f;
float floatValue20 = 20f;
float floatValue100 = 100f;
IsInCriterion criterion = new IsInCriterion(Arrays.asList(floatValue1, floatValue20, floatValue100));
assertThat(criterion.getSolrQuery(numberMetadata)).isEqualTo(
"numberMetadata:\"1.0\" OR numberMetadata:\"20.0\" OR numberMetadata:\"100.0\"");
}
@Test
public void whenGettingSolrQueryWithRecordsThenQueryIsCorrect() {
Record record1 = new TestRecord("a", "zeCollection", "id1");
Record record2 = new TestRecord("a", "zeCollection", "id2");
IsInCriterion criterion = new IsInCriterion(Arrays.asList(record1, record2));
assertThat(criterion.getSolrQuery(referenceMetadata)).isEqualTo(
"referenceMetadata:\"id1\" OR referenceMetadata:\"id2\"");
}
@Test
public void givenTextWhenGettingSolrQueryThenQueryIsCorrect() {
IsInCriterion criterion = new IsInCriterion(Arrays.asList(atextValue, zetextValue));
assertThat(criterion.getSolrQuery(textMetadata)).isEqualTo(
"textMetadata:\"a\\ text\\ value\" OR textMetadata:\"ze\\ text\\ value\"");
}
@Test
public void givenDateWhenGettingSolrQueryThenQueryIsCorrect() {
int offsetMillis = -1 * (DateTimeZone.getDefault().getOffset(date.toDate().getTime()));
int offsetMillis2 = -1 * (DateTimeZone.getDefault().getOffset(date2.toDate().getTime()));
IsInCriterion criterion = new IsInCriterion(Arrays.asList(date, date2));
assertThat(criterion.getSolrQuery(dateMetadata)).isEqualTo(
"dateTimeMetadata:\"" + date + "Z\" OR dateTimeMetadata:\"" + date2 + "Z\"");
}
@Test
public void givenNumberMetadataWhenCheckingIsValidForThenReturnTrue() {
IsInCriterion criterion = new IsInCriterion(Arrays.asList(anInteger(), anInteger()));
assertThat(criterion.isValidFor(numberMetadata)).isTrue();
}
@Test
public void givenTextMetadataWhenCheckingIsValidForThenReturnTrue() {
IsInCriterion criterion = new IsInCriterion(Arrays.asList(aString(), aString()));
assertThat(criterion.isValidFor(textMetadata)).isTrue();
}
@Test
public void givenReferenceMetadataWhenCheckingIsValidForThenReturnTrue() {
IsInCriterion criterion = new IsInCriterion(Arrays.asList(anInteger(), anInteger()));
assertThat(criterion.isValidFor(referenceMetadata)).isTrue();
}
@Test
public void givenBooleanMetadataWhenCheckingIsValidForThenReturnTrue() {
IsInCriterion criterion = new IsInCriterion(Arrays.asList(aString(), aString()));
assertThat(criterion.isValidFor(booleanMetadata)).isFalse();
}
@Test
public void givenDateMetadataWhenCheckingIsValidForThenReturnTrue() {
IsInCriterion criterion = new IsInCriterion(Arrays.asList(aDateTime(), aDateTime()));
assertThat(criterion.isValidFor(dateMetadata)).isTrue();
}
@Test
public void givenContentMetadataWhenCheckingIsValidForThenReturnTrue() {
IsInCriterion criterion = new IsInCriterion(Arrays.asList(aString(), aString()));
assertThat(criterion.isValidFor(dateMetadata)).isTrue();
}
@Test
public void givenValueContainsAsterisksWhenGettingSolrQueryThenAsterisksEscaped() {
String value = "value*with*asterisks*";
String value2 = "value with spaces";
IsInCriterion criterion = new IsInCriterion(Arrays.asList(value, value2));
assertThat(criterion.getSolrQuery(textMetadata)).isEqualTo(
"textMetadata:\"value\\*with\\*asterisks\\*\" OR textMetadata:\"value\\ with\\ spaces\"");
}
@Test
public void givenValueContainsWildCardsWhenGettingSolrQueryThenWildCardsEscaped() {
String value = "value?with?wildcards";
String value2 = "value with spaces";
IsInCriterion criterion = new IsInCriterion(Arrays.asList(value, value2));
assertThat(criterion.getSolrQuery(textMetadata)).isEqualTo(
"textMetadata:\"value\\?with\\?wildcards\" OR textMetadata:\"value\\ with\\ spaces\"");
}
}