package com.constellio.model.services.batch.xml.list; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.jdom2.Document; import org.jdom2.Element; import org.joda.time.LocalDateTime; 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.services.batch.actions.ReindexMetadatasBatchProcessAction; import com.constellio.model.utils.ParametrizedInstanceUtils; import com.constellio.sdk.tests.ConstellioTest; public class BatchProcessListReaderTest extends ConstellioTest { @Mock ParametrizedInstanceUtils ParametrizedInstanceUtils; Document document; BatchProcessListWriter writer; BatchProcessListReader reader; Element rootElement; @Mock BatchProcess inexistentBatchProcess; @Mock BatchProcess batchProcess1; @Mock BatchProcess batchProcess2; @Mock BatchProcess batchProcess3; @Mock BatchProcess batchProcess4; BatchProcessAction batchProcessAction = new ReindexMetadatasBatchProcessAction( new ArrayList<String>(Arrays.asList("a", "b"))); Element batchProcessActionElement; LocalDateTime requestDateTime1; LocalDateTime requestDateTime2; LocalDateTime startDateTime; @Before public void setup() throws Exception { when(batchProcess1.getId()).thenReturn("1"); when(batchProcess2.getId()).thenReturn("2"); when(batchProcess3.getId()).thenReturn("3"); when(batchProcess4.getId()).thenReturn("4"); document = new Document(); writer = spy(new BatchProcessListWriter(document)); writer.createEmptyProcessList(); rootElement = spy(document.getRootElement()); reader = spy(new BatchProcessListReader(document)); requestDateTime1 = aDateTime(); requestDateTime2 = aDateTime(); startDateTime = new LocalDateTime(); // batchProcessActionElement = XMLElementUtils.newElementWithContent("errors", "zeSuperAction"); // doReturn(ParametrizedInstanceUtils).when(reader).newParametrizedInstanceUtils(); // doReturn(ParametrizedInstanceUtils).when(writer).newParametrizedInstanceUtils(); // when(ParametrizedInstanceUtils.toElement("action", batchProcessAction)).thenReturn(batchProcessActionElement); // when(ParametrizedInstanceUtils.toObject(batchProcessActionElement, BatchProcessAction.class)) // .thenReturn(batchProcessAction); } @Test public void givenAPendingBatchProcessWhenReadThenItIsReturned() throws Exception { writer.addBatchProcess("1", "zeQuery", "zeUltimateCollection", requestDateTime1, 1000, batchProcessAction); BatchProcess batchProcessReturned = reader.read("1"); assertThat(batchProcessReturned.getId()).isEqualTo("1"); assertThat(batchProcessReturned.getRequestDateTime()).isEqualTo(requestDateTime1); assertThat(batchProcessReturned.getTotalRecordsCount()).isEqualTo(1000); assertThat(batchProcessReturned.getCollection()).isEqualTo("zeUltimateCollection"); assertThat(batchProcessReturned.getQuery()).isEqualTo("zeQuery"); assertThat(batchProcessReturned.getHandledRecordsCount()).isEqualTo(0); assertThat(batchProcessReturned.getAction().getClass()).isEqualTo(ReindexMetadatasBatchProcessAction.class); } @Test(expected = BatchProcessListReaderRuntimeException.NoBatchProcessesInList.class) public void givenNoPendingBatchProcessWhenReadThenException() throws Exception { reader.read("1"); } @Test public void givenACurrentBatchProcessWhenReadCurrentThenItIsReturned() throws Exception { writer.addBatchProcess("1", "zeQuery", "zeUltimateCollection", requestDateTime1, 1000, batchProcessAction); writer.markBatchProcessAsPending("1"); writer.startNextBatchProcess(startDateTime); assertThat(reader.readPendingBatchProcesses()).isEmpty(); assertThat(reader.readStandbyBatchProcesses()).isEmpty(); BatchProcess batchProcessReturned = reader.readCurrent(); assertThat(batchProcessReturned.getId()).isEqualTo("1"); assertThat(batchProcessReturned.getRequestDateTime()).isEqualTo(requestDateTime1); assertThat(batchProcessReturned.getStartDateTime()).isEqualTo(startDateTime); assertThat(batchProcessReturned.getQuery()).isEqualTo("zeQuery"); assertThat(batchProcessReturned.getTotalRecordsCount()).isEqualTo(1000); assertThat(batchProcessReturned.getHandledRecordsCount()).isEqualTo(0); assertThat(batchProcessReturned.getAction().getClass()).isEqualTo(ReindexMetadatasBatchProcessAction.class); } @Test public void givenNoCurrentBatchProcessWhenReadCurrentThenNullReturned() throws Exception { assertThat(reader.readCurrent()).isNull(); } @Test public void givenThreeStandbyBatchProcessesWhenReadStandbyBatchProcessesThenTheyAreReturned() throws Exception { givenTwoFinishedTwoPendingAndThreeStandbyBatchProcesses(); List<BatchProcess> batchProcessesReturned = reader.readStandbyBatchProcesses(); assertThat(batchProcessesReturned.size()).isEqualTo(3); assertThat(batchProcessesReturned.get(0).getId()).isEqualTo("5"); assertThat(batchProcessesReturned.get(1).getId()).isEqualTo("6"); assertThat(batchProcessesReturned.get(2).getId()).isEqualTo("7"); for (BatchProcess batchProcess : batchProcessesReturned) { assertThat(batchProcess.getRequestDateTime()).isEqualTo(requestDateTime2); assertThat(batchProcess.getTotalRecordsCount()).isEqualTo(1000); assertThat(batchProcess.getHandledRecordsCount()).isEqualTo(0); assertThat(batchProcess.getAction().getClass()).isEqualTo(ReindexMetadatasBatchProcessAction.class); } } @Test public void givenTwoPendingAndThreeStandbyBatchProcessesWhenMarkAllAsPendingThen5Pending() throws Exception { givenTwoFinishedTwoPendingAndThreeStandbyBatchProcesses(); writer.markAllBatchProcessAsPending(); List<BatchProcess> standbyBatchProcesses = reader.readStandbyBatchProcesses(); assertThat(standbyBatchProcesses.size()).isEqualTo(0); List<BatchProcess> pendingBatchProcesses = reader.readPendingBatchProcesses(); assertThat(pendingBatchProcesses.size()).isEqualTo(5); assertThat(pendingBatchProcesses.get(0).getId()).isEqualTo("3"); assertThat(pendingBatchProcesses.get(1).getId()).isEqualTo("4"); assertThat(pendingBatchProcesses.get(2).getId()).isEqualTo("5"); assertThat(pendingBatchProcesses.get(3).getId()).isEqualTo("6"); assertThat(pendingBatchProcesses.get(4).getId()).isEqualTo("7"); for (BatchProcess batchProcess : pendingBatchProcesses) { assertThat(batchProcess.getRequestDateTime()).isEqualTo(requestDateTime2); assertThat(batchProcess.getTotalRecordsCount()).isEqualTo(1000); assertThat(batchProcess.getHandledRecordsCount()).isEqualTo(0); assertThat(batchProcess.getAction().getClass()).isEqualTo(ReindexMetadatasBatchProcessAction.class); } } @Test public void givenTwoPendingBatchProcessesWhenReadPendingBatchProcessesThenTheyAreReturned() throws Exception { givenTwoFinishedTwoPendingAndThreeStandbyBatchProcesses(); List<BatchProcess> batchProcessesReturned = reader.readPendingBatchProcesses(); assertThat(batchProcessesReturned.size()).isEqualTo(2); assertThat(batchProcessesReturned.get(0).getId()).isEqualTo("3"); assertThat(batchProcessesReturned.get(1).getId()).isEqualTo("4"); for (BatchProcess batchProcess : batchProcessesReturned) { assertThat(batchProcess.getRequestDateTime()).isEqualTo(requestDateTime2); assertThat(batchProcess.getTotalRecordsCount()).isEqualTo(1000); assertThat(batchProcess.getHandledRecordsCount()).isEqualTo(0); assertThat(batchProcess.getAction().getClass()).isEqualTo(ReindexMetadatasBatchProcessAction.class); } } @Test public void givenNoPendingBatchProcessesWhenReadPendingBatchProcessesThenEmptyList() throws Exception { assertThat(reader.readPendingBatchProcesses()).isEmpty(); } @Test public void givenNoStandbyBatchProcessesWhenReadStandbyBatchProcessesThenEmptyList() throws Exception { assertThat(reader.readStandbyBatchProcesses()).isEmpty(); } @Test public void givenTwoFinishedBatchProcessesWhenReadFinishedBatchProcessesThenTheyAreReturned() throws Exception { givenTwoFinishedTwoPendingAndThreeStandbyBatchProcesses(); List<BatchProcess> batchProcessesReturned = reader.readFinishedBatchProcesses(); assertThat(batchProcessesReturned.size()).isEqualTo(2); assertThat(batchProcessesReturned.get(0).getId()).isEqualTo("1"); assertThat(batchProcessesReturned.get(1).getId()).isEqualTo("2"); for (BatchProcess batchProcess : batchProcessesReturned) { assertThat(batchProcess.getRequestDateTime()).isEqualTo(requestDateTime1); assertThat(batchProcess.getTotalRecordsCount()).isEqualTo(2000); assertThat(batchProcess.getHandledRecordsCount()).isEqualTo(2000); assertThat(batchProcess.getAction().getClass()).isEqualTo(ReindexMetadatasBatchProcessAction.class); } } @Test public void givenAFinishedBatchProcessWith2ErrorsWhenReadFinishedBatchProcessesThenTheyAreReturned() throws Exception { writer.addBatchProcess("1", "zeQuery", "zeUltimateCollection", requestDateTime2, 1000, batchProcessAction); writer.markBatchProcessAsFinished(batchProcess1, 2); List<BatchProcess> batchProcessesReturned = reader.readFinishedBatchProcesses(); assertThat(batchProcessesReturned.get(0).getId()).isEqualTo("1"); assertThat(batchProcessesReturned.get(0).getErrors()).isEqualTo(2); assertThat(batchProcessesReturned.get(0).getHandledRecordsCount()).isEqualTo(1000); } @Test public void givenNoFinishedBatchProcessesWhenReadFinishedBatchProcessesThenReturnEmptyList() throws Exception { reader.readFinishedBatchProcesses().isEmpty(); } private void givenTwoFinishedTwoPendingAndThreeStandbyBatchProcesses() { writer.addBatchProcess("1", "zeQuery1", "zeUltimateCollection", requestDateTime1, 2000, batchProcessAction); writer.addBatchProcess("2", "zeQuery2", "zeUltimateCollection", requestDateTime1, 2000, batchProcessAction); writer.addBatchProcess("3", "zeQuery3", "zeUltimateCollection", requestDateTime2, 1000, batchProcessAction); writer.addBatchProcess("4", "zeQuery4", "zeUltimateCollection", requestDateTime2, 1000, batchProcessAction); writer.addBatchProcess("5", "zeQuery5", "zeUltimateCollection", requestDateTime2, 1000, batchProcessAction); writer.addBatchProcess("6", "zeQuery6", "zeUltimateCollection", requestDateTime2, 1000, batchProcessAction); writer.addBatchProcess("7", "zeQuery7", "zeUltimateCollection", requestDateTime2, 1000, batchProcessAction); writer.markBatchProcessAsPending("1"); writer.markBatchProcessAsPending("2"); writer.markBatchProcessAsPending("3"); writer.markBatchProcessAsPending("4"); writer.startNextBatchProcess(new LocalDateTime()); writer.markBatchProcessAsFinished(batchProcess1, 0); writer.startNextBatchProcess(new LocalDateTime()); writer.markBatchProcessAsFinished(batchProcess2, 0); } }