package de.uni_goettingen.sub.commons.ocr.abbyy.server; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.Properties; import org.junit.Before; import org.junit.Test; import de.uni_goettingen.sub.commons.ocr.api.OcrFormat; import de.uni_goettingen.sub.commons.ocr.api.OcrImage; import de.uni_goettingen.sub.commons.ocr.api.OcrOutput; import de.unigoettingen.sub.commons.ocr.util.Pause; public class AbbyyProcessTest { private AbbyyProcess processSut; private AbbyyTicket ticketMock = mock(AbbyyTicket.class); private HotfolderManager hotManagerMock = mock(HotfolderManager.class); private Pause pauseMock = mock(Pause.class); private ProcessMergingObserver mergerMock = mock(ProcessMergingObserver.class); @Before public void beforeEachTest() throws Exception { AbbyyProcess processSutNoSpy = new AbbyyProcess(); processSut = spy(processSutNoSpy); doReturn(ticketMock).when(processSut).createAbbyyTicket(any(AbbyyProcess.class)); doReturn(hotManagerMock).when(processSut).createHotfolderManager(); processSut.setPause(pauseMock); processSut.setMerger(mergerMock); } @Test public void shouldInitializeTicket() throws URISyntaxException { processSut.initialize(validProps()); verify(ticketMock).setRemoteInputFolder(new URI("http://test.com/input/")); } @Test(expected=IllegalArgumentException.class) public void shouldNotAcceptIllegalUri() throws URISyntaxException { Properties props = validProps(); props.setProperty("serverUrl", ">not-a-url"); processSut.initialize(props); } @Test public void shouldRunOcr() throws IOException { processSut.initialize(validProps()); processSut.run(); verify(hotManagerMock).copyImagesToHotfolder(anyListOf(OcrImage.class)); verify(hotManagerMock).retrieveResults(anyListOf(OcrOutput.class)); verify(mergerMock).update(any(AbbyyProcess.class)); assertFalse("Process should not fail", processSut.hasFailed()); } @Test public void shouldFailWithTimeout() throws TimeoutException, IOException { doThrow(TimeoutException.class).when(hotManagerMock).waitForResults(anyLong(), anyLong(), anyListOf(OcrOutput.class), any(URI.class)); processSut.initialize(validProps()); processSut.run(); verify(hotManagerMock, never()).retrieveResults(anyListOf(OcrOutput.class)); assertTrue("Process must fail", processSut.hasFailed()); } @Test public void shouldFailWithIO() throws IOException { doThrow(new IOException("IO problem")).when(hotManagerMock).retrieveResults(anyListOf(OcrOutput.class)); processSut.initialize(validProps()); processSut.run(); assertTrue("Process must fail", processSut.hasFailed()); } @Test public void shouldFailWithUriSyntax() throws IOException, URISyntaxException { doThrow(URISyntaxException.class).when(hotManagerMock).createAndSendTicket(any(AbbyyTicket.class), anyString()); processSut.initialize(validProps()); processSut.run(); assertTrue("Process must fail", processSut.hasFailed()); } @Test public void shouldAddOneImage() throws URISyntaxException { processSut.initialize(validProps()); assertEquals("Collection size before", 0, processSut.getRemoteImageNames().size()); processSut.addImage(new URI("file://test.tif")); assertEquals("Collection size after", 1, processSut.getRemoteImageNames().size()); } @Test public void shouldNameImageCorrectly() throws URISyntaxException { processSut.initialize(validProps()); processSut.setName("myProcess"); processSut.addImage(new URI("file://test.tif")); String imageName = processSut.getRemoteImageNames().get(0); assertEquals("Image name", "myProcess-test.tif", imageName); } @Test public void shouldAddOutputsAndResultXml() { processSut.initialize(validProps()); processSut.addOutput(OcrFormat.TXT); assertEquals("Number of outputs", 2, processSut.getAllOutputFormats().size()); processSut.addOutput(OcrFormat.XML); assertEquals("Second number of outputs", 3, processSut.getAllOutputFormats().size()); } @Test public void shouldMakeACopyWithEmptyImages() throws URISyntaxException { processSut.initialize(validProps()); processSut.addImage(new URI("file://test.tif")); AbbyyProcess copy = processSut.createSubProcess(); assertEquals("Images must be empty", 0, copy.getImages().size()); } @Test public void shouldBeEqualWithSameProcessId() { AbbyyProcess firstProcess = new AbbyyProcess(); AbbyyProcess secondProcess = new AbbyyProcess(); firstProcess.setProcessId("id1"); secondProcess.setProcessId("id2"); assertFalse("Must not be equal", firstProcess.equals(secondProcess)); firstProcess.setProcessId("id1"); secondProcess.setProcessId("id1"); assertTrue("Must be equal", firstProcess.equals(secondProcess)); } @Test public void shouldBeStartableWithImagesAndOutputs() throws URISyntaxException { processSut.initialize(validProps()); assertFalse("Not startable yet", processSut.hasImagesAndOutputs()); processSut.addOutput(OcrFormat.XML); assertFalse("Still not startable", processSut.hasImagesAndOutputs()); processSut.addImage(new URI("file://test.tif")); assertTrue("Now must be startable", processSut.hasImagesAndOutputs()); } @Test public void shouldGetCorrectOutputUri() throws URISyntaxException { processSut.initialize(validProps()); processSut.setOutputDir(new File("/tmp")); processSut.setName("result"); URI nullUri = processSut.getOutputUriForFormat(OcrFormat.XML); assertNull(nullUri); processSut.addOutput(OcrFormat.XML); URI xmlUri = processSut.getOutputUriForFormat(OcrFormat.XML); assertEquals(new URI("file:/tmp/result.xml"), xmlUri); } private Properties validProps() { Properties props = new Properties(); // file properties props.setProperty("serverUrl", "http://test.com/"); props.setProperty("inputFolder", "input"); props.setProperty("outputFolder", "output"); props.setProperty("errorFolder", "error"); props.setProperty("resultXmlFolder", "control"); props.setProperty("maxMillisPerFile", "2000"); props.setProperty("minMillisPerFile", "1000"); props.setProperty("checkInterval", "300"); return props; } }