package de.uni_goettingen.sub.commons.ocr.abbyy.server; import static org.mockito.Mockito.*; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.HashSet; import java.util.List; import java.util.Set; import org.junit.Before; import org.junit.Test; import de.uni_goettingen.sub.commons.ocr.api.OcrFormat; import de.unigoettingen.sub.commons.ocr.util.BeanProvider; import de.unigoettingen.sub.commons.ocr.util.FileAccess; import de.unigoettingen.sub.commons.ocr.util.merge.Merger; import de.unigoettingen.sub.commons.ocr.util.merge.MergerProvider; public class ProcessMergingObserverTest { private ProcessMergingObserver observerSut; private MergerProvider mergerProviderMock = mock(MergerProvider.class); private Merger mergerMock = mock(Merger.class); private FileAccess fileAccessMock = mock(FileAccess.class); private BeanProvider providerMock = mock(BeanProvider.class); private AbbyyProcess parentProcessMock = mock(AbbyyProcess.class); private AbbyyProcess subProcessMock1 = mock(AbbyyProcess.class); private AbbyyProcess subProcessMock2 = mock(AbbyyProcess.class); @Before public void beforeEachTest() throws Exception { observerSut = new ProcessMergingObserver(); when(mergerProviderMock.createMerger(any(OcrFormat.class))).thenReturn(mergerMock); observerSut.setMergerProvider(mergerProviderMock); observerSut.setBeanProvider(providerMock); when(providerMock.getFileAccess()).thenReturn(fileAccessMock); observerSut.setParentProcess(parentProcessMock); observerSut.addSubProcess(subProcessMock1); observerSut.addSubProcess(subProcessMock2); when(subProcessMock1.hasFinished()).thenReturn(true); when(subProcessMock2.hasFinished()).thenReturn(true); } @Test public void shouldDoNothingWhenAllSubprocessesNotFinished() { when(subProcessMock1.hasFinished()).thenReturn(false); when(subProcessMock2.hasFinished()).thenReturn(false); observerSut.update(subProcessMock2); verifyZeroInteractions(parentProcessMock, mergerMock, fileAccessMock); } @Test public void shouldDoNothingWhenOneSubprocessNotFinished() { when(subProcessMock1.hasFinished()).thenReturn(false); when(subProcessMock2.hasFinished()).thenReturn(true); observerSut.update(subProcessMock2); verifyZeroInteractions(parentProcessMock, mergerMock, fileAccessMock); } @Test(expected=IllegalStateException.class) public void shouldBreakUpWhenOneFails() { when(subProcessMock1.hasFailed()).thenReturn(true); observerSut.update(subProcessMock1); } @SuppressWarnings("unchecked") @Test public void shouldMergeIntoOneAndDeleteTheParts() throws URISyntaxException, IOException { Set<OcrFormat> formats = new HashSet<OcrFormat>(); formats.add(OcrFormat.TXT); when(parentProcessMock.getAllOutputFormats()).thenReturn(formats); when(subProcessMock1.getOutputUriForFormat(OcrFormat.TXT)).thenReturn(new URI("file:/part1.txt")); when(subProcessMock2.getOutputUriForFormat(OcrFormat.TXT)).thenReturn(new URI("file:/part2.txt")); when(parentProcessMock.getOutputUriForFormat(OcrFormat.TXT)).thenReturn(new URI("file:/result.txt")); observerSut.update(subProcessMock2); verify(mergerMock).mergeBuffered(any(List.class), any(OutputStream.class)); verify(fileAccessMock).deleteFile(new File("/part1.txt")); verify(fileAccessMock).deleteFile(new File("/part2.txt")); } }