package pl.edu.icm.saos.search.search.service;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.common.params.HighlightParams;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import pl.edu.icm.saos.search.search.model.HighlightingFieldParams;
import pl.edu.icm.saos.search.search.model.HighlightingParams;
import pl.edu.icm.saos.search.search.model.JudgmentCriteria;
import pl.edu.icm.saos.search.search.model.Paging;
import pl.edu.icm.saos.search.search.model.Sorting;
/**
* @author madryk
*/
@RunWith(MockitoJUnitRunner.class)
public class SearchQueryFactoryImplTest {
private SearchQueryFactoryImpl<JudgmentCriteria> queryFactory = new SearchQueryFactoryImpl<JudgmentCriteria>();
@Mock
private CriteriaTransformer<JudgmentCriteria> criteriaTransformer;
@Before
public void setUp() {
queryFactory.setCriteriaTransformer(criteriaTransformer);
queryFactory.setHighlightParams(generateHighlighting());
}
@Test
public void createQuery_TRANSFORM_CRITERIA() {
// given
when(criteriaTransformer.transformCriteria(any())).thenReturn("+keyword:word");
// execute
SolrQuery solrQuery = queryFactory.createQuery(new JudgmentCriteria(), null);
// assert
assertEquals("+keyword:word", solrQuery.getQuery());
}
@Test
public void createQuery_PAGING() {
// given
JudgmentCriteria criteria = new JudgmentCriteria();
Paging paging = new Paging(3, 15);
when(criteriaTransformer.transformCriteria(any())).thenReturn("*:*");
// execute
SolrQuery solrQuery = queryFactory.createQuery(criteria, paging);
// assert
assertEquals(Integer.valueOf(45), solrQuery.getStart());
assertEquals(Integer.valueOf(15), solrQuery.getRows());
}
@Test
public void createQuery_SORTING() {
// given
JudgmentCriteria criteria = new JudgmentCriteria();
Paging paging = new Paging(0, 10, Sorting.relevanceSorting());
when(criteriaTransformer.transformCriteria(any())).thenReturn("*:*");
// execute
SolrQuery solrQuery = queryFactory.createQuery(criteria, paging);
// assert
assertEquals("score desc", solrQuery.getSortField());
}
@Test
public void createQuery_HIGHLIGHTING() {
// given
when(criteriaTransformer.transformCriteria(any())).thenReturn("*:*");
// execute
SolrQuery solrQuery = queryFactory.createQuery(new JudgmentCriteria(), null);
// assert
assertTrue(solrQuery.getHighlight());
assertEquals("<highlight>", solrQuery.getHighlightSimplePre());
assertEquals("</highlight>", solrQuery.getHighlightSimplePost());
assertEquals(2, solrQuery.getHighlightFields().length);
assertEquals("firstContent", solrQuery.getHighlightFields()[0]);
assertEquals("secondContent", solrQuery.getHighlightFields()[1]);
assertEquals("50", solrQuery.getFieldParam("firstContent", HighlightParams.FRAGSIZE));
assertEquals("2", solrQuery.getFieldParam("firstContent", HighlightParams.SNIPPETS));
assertEquals("200", solrQuery.getFieldParam("secondContent", HighlightParams.FRAGSIZE));
assertEquals("5", solrQuery.getFieldParam("secondContent", HighlightParams.SNIPPETS));
}
@Test
public void createQuery_HIGHLIGHTING_FROM_FIELD() {
// given
when(criteriaTransformer.transformCriteria(any())).thenReturn("+firstHighlightFrom:word +secondHighlightFrom:word +keyword:word");
// execute
SolrQuery solrQuery = queryFactory.createQuery(new JudgmentCriteria(), null);
// assert
assertEquals("+firstContent:word +firstContent:word +keyword:word", solrQuery.get(HighlightParams.Q));
}
//------------------------ PRIVATE --------------------------
private HighlightingParams generateHighlighting() {
HighlightingParams highlightParams = new HighlightingParams();
highlightParams.addParam(HighlightParams.SIMPLE_PRE, "<highlight>");
highlightParams.addParam(HighlightParams.SIMPLE_POST, "</highlight>");
HighlightingFieldParams firstFieldHighlightParams = new HighlightingFieldParams("firstContent");
firstFieldHighlightParams.addHighlightFromField("firstHighlightFrom");
firstFieldHighlightParams.addHighlightFromField("secondHighlightFrom");
firstFieldHighlightParams.addParam(HighlightParams.FRAGSIZE, "50");
firstFieldHighlightParams.addParam(HighlightParams.SNIPPETS, "2");
highlightParams.addFieldParams(firstFieldHighlightParams);
HighlightingFieldParams secondFieldHighlightParams = new HighlightingFieldParams("secondContent");
secondFieldHighlightParams.addParam(HighlightParams.FRAGSIZE, "200");
secondFieldHighlightParams.addParam(HighlightParams.SNIPPETS, "5");
highlightParams.addFieldParams(secondFieldHighlightParams);
return highlightParams;
}
}