/**
* Copyright (c) Codice Foundation
* <p>
* This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software Foundation, either version 3 of the
* License, or any later version.
* <p>
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details. A copy of the GNU Lesser General Public License
* is distributed along with this program and can be found at
* <http://www.gnu.org/licenses/lgpl.html>.
*/
package org.codice.ddf.catalog.ui.query.cql;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.mock;
import org.junit.Before;
import org.junit.Test;
import org.opengis.filter.sort.SortBy;
import org.opengis.filter.sort.SortOrder;
import ddf.catalog.data.Result;
import ddf.catalog.filter.FilterBuilder;
import ddf.catalog.operation.QueryRequest;
import spark.HaltException;
public class CqlRequestTest {
private CqlRequest cqlRequest;
private static final String LOCAL_SOURCE = "local";
private static final String MODE = "mode";
private static final String UPDATE = "update";
private static final String CACHE_SOURCE = "cache";
private static final String ASC_SORT_ORDER = ":asc";
private static final String DESC_SORT_ORDER = ":desc";
private static final String SORT_PROPERTY = "DISTANCE";
private static final String CQL = "\"anyText\\\" ILIKE '%'";
private static final String BAD_CQL = "unknownFunction(1,2)";
private FilterBuilder filterBuilder;
@Before
public void setUp() {
cqlRequest = new CqlRequest();
cqlRequest.setCql(CQL);
cqlRequest.setCount(10);
cqlRequest.setId("anId");
cqlRequest.setNormalize(true);
cqlRequest.setSort(SORT_PROPERTY + ASC_SORT_ORDER);
cqlRequest.setSrc("source");
cqlRequest.setStart(1);
cqlRequest.setTimeout(1000L);
filterBuilder = mock(FilterBuilder.class);
}
@Test
public void testGetters() {
assertThat(cqlRequest.getCount(), is(10));
assertThat(cqlRequest.getCql(), is(CQL));
assertThat(cqlRequest.getId(), is("anId"));
assertThat(cqlRequest.isNormalize(), is(true));
assertThat(cqlRequest.getSort(), is(SORT_PROPERTY + ASC_SORT_ORDER));
assertThat(cqlRequest.getSource(), is("source"));
assertThat(cqlRequest.getStart(), is(1));
assertThat(cqlRequest.getTimeout(), is(1000L));
}
@Test
public void testCreateQueryWithLocalSource() {
QueryRequest queryRequest = cqlRequest.createQueryRequest(LOCAL_SOURCE, filterBuilder);
SortBy sortBy = queryRequest.getQuery().getSortBy();
assertThat(sortBy.getPropertyName().getPropertyName(), is(SORT_PROPERTY));
assertThat(sortBy.getSortOrder(), is(SortOrder.ASCENDING));
assertThat(queryRequest.getPropertyValue(MODE), is(UPDATE));
}
@Test
public void testCreateQueryWithCacheSource() {
cqlRequest.setSort(SORT_PROPERTY + DESC_SORT_ORDER);
cqlRequest.setSrc(CACHE_SOURCE);
QueryRequest queryRequest = cqlRequest.createQueryRequest(CACHE_SOURCE, filterBuilder);
SortBy sortBy = queryRequest.getQuery().getSortBy();
assertThat(sortBy.getPropertyName().getPropertyName(), is(SORT_PROPERTY));
assertThat(sortBy.getSortOrder(), is(SortOrder.DESCENDING));
assertThat(queryRequest.getPropertyValue(MODE), is(CACHE_SOURCE));
}
@Test(expected = IllegalArgumentException.class)
public void testBadSortOrder() {
cqlRequest.setSort(SORT_PROPERTY + ":bad");
cqlRequest.createQueryRequest(CACHE_SOURCE, filterBuilder);
}
@Test
public void testBadSortOrderString() {
cqlRequest.setSort(SORT_PROPERTY);
QueryRequest queryRequest = cqlRequest.createQueryRequest(LOCAL_SOURCE, filterBuilder);
assertDefaultSortBy(queryRequest);
}
@Test
public void testBlankSortOrder() {
cqlRequest.setSort("");
QueryRequest queryRequest = cqlRequest.createQueryRequest(LOCAL_SOURCE, filterBuilder);
assertDefaultSortBy(queryRequest);
}
@Test(expected = HaltException.class)
public void testBadCql() {
cqlRequest.setCql(BAD_CQL);
cqlRequest.createQueryRequest(LOCAL_SOURCE, filterBuilder);
}
@Test
public void testBlankLocalSource() {
cqlRequest.createQueryRequest("", filterBuilder);
assertThat(cqlRequest.getSource(), is("source"));
}
@Test
public void testLocalSource() {
cqlRequest.setSrc(LOCAL_SOURCE);
cqlRequest.createQueryRequest(LOCAL_SOURCE, filterBuilder);
assertThat(cqlRequest.getSource(), is(LOCAL_SOURCE));
}
private void assertDefaultSortBy(QueryRequest queryRequest) {
SortBy sortBy = queryRequest.getQuery().getSortBy();
assertThat(sortBy.getPropertyName().getPropertyName(), is(Result.TEMPORAL));
assertThat(sortBy.getSortOrder(), is(SortOrder.DESCENDING));
assertThat(queryRequest.getPropertyValue(MODE), is(UPDATE));
}
}