package pl.allegro.tech.search.elasticsearch.tools.reindex.process;
import com.beust.jcommander.internal.Lists;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.junit.Test;
import org.mockito.Mockito;
import pl.allegro.tech.search.elasticsearch.tools.reindex.connection.ElasticDataPointer;
import pl.allegro.tech.search.elasticsearch.tools.reindex.connection.ElasticDataPointerBuilder;
import java.util.Collections;
import java.util.Optional;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class IndexingProcessTest {
private static final String INDEX = "index";
private static final String TYPE = "type";
@Test
public void verifyIndexingProcessDoNotIndexWhenNoDataToIndex() throws Exception {
//given
ProcessSynchronizer processSynchronizer = mock(ProcessSynchronizer.class);
when(processSynchronizer.hasDataToBeIndexed()).thenReturn(false);
IndexingComponent indexingComponent = mock(IndexingComponent.class);
//when
IndexingProcess updatesProcess = IndexingProcessBuilder.builder()
.setProcessSynchronizer(processSynchronizer)
.setIndexingComponent(indexingComponent)
.build();
updatesProcess.run();
//then
verify(processSynchronizer, times(0)).incrementUpdates(Mockito.anyInt());
}
@Test
public void verifyIndexedCount() throws Exception {
//given
ProcessSynchronizer processSynchronizer = buildProcessSynchronizerMock();
ElasticDataPointer dataPointer = ElasticDataPointerBuilder
.builder()
.setAddress("http://localhost:9300/" + INDEX + "/" + TYPE)
.build();
IndexingComponent indexingComponent = mock(IndexingComponent.class);
when(indexingComponent.indexData(eq(dataPointer), any(SearchHit[].class)))
.thenReturn(Optional.of(new BulkResult(4, Collections.emptyList())));
//when
IndexingProcess updatesProcess = IndexingProcessBuilder.builder()
.setProcessSynchronizer(processSynchronizer)
.setIndexingComponent(indexingComponent)
.setDataPointer(dataPointer)
.build();
updatesProcess.run();
//then
verify(processSynchronizer).incrementUpdates(4);
}
@Test
public void verifyIndexedFailedCount() throws Exception {
//given
ElasticDataPointer dataPointer = ElasticDataPointerBuilder.builder()
.setAddress("http://localhost:9300/" + INDEX + "/" + TYPE)
.build();
ProcessSynchronizer processSynchronizer = buildProcessSynchronizerMock();
IndexingComponent indexingComponent = mock(IndexingComponent.class);
when(indexingComponent.indexData(eq(dataPointer), any(SearchHit[].class)))
.thenReturn(Optional.of(new BulkResult(0, Lists.newArrayList("1", "2"))));
//when
IndexingProcess updatesProcess = IndexingProcessBuilder.builder()
.setProcessSynchronizer(processSynchronizer)
.setIndexingComponent(indexingComponent)
.setDataPointer(dataPointer)
.build();
updatesProcess.run();
//then
verify(processSynchronizer, times(1)).incrementFailures(2);
}
private ProcessSynchronizer buildProcessSynchronizerMock() throws Exception {
ProcessSynchronizer processSynchronizer = mock(ProcessSynchronizer.class);
when(processSynchronizer.hasDataToBeIndexed()).thenReturn(true, false);
SearchHits searchHits = mock(SearchHits.class);
when(processSynchronizer.pollDataToIndexed()).thenReturn(searchHits);
return processSynchronizer;
}
}