//Dstl (c) Crown Copyright 2017
package uk.gov.dstl.baleen.uima;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.uima.UIMAException;
import org.apache.uima.UimaContext;
import org.apache.uima.fit.factory.UimaContextFactory;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.tcas.Annotation;
import org.apache.uima.resource.ResourceInitializationException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import uk.gov.dstl.baleen.core.pipelines.PipelineBuilder;
import uk.gov.dstl.baleen.types.metadata.Metadata;
import uk.gov.dstl.baleen.uima.testing.JCasSingleton;
@RunWith(MockitoJUnitRunner.Silent.class)
public class BaleenContentExtractorTest {
private static final String VALUE = "value";
private static final String KEY = "key";
private static final String PIPELINE_NAME = "testPipeline";
@Mock
UimaSupport support;
@Mock
UimaMonitor monitor;
UimaContext context;
JCas jCas;
Annotation annotation;
@Before
public void setUp() throws UIMAException {
jCas = JCasSingleton.getJCasInstance();
annotation = new Annotation(jCas);
context = UimaContextFactory.createUimaContext(PipelineBuilder.PIPELINE_NAME, PIPELINE_NAME);
}
@Test
public void testDestroy() throws ResourceInitializationException {
FakeBaleenContentExtractor annotator = new FakeBaleenContentExtractor();
annotator.initialize(context, Collections.emptyMap());
annotator.destroy();
assertTrue(annotator.destroyed);
}
@Test
public void testDoInitialize() throws ResourceInitializationException {
FakeBaleenContentExtractor annotator = new FakeBaleenContentExtractor();
annotator.initialize(context, Collections.emptyMap());
assertTrue(annotator.initialised);
}
@Test
public void testProcess() throws Exception {
FakeBaleenContentExtractor annotator = new FakeBaleenContentExtractor();
annotator.initialize(context, Collections.emptyMap());
annotator.processStream(new ByteArrayInputStream("Hello World".getBytes()), "test", jCas);
assertTrue(annotator.processed);
}
@Test
public void testGetMonitor() throws ResourceInitializationException {
FakeBaleenContentExtractor annotator = new FakeBaleenContentExtractor();
annotator.initialize(context, Collections.emptyMap());
assertNotNull(annotator.getMonitor());
assertEquals(PIPELINE_NAME, annotator.getMonitor().getPipelineName());
}
@Test
public void testGetSupport() throws ResourceInitializationException {
FakeBaleenContentExtractor annotator = new FakeBaleenContentExtractor();
annotator.initialize(context, Collections.emptyMap());
assertNotNull(annotator.getSupport());
assertEquals(PIPELINE_NAME, annotator.getSupport().getPipelineName());
}
@Test
public void testSupport() throws ResourceInitializationException {
FakeBaleenContentExtractor annotator = new MockedBaleenContentExtractor();
annotator.initialize(context, Collections.emptyMap());
List<Annotation> list = Collections.singletonList(annotation);
annotator.addToJCasIndex(annotation);
verify(support, only()).add(annotation);
resetMocked();
annotator.addToJCasIndex(list);
verify(support, only()).add(list);
resetMocked();
annotator.getDocumentAnnotation(jCas);
verify(support, only()).getDocumentAnnotation(jCas);
resetMocked();
}
@Test
public void testAddMetadata() throws ResourceInitializationException {
FakeBaleenContentExtractor annotator = new MockedBaleenContentExtractor();
annotator.initialize(context, Collections.emptyMap());
Metadata md = annotator.addMetadata(jCas, KEY, VALUE);
verify(support).add(md);
assertNull(annotator.addMetadata(jCas, "", VALUE));
assertNull(annotator.addMetadata(jCas, null, VALUE));
assertNull(annotator.addMetadata(jCas, KEY, ""));
assertNull(annotator.addMetadata(jCas, KEY, null));
resetMocked();
}
private void resetMocked() {
reset(support, monitor);
}
private class FakeBaleenContentExtractor extends BaleenContentExtractor {
private boolean initialised;
private boolean processed;
private boolean destroyed;
@Override
public void doInitialize(UimaContext context, Map<String, Object> params) {
initialised = true;
}
@Override
protected void doProcessStream(InputStream stream, String source, JCas jCas) {
processed = true;
}
@Override
protected void doDestroy() {
destroyed = true;
}
}
private class MockedBaleenContentExtractor extends FakeBaleenContentExtractor {
@Override
protected UimaMonitor createMonitor(String pipelineName) {
return monitor;
}
@Override
protected UimaSupport createSupport(String pipelineName, UimaContext context) {
return support;
}
}
}