package eu.dnetlib.iis.wf.importer.concept;
import static eu.dnetlib.iis.wf.importer.ImportWorkflowRuntimeParameters.IMPORT_FACADE_FACTORY_CLASS;
import static eu.dnetlib.iis.common.WorkflowRuntimeParameters.OOZIE_ACTION_OUTPUT_FILENAME;
import static eu.dnetlib.iis.wf.importer.VerificationUtils.verifyReport;
import static eu.dnetlib.iis.wf.importer.concept.ISLookupServiceBasedConceptImporter.CONCEPT_COUNTER_NAME;
import static eu.dnetlib.iis.wf.importer.concept.ISLookupServiceBasedConceptImporter.PARAM_IMPORT_CONTEXT_IDS_CSV;
import static eu.dnetlib.iis.wf.importer.concept.ISLookupServiceBasedConceptImporter.PORT_OUT_CONCEPTS;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.avro.file.DataFileWriter;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import eu.dnetlib.iis.common.java.PortBindings;
import eu.dnetlib.iis.common.java.porttype.AvroPortType;
import eu.dnetlib.iis.common.java.porttype.PortType;
import eu.dnetlib.iis.importer.schemas.Concept;
import eu.dnetlib.iis.wf.importer.facade.ServiceFacadeException;
/**
* @author mhorst
*
*/
@RunWith(MockitoJUnitRunner.class)
public class ISLookupServiceBasedConceptImporterTest {
private PortBindings portBindings;
private Configuration conf;
private Map<String, String> parameters;
private ISLookupServiceBasedConceptImporter importer;
@Rule
public TemporaryFolder testFolder = new TemporaryFolder();
@Mock
private DataFileWriter<Concept> conceptWriter;
@Captor
private ArgumentCaptor<Concept> conceptCaptor;
@Before
public void init() throws Exception {
System.setProperty(OOZIE_ACTION_OUTPUT_FILENAME,
testFolder.getRoot().getAbsolutePath() + File.separatorChar + "test.properties");
Map<String, Path> output = new HashMap<>();
output.put(PORT_OUT_CONCEPTS, new Path("/irrelevant/location/as/it/will/be/mocked"));
this.portBindings = new PortBindings(Collections.emptyMap(), output);
this.conf = new Configuration();
this.parameters = new HashMap<>();
this.parameters.put(IMPORT_FACADE_FACTORY_CLASS,
"eu.dnetlib.iis.wf.importer.concept.MockISLookupFacadeFactory");
this.parameters.put(PARAM_IMPORT_CONTEXT_IDS_CSV, "fet");
importer = new ISLookupServiceBasedConceptImporter() {
@Override
protected DataFileWriter<Concept> getWriter(FileSystem fs, PortBindings portBindings) throws IOException {
return conceptWriter;
}
};
}
// ----------------------------------- TESTS -----------------------------------
@Test
public void testGetInputPorts() throws Exception {
// execute
Map<String, PortType> result = importer.getInputPorts();
// assert
assertNotNull(result);
assertTrue(result.isEmpty());
}
@Test
public void testGetOutputPorts() throws Exception {
// execute
Map<String, PortType> result = importer.getOutputPorts();
// assert
assertNotNull(result);
assertNotNull(result.get(PORT_OUT_CONCEPTS));
assertTrue(result.get(PORT_OUT_CONCEPTS) instanceof AvroPortType);
assertTrue(Concept.SCHEMA$ == ((AvroPortType)result.get(PORT_OUT_CONCEPTS)).getSchema());
}
@Test(expected=ServiceFacadeException.class)
public void testRunWithoutISLookupFacade() throws Exception {
// given
parameters.remove(IMPORT_FACADE_FACTORY_CLASS);
// execute
importer.run(portBindings, conf, parameters);
}
@Test(expected=IllegalArgumentException.class)
public void testRunWithoutContextIds() throws Exception {
// given
parameters.remove(PARAM_IMPORT_CONTEXT_IDS_CSV);
// execute
importer.run(portBindings, conf, parameters);
}
@Test
public void testRunEmptyResult() throws Exception {
// given
this.parameters.put(IMPORT_FACADE_FACTORY_CLASS,
"eu.dnetlib.iis.wf.importer.concept.EmptyResultsISLookupFacadeFactory");
// execute
importer.run(portBindings, conf, parameters);
// assert
verify(conceptWriter, never()).append(any());
verifyReport(0, CONCEPT_COUNTER_NAME);
}
@Test
public void testRun() throws Exception {
// execute
importer.run(portBindings, conf, parameters);
// assert
verify(conceptWriter, times(3)).append(conceptCaptor.capture());
List<Concept> concepts = conceptCaptor.getAllValues();
// in depth concept validation is not the subject of this test case
assertEquals(3, concepts.size());
assertNotNull(concepts.get(0));
assertNotNull(concepts.get(1));
assertNotNull(concepts.get(2));
verifyReport(3, CONCEPT_COUNTER_NAME);
}
}