/*
* Copyright 2016-2017 Hewlett Packard Enterprise Development Company, L.P.
* Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License.
*/
package com.hp.autonomy.frontend.find.core.savedsearches.query;
import com.hp.autonomy.frontend.find.core.savedsearches.ConceptClusterPhrase;
import com.hp.autonomy.frontend.find.core.savedsearches.FieldTextParser;
import com.hp.autonomy.searchcomponents.core.search.DocumentsService;
import com.hp.autonomy.searchcomponents.core.search.QueryRequest;
import com.hp.autonomy.searchcomponents.core.search.QueryRestrictions;
import com.hp.autonomy.searchcomponents.core.search.SearchResult;
import com.hp.autonomy.types.requests.Documents;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.io.Serializable;
import java.util.Collections;
import static org.junit.Assert.assertEquals;
import static org.mockito.AdditionalAnswers.returnsFirstArg;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public abstract class SavedQueryControllerTest<RQ extends QueryRequest<Q>, S extends Serializable, Q extends QueryRestrictions<S>, D extends SearchResult, E extends Exception, C extends SavedQueryController<RQ, S, Q, D, E>> {
@Mock
protected SavedQueryService savedQueryService;
@Mock
protected FieldTextParser fieldTextParser;
protected C savedQueryController;
@Mock
private Documents<D> searchResults;
private DocumentsService<RQ, ?, ?, Q, D, E> documentsService;
private SavedQuery savedQuery;
protected abstract DocumentsService<RQ, ?, ?, Q, D, E> constructDocumentsService();
protected abstract C constructController();
@Before
public void setUp() {
documentsService = constructDocumentsService();
savedQueryController = constructController();
savedQuery = new SavedQuery.Builder()
.setTitle("Any old saved search")
.build();
}
@Test
public void create() {
savedQueryController.create(savedQuery);
verify(savedQueryService).create(Matchers.same(savedQuery));
}
@Test
public void update() {
when(savedQueryService.update(any(SavedQuery.class))).then(returnsFirstArg());
final SavedQuery updatedQuery = savedQueryController.update(42, savedQuery);
verify(savedQueryService).update(Matchers.isA(SavedQuery.class));
assertEquals(42L, (long)updatedQuery.getId());
}
@Test
public void getAll() {
savedQueryController.getAll();
verify(savedQueryService).getAll();
}
@Test
public void delete() {
savedQueryController.delete(42L);
verify(savedQueryService).deleteById(eq(42L));
}
@Test
public void checkForNewQueryResults() throws E {
final long id = 123L;
final SavedQuery savedQuery = new SavedQuery.Builder()
.setId(id)
.setConceptClusterPhrases(Collections.singleton(new ConceptClusterPhrase("raccoons", true, 0)))
.build();
when(savedQueryService.get(id)).thenReturn(savedQuery);
final int numberOfResults = 1;
when(searchResults.getTotalResults()).thenReturn(numberOfResults);
when(documentsService.queryTextIndex(any())).thenReturn(searchResults);
assertEquals(numberOfResults, savedQueryController.checkForNewQueryResults(id));
}
@Test
public void checkForNewQueryResultsNoNewResults() throws E {
final long id = 123L;
final SavedQuery savedQuery = new SavedQuery.Builder()
.setId(id)
.setConceptClusterPhrases(Collections.singleton(new ConceptClusterPhrase("raccoons", true, 0)))
.build();
when(savedQueryService.get(id)).thenReturn(savedQuery);
when(documentsService.queryTextIndex(any())).thenReturn(searchResults);
final int numberOfResults = 0;
assertEquals(numberOfResults, savedQueryController.checkForNewQueryResults(id));
}
@Test
public void checkForNewQueryResultsButIncompatibleRestrictions() throws E {
final long id = 123L;
final DateTime lastFetchTime = DateTime.now();
final SavedQuery savedQuery = new SavedQuery.Builder()
.setDateNewDocsLastFetched(lastFetchTime)
.setId(id)
.setMaxDate(lastFetchTime.minus(1))
.build();
when(savedQueryService.get(id)).thenReturn(savedQuery);
final int numberOfResults = 0;
assertEquals(numberOfResults, savedQueryController.checkForNewQueryResults(id));
verify(documentsService, never()).queryTextIndex(any());
}
}