/**
* 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 ddf.catalog.cache.solr.impl;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.opengis.filter.Filter;
import ddf.catalog.data.Metacard;
import ddf.catalog.data.Result;
import ddf.catalog.data.impl.MetacardImpl;
import ddf.catalog.operation.DeleteRequest;
import ddf.catalog.operation.QueryRequest;
import ddf.catalog.operation.SourceResponse;
import ddf.catalog.operation.impl.QueryResponseImpl;
import ddf.catalog.source.UnsupportedQueryException;
import ddf.catalog.source.solr.SchemaFields;
@RunWith(MockitoJUnitRunner.class)
public class SolrCacheTest {
public static final String SOURCE_ID = "source-id";
public static final String TEST_ID = "test-id";
public static final String OTHER_ATTRIBUTE_NAME = "other-attribute-name";
public static final String ID1 = "id1";
public static final String ID2 = "id2";
private SolrCache solrCache;
@Mock
private SolrClientAdaptor mockSolrClientAdaptor;
@Mock
private CacheSolrMetacardClient mockCacheSolrMetacardClient;
@Before
public void setUp() {
solrCache = new SolrCache(mockSolrClientAdaptor);
when(mockSolrClientAdaptor.getSolrMetacardClient()).thenReturn(mockCacheSolrMetacardClient);
}
@Test
public void query() throws UnsupportedQueryException {
QueryRequest mockQuery = mock(QueryRequest.class);
SourceResponse expectedResponse = new QueryResponseImpl(mockQuery);
when(mockCacheSolrMetacardClient.query(mockQuery)).thenReturn(expectedResponse);
SourceResponse actualResponse = solrCache.query(mockQuery);
assertThat(actualResponse, is(expectedResponse));
verify(mockSolrClientAdaptor).getSolrMetacardClient();
verify(mockCacheSolrMetacardClient).query(mockQuery);
}
@Test(expected = UnsupportedQueryException.class)
public void queryThrowsUnsupportedQueryException() throws UnsupportedQueryException {
QueryRequest mockQuery = mock(QueryRequest.class);
doThrow(new UnsupportedQueryException()).when(mockCacheSolrMetacardClient)
.query(mockQuery);
solrCache.query(mockQuery);
}
@Test
public void createWithNullMetacards() throws Exception {
solrCache.create(null);
verify(mockSolrClientAdaptor, times(0)).getSolrMetacardClient();
}
@Test
public void createWithEmptyMetacards() throws Exception {
solrCache.create(Collections.emptyList());
verify(mockSolrClientAdaptor, times(0)).getSolrMetacardClient();
}
@Test
public void createWithANullMetacard() throws Exception {
List<Metacard> metacards = new ArrayList<Metacard>();
metacards.add(null);
solrCache.create(metacards);
ArgumentCaptor<List> updatedMetacardsCaptor = ArgumentCaptor.forClass(List.class);
verify(mockCacheSolrMetacardClient).add(updatedMetacardsCaptor.capture(), eq(false));
assertThat(updatedMetacardsCaptor.getValue()
.isEmpty(), is(true));
}
@Test
public void createWithMetacard() throws Exception {
List<Metacard> metacards = new ArrayList<Metacard>();
Metacard metacard = mock(Metacard.class);
when(metacard.getSourceId()).thenReturn(TEST_ID);
when(metacard.getId()).thenReturn(TEST_ID);
metacards.add(metacard);
solrCache.create(metacards);
ArgumentCaptor<List> updatedMetacardsCaptor = ArgumentCaptor.forClass(List.class);
verify(mockCacheSolrMetacardClient).add(updatedMetacardsCaptor.capture(), eq(false));
assertThat(updatedMetacardsCaptor.getValue()
.size(), is(1));
assertThat(updatedMetacardsCaptor.getValue()
.get(0), is(metacard));
}
@Test
public void createAbsorbsException() throws Exception {
doThrow(new IOException()).when(mockCacheSolrMetacardClient)
.add(any(List.class), eq(false));
solrCache.create(Collections.emptyList());
}
@Test
public void deleteWithNullRequest() throws Exception {
solrCache.delete(null);
verify(mockSolrClientAdaptor, times(0)).getSolrMetacardClient();
}
@Test
public void deleteWithBlankAttributeName() throws Exception {
DeleteRequest mockRequest = setupDeleteRequest(null);
solrCache.delete(mockRequest);
verify(mockSolrClientAdaptor, times(0)).getSolrMetacardClient();
}
@Test
public void deleteWithId() throws Exception {
DeleteRequest mockRequest = setupDeleteRequest("id");
solrCache.delete(mockRequest);
verify(mockCacheSolrMetacardClient).deleteByIds("original_id" + SchemaFields.TEXT_SUFFIX,
null,
false);
}
@Test
public void deleteWithOtherAttribute() throws Exception {
DeleteRequest mockRequest = setupDeleteRequest(OTHER_ATTRIBUTE_NAME);
solrCache.delete(mockRequest);
verify(mockCacheSolrMetacardClient).deleteByIds(
OTHER_ATTRIBUTE_NAME + SchemaFields.TEXT_SUFFIX, null, false);
}
@Test
public void deleteAbsorbsException() throws Exception {
DeleteRequest mockRequest = setupDeleteRequest(OTHER_ATTRIBUTE_NAME);
doThrow(new IOException()).when(mockCacheSolrMetacardClient)
.deleteByIds(anyString(), any(List.class), eq(false));
solrCache.delete(mockRequest);
verify(mockCacheSolrMetacardClient).deleteByIds(
OTHER_ATTRIBUTE_NAME + SchemaFields.TEXT_SUFFIX, null, false);
}
@Test
public void removeAll() throws Exception {
solrCache.removeAll();
verify(mockCacheSolrMetacardClient).deleteByQuery("*:*");
}
@Test
public void removeById() throws Exception {
String[] ids = new String[] {ID1, ID2};
solrCache.removeById(ids);
ArgumentCaptor<List> idsListCaptor = ArgumentCaptor.forClass(List.class);
verify(mockCacheSolrMetacardClient).deleteByIds(eq(
"original_id" + SchemaFields.TEXT_SUFFIX), idsListCaptor.capture(), eq(false));
assertThat(idsListCaptor.getValue()
.size(), is(2));
assertThat(idsListCaptor.getValue()
.get(0), is(ID1));
assertThat(idsListCaptor.getValue()
.get(1), is(ID2));
}
@Test
public void queryWithEmptyResults() throws Exception {
SourceResponse mockResponse = mock(SourceResponse.class);
when(mockResponse.getResults()).thenReturn(Collections.emptyList());
when(mockCacheSolrMetacardClient.query(any(QueryRequest.class))).thenReturn(mockResponse);
List<Metacard> metacardsList = solrCache.query(mock(Filter.class));
assertThat(metacardsList.size(), is(0));
}
@Test
public void queryWithResults() throws Exception {
SourceResponse mockResponse = mock(SourceResponse.class);
Result mockResult = mock(Result.class);
Metacard expectedMetacard = new MetacardImpl();
when(mockResult.getMetacard()).thenReturn(expectedMetacard);
List<Result> listOfResults = new ArrayList<Result>();
listOfResults.add(mockResult);
when(mockResponse.getResults()).thenReturn(listOfResults);
when(mockCacheSolrMetacardClient.query(any(QueryRequest.class))).thenReturn(mockResponse);
List<Metacard> metacardsList = solrCache.query(mock(Filter.class));
assertThat(metacardsList.size(), is(1));
assertThat(metacardsList.get(0), is(expectedMetacard));
}
private DeleteRequest setupDeleteRequest(String attributeToReturn) {
DeleteRequest mockRequest = mock(DeleteRequest.class);
when(mockRequest.getAttributeName()).thenReturn(attributeToReturn);
when(mockRequest.getAttributeValues()).thenReturn(null);
return mockRequest;
}
}