package com.constellio.model.services.batch.controller;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
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.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import com.constellio.model.entities.batchprocess.BatchProcessAction;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.Transaction;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.services.records.RecordModificationImpactHandler;
import com.constellio.model.services.records.RecordProvider;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.records.RecordServicesRuntimeException;
import com.constellio.model.services.search.SearchServices;
import com.constellio.sdk.tests.ConstellioTest;
public class ReindexationTaskTest extends ConstellioTest {
@Mock SearchServices searchServices;
@Mock List<Metadata> reindexedMetadatas;
@Mock RecordServices recordServices;
List<String> errorList;
List<Record> batch;
String recordId1 = "record1";
String recordId2 = "record2";
String recordId3 = "record3";
String recordId4 = "record4";
@Mock Record record1;
@Mock Record record2;
@Mock Record record3;
@Mock Record record4;
@Mock Transaction transaction;
@Mock BatchProcessAction action;
@Mock MetadataSchemaTypes metadataSchemaTypes;
@Mock RecordModificationImpactHandler handler;
@Mock TaskList taskList;
private BatchProcessTask reindexationTask;
@Before
public void setUp() {
errorList = new ArrayList<>();
batch = new ArrayList<>();
batch.add(record1);
batch.add(record2);
batch.add(record3);
batch.add(record4);
when(record1.getCollection()).thenReturn(zeCollection);
when(record1.getId()).thenReturn(recordId1);
when(record2.getId()).thenReturn(recordId2);
when(record2.getCollection()).thenReturn(zeCollection);
when(record3.getId()).thenReturn(recordId3);
when(record3.getCollection()).thenReturn(zeCollection);
when(record4.getId()).thenReturn(recordId4);
when(record4.getCollection()).thenReturn(zeCollection);
when(metadataSchemaTypes.getCollection()).thenReturn(zeCollection);
reindexationTask = spy(new BatchProcessTask(taskList, batch, action, recordServices, metadataSchemaTypes,
searchServices));
doReturn(handler).when(reindexationTask).createSubTaskImpactHandler();
}
@Test
public void whenComputingThenGetRecordWithIdsAndExecuteReturningPassedErrorList()
throws Exception {
ArgumentCaptor<List> errorsList = ArgumentCaptor.forClass(List.class);
List<String> returnedErrorsList = reindexationTask.compute();
verify(reindexationTask).execute(eq(batch), errorsList.capture());
assertThat(errorsList.getValue()).isSameAs(returnedErrorsList);
}
@Test
public void whenExecutingTaskThenExecuteActionAndExecuteTransaction()
throws Exception {
when(action.execute(eq(batch), eq(metadataSchemaTypes), any(RecordProvider.class))).thenReturn(transaction);
reindexationTask.execute(batch, errorList);
verify(recordServices).executeWithImpactHandler(transaction, handler);
assertThat(errorList).isEmpty();
}
@Test
public void givenNullTransactionThenDoNotExecuteItAndDoNotMarkRecordsAsErrors()
throws Exception {
when(action.execute(eq(batch), eq(metadataSchemaTypes), any(RecordProvider.class))).thenReturn(null);
reindexationTask.execute(batch, errorList);
verifyZeroInteractions(recordServices);
assertThat(errorList).isEmpty();
}
@Test
public void givenRecordServicesExceptionWhenExecutingTransactionThenRecordIdInErrorList()
throws Exception {
when(action.execute(eq(batch), eq(metadataSchemaTypes), any(RecordProvider.class))).thenReturn(transaction);
doThrow(RecordServicesException.class).when(recordServices).executeWithImpactHandler(transaction, handler);
reindexationTask.execute(batch, errorList);
assertThat(errorList).containsOnly(recordId1, recordId2, recordId3, recordId4);
}
@Test
public void givenRecordServicesRuntimeExceptionWhenExecutingTransactionThenRecordIdInErrorList()
throws Exception {
when(action.execute(eq(batch), eq(metadataSchemaTypes), any(RecordProvider.class))).thenReturn(transaction);
doThrow(RecordServicesRuntimeException.class).when(recordServices).executeWithImpactHandler(transaction, handler);
reindexationTask.execute(batch, errorList);
assertThat(errorList).containsOnly(recordId1, recordId2, recordId3, recordId4);
}
@Test
public void givenExceptionWhenExecutingActionThenErrorListNotEmpty()
throws Exception {
doThrow(RuntimeException.class).when(action).execute(eq(batch), eq(metadataSchemaTypes), any(RecordProvider.class));
reindexationTask.execute(batch, errorList);
assertThat(errorList).containsOnly(recordId1, recordId2, recordId3, recordId4);
verifyZeroInteractions(recordServices);
}
}