package de.unigoettingen.sub.ocr.controller; import static org.mockito.Mockito.*; import java.io.File; import java.util.Properties; import org.junit.Before; import org.junit.Test; import de.uni_goettingen.sub.commons.ocr.api.OcrEngine; import de.uni_goettingen.sub.commons.ocr.api.OcrFactory; import de.uni_goettingen.sub.commons.ocr.api.OcrProcess; import de.unigoettingen.sub.commons.ocr.util.BeanProvider; import de.unigoettingen.sub.commons.ocr.util.FileAccess; import de.unigoettingen.sub.commons.ocr.util.Mailer; public class OcrEngineStarterTest { private OcrEngineStarter starterSut = new OcrEngineStarter(); private FactoryProvider providerMock = mock(FactoryProvider.class); private OcrFactory factoryMock = mock(OcrFactory.class); private BeanProvider beanProviderMock = mock(BeanProvider.class); private FileAccess fileAccessMock = mock(FileAccess.class); private OcrEngine engineMock = mock(OcrEngine.class); private OcrProcess processMock = mock(OcrProcess.class); private Mailer mailerMock = mock(Mailer.class); @Before public void beforeEachTest() throws Exception { when(providerMock.createFactory(anyString(), any(Properties.class))).thenReturn(factoryMock); when(beanProviderMock.getFileAccess()).thenReturn(fileAccessMock); when(beanProviderMock.getMailer()).thenReturn(mailerMock); when(factoryMock.createEngine()).thenReturn(engineMock); when(factoryMock.createProcess()).thenReturn(processMock); starterSut.setFactoryProvider(providerMock); starterSut.setBeanProvider(beanProviderMock); } @Test public void shouldStartEngineDespiteNoFolders() { when(fileAccessMock.getAllFolders(anyString(), any(String[].class))).thenReturn(new File[]{}); starterSut.startOcrWithParams(validParams()); verify(engineMock).recognize(); } @Test public void shouldStartWithBookAndImage() { prepareOneBookWithOneImage(); starterSut.startOcrWithParams(validParams()); verify(processMock).setName("book1"); verify(engineMock).recognize(); } @Test public void shouldStartAndSendMails() { prepareOneBookWithOneImage(); OcrParameters params = validParams(); when(engineMock.getEstimatedDurationInSeconds()).thenReturn(1); starterSut.startOcrWithParams(params); verify(mailerMock).sendStarted("test@test.com", 1); verify(engineMock).recognize(); verify(mailerMock).sendFinished("test@test.com", "tmp/output"); } @Test(expected=IllegalArgumentException.class) public void shouldRejectIllegalOutputFormat() { prepareOneBookWithOneImage(); OcrParameters params = validParams(); params.outputFormats = new String[]{"illegal"}; starterSut.startOcrWithParams(params); } @Test(expected=IllegalArgumentException.class) public void shouldRejectIllegalTextType() { prepareOneBookWithOneImage(); OcrParameters params = validParams(); params.inputTextType = "illegal"; starterSut.startOcrWithParams(params); } @Test(expected=IllegalArgumentException.class) public void shouldRejectIllegalPriority() { prepareOneBookWithOneImage(); OcrParameters params = validParams(); params.priority = "-10"; starterSut.startOcrWithParams(params); } private void prepareOneBookWithOneImage() { File[] book = new File[]{new File("tmp/book1")}; when(fileAccessMock.getAllFolders(anyString(), any(String[].class))).thenReturn(book); File[] image = new File[]{new File("tmp/book1/image1.jpg")}; when(fileAccessMock.getAllImagesFromFolder(any(File.class), any(String[].class))).thenReturn(image); } private OcrParameters validParams() { OcrParameters params = new OcrParameters(); params.inputFolder = "tmp/book1"; params.outputFolder = "tmp/output"; params.outputFormats = new String[]{"pdf", "xml"}; params.inputLanguages = new String[]{"de", "en"}; params.inputTextType = "normal"; params.props.setProperty("email", "test@test.com"); return params; } }