package pl.allegro.tech.search.elasticsearch.tools.reindex.process;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.ShardSearchFailure;
import org.elasticsearch.search.internal.InternalSearchResponse;
import org.junit.Test;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class QueryProcessTest {
@Test
public void shouldNotFillQueueWhenQueryResultEmpty() throws Exception {
//given
SearchResponse searchResponse = new SearchResponse();
ProcessSynchronizer processSynchronizer = mock(ProcessSynchronizer.class);
QueryComponent queryComponent = mock(QueryComponent.class);
when(queryComponent.prepareSearchScrollRequest()).thenReturn(searchResponse);
//when
new QueryProcess(processSynchronizer, queryComponent).run();
//then
verify(processSynchronizer, never()).tryFillQueueWithSearchHits(searchResponse);
verify(processSynchronizer).subtractWorkingQueryProcess();
}
@Test
public void shouldFillQueueWhenQueryResultNotEmptyInOneChunk() throws Exception {
//given
SearchResponse searchResponse = new SearchResponse();
ProcessSynchronizer processSynchronizer = createProcessSynchronizerMock();
QueryComponent queryComponent = mock(QueryComponent.class);
when(queryComponent.prepareSearchScrollRequest()).thenReturn(searchResponse);
when(queryComponent.searchResultsNotEmpty(searchResponse)).thenReturn(true);
//when
new QueryProcess(processSynchronizer, queryComponent).run();
//then
verify(processSynchronizer, times(1)).tryFillQueueWithSearchHits(searchResponse);
verify(processSynchronizer).subtractWorkingQueryProcess();
}
@Test
public void shouldFillQueueWhenQueryResultNotEmptyInTwoChunks() throws Exception {
//given
SearchResponse searchResponse = createSearchResponseWithScrollId("scrollId");
ProcessSynchronizer processSynchronizer = createProcessSynchronizerMock();
QueryComponent queryComponent = mock(QueryComponent.class);
when(queryComponent.prepareSearchScrollRequest()).thenReturn(searchResponse);
when(queryComponent.searchResultsNotEmpty(searchResponse)).thenReturn(true);
when(queryComponent.getResponseSize(searchResponse)).thenReturn(1, 0);
when(queryComponent.getNextScrolledSearchResults("scrollId")).thenReturn(searchResponse);
//when
new QueryProcess(processSynchronizer, queryComponent).run();
//then
verify(processSynchronizer, times(2)).tryFillQueueWithSearchHits(searchResponse);
verify(processSynchronizer).subtractWorkingQueryProcess();
}
private SearchResponse createSearchResponseWithScrollId(String scrollId) {
return new SearchResponse(InternalSearchResponse.empty(), scrollId, 1, 1, 1, new ShardSearchFailure[0]);
}
private ProcessSynchronizer createProcessSynchronizerMock() {
ProcessSynchronizer processSynchronizer = mock(ProcessSynchronizer.class);
when(processSynchronizer.tryFillQueueWithSearchHits(any(SearchResponse.class))).thenReturn(true);
return processSynchronizer;
}
}