package com.constellio.model.services.records;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.constellio.model.entities.batchprocess.BatchProcess;
import com.constellio.model.entities.batchprocess.BatchProcessAction;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.ModificationImpact;
import com.constellio.model.services.batch.manager.BatchProcessesManager;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.search.query.logical.condition.CollectionFilters;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
import com.constellio.model.services.search.query.logical.condition.SolrQueryBuilderParams;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.schemas.TestsSchemasSetup;
import com.constellio.sdk.tests.schemas.TestsSchemasSetup.ZeSchemaMetadatas;
public class AddToBatchProcessImpactHandlerRealTest extends ConstellioTest {
@Mock BatchProcessesManager batchProcessManager;
@Mock SearchServices searchServices;
@Mock BatchProcessAction action;
@Mock Metadata reindexedMetadata;
List<Metadata> reindexedMetadatas;
@Mock ModificationImpact modificationImpact;
@Mock BatchProcess theBatchProcess;
AddToBatchProcessImpactHandler handler;
TestsSchemasSetup setup = new TestsSchemasSetup(zeCollection);
ZeSchemaMetadatas zeSchema = setup.new ZeSchemaMetadatas();
@Mock LogicalSearchCondition condition;
@Before
public void setUp()
throws Exception {
// defineSchemasManager().using(setup);
// condition = from(zeSchema.type()).where(Schemas.TITLE).isEqualTo("Ze title");
when(condition.getFilters()).thenReturn(new CollectionFilters(zeCollection, false));
when(condition.getSolrQuery(any(SolrQueryBuilderParams.class))).thenReturn("zeQuery");
when(condition.getCollection()).thenReturn(zeCollection);
when(reindexedMetadata.getCollection()).thenReturn(zeCollection);
reindexedMetadatas = Arrays.asList(reindexedMetadata);
when(modificationImpact.getLogicalSearchCondition()).thenReturn(condition);
when(modificationImpact.getMetadataToReindex()).thenReturn(reindexedMetadatas);
handler = spy(new AddToBatchProcessImpactHandler(batchProcessManager, searchServices));
doReturn(action).when(handler).newBatchProcessAction(reindexedMetadatas);
}
@Test
public void whenHandlingModificationImpactThenSearchRecordsAndAddToBatchProcess()
throws Exception {
when(searchServices.hasResults(condition)).thenReturn(true);
when(batchProcessManager.addBatchProcessInStandby(eq(condition), any(BatchProcessAction.class), anyString()))
.thenReturn(theBatchProcess);
handler.prepareToHandle(modificationImpact);
List<BatchProcess> theBatchProcesses = handler.getAllCreatedBatchProcesses();
verify(batchProcessManager).addBatchProcessInStandby(condition, action, "reindex.transaction");
assertThat(theBatchProcesses).containsOnly(theBatchProcess);
verify(batchProcessManager, never()).markAsPending(theBatchProcess);
handler.handle();
verify(batchProcessManager).markAsPending(theBatchProcess);
}
@Test
public void givenNoRecordsThenNoBatchProcessCreated()
throws Exception {
when(searchServices.hasResults(condition)).thenReturn(false);
when(batchProcessManager.addBatchProcessInStandby(eq(condition), any(BatchProcessAction.class), anyString()))
.thenReturn(theBatchProcess);
handler.prepareToHandle(modificationImpact);
verify(batchProcessManager, never()).addBatchProcessInStandby(any(LogicalSearchCondition.class),
any(BatchProcessAction.class), anyString());
}
@Test
public void givenCancelledThenCancelThenCancelBatchProcessesAndClearList()
throws Exception {
when(searchServices.hasResults(condition)).thenReturn(true);
when(batchProcessManager.addBatchProcessInStandby(eq(condition), any(BatchProcessAction.class), anyString()))
.thenReturn(theBatchProcess);
handler.prepareToHandle(modificationImpact);
List<BatchProcess> theBatchProcesses = handler.getAllCreatedBatchProcesses();
verify(batchProcessManager).addBatchProcessInStandby(condition, action, "reindex.transaction");
assertThat(theBatchProcesses).containsOnly(theBatchProcess);
verify(batchProcessManager, never()).cancelStandByBatchProcess(theBatchProcess);
handler.cancel();
verify(batchProcessManager).cancelStandByBatchProcess(theBatchProcess);
assertThat(handler.createdBatchProcesses).isEmpty();
}
@Test
public void givenEmptySearchResultWhenHandlingImpactThenNoBatchProcessCreated()
throws Exception {
when(searchServices.searchRecordIds(any(LogicalSearchQuery.class))).thenReturn(new ArrayList<String>());
handler.prepareToHandle(modificationImpact);
verifyZeroInteractions(batchProcessManager);
}
}