package eu.dnetlib.iis.wf.citationmatching.direct.service;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.iterableWithSize;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.verify;
import java.util.Iterator;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.PairFlatMapFunction;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import eu.dnetlib.iis.citationmatching.direct.schemas.Citation;
import eu.dnetlib.iis.citationmatching.direct.schemas.DocumentMetadata;
import eu.dnetlib.iis.citationmatching.direct.schemas.ReferenceMetadata;
import scala.Tuple2;
/**
*
* @author madryk
*
*/
@RunWith(MockitoJUnitRunner.class)
public class ExternalIdReferenceExtractorTest {
private ExternalIdReferenceExtractor externalIdReferenceExtractor = new ExternalIdReferenceExtractor();
@Mock
private JavaRDD<DocumentMetadata> docMetadataRdd;
@Mock
private JavaPairRDD<String, Citation> externalIdReferencesRdd;
@Captor
private ArgumentCaptor<PairFlatMapFunction<DocumentMetadata, String, Citation>> flatMapCitationsFunctionArg;
//------------------------ TEST --------------------------
@Test(expected = NullPointerException.class)
public void extractExternalIdReferences_NULL_ID_TYPE() {
// execute
externalIdReferenceExtractor.extractExternalIdReferences(docMetadataRdd, null);
}
@Test(expected = NullPointerException.class)
public void extractExternalIdReferences_NULL_DOC_METADATA() {
// execute
externalIdReferenceExtractor.extractExternalIdReferences(null, "someIdType");
}
@Test
public void extractExternalIdReferences() throws Exception {
// given
doReturn(externalIdReferencesRdd).when(docMetadataRdd).flatMapToPair(any());
// execute
JavaPairRDD<String, Citation> retExternalIdReferencesRdd = externalIdReferenceExtractor.extractExternalIdReferences(docMetadataRdd, "someIdType");
// assert
assertTrue(retExternalIdReferencesRdd == externalIdReferencesRdd);
verify(docMetadataRdd).flatMapToPair(flatMapCitationsFunctionArg.capture());
assertFlatMapCitationsFunction(flatMapCitationsFunctionArg.getValue());
}
//------------------------ PRIVATE --------------------------
private void assertFlatMapCitationsFunction(PairFlatMapFunction<DocumentMetadata, String, Citation> function) throws Exception {
ReferenceMetadata referenceMetadata1 = new ReferenceMetadata(1, null);
ReferenceMetadata referenceMetadata2 = new ReferenceMetadata(2, Maps.newHashMap());
ReferenceMetadata referenceMetadata3 = new ReferenceMetadata(3, Maps.newHashMap());
referenceMetadata3.getExternalIds().put("someIdType", "ref.id1");
referenceMetadata3.getExternalIds().put("someOtherIdType", "ref.other.id1");
ReferenceMetadata referenceMetadata4 = new ReferenceMetadata(4, Maps.newHashMap());
referenceMetadata4.getExternalIds().put("someIdType", "ref.id2");
referenceMetadata4.getExternalIds().put("someOtherIdType", "ref.other.id2");
assertThat(function.call(new DocumentMetadata("id-1", null, null, Lists.newArrayList())), iterableWithSize(0));
assertThat(function.call(new DocumentMetadata("id-1", null, null, Lists.newArrayList(referenceMetadata1))), iterableWithSize(0));
assertThat(function.call(new DocumentMetadata("id-1", null, null, Lists.newArrayList(referenceMetadata2))), iterableWithSize(0));
Iterable<Tuple2<String, Citation>> references = function.call(new DocumentMetadata("id-1", null, null, Lists.newArrayList(referenceMetadata3, referenceMetadata4)));
assertThat(references, iterableWithSize(2));
Iterator<Tuple2<String, Citation>> referenceIterator = references.iterator();
Tuple2<String, Citation> firstReference = referenceIterator.next();
Tuple2<String, Citation> secondReference = referenceIterator.next();
assertThat(firstReference, equalTo(new Tuple2<String, Citation>("ref.id1", new Citation("id-1", 3, null))));
assertThat(secondReference, equalTo(new Tuple2<String, Citation>("ref.id2", new Citation("id-1", 4, null))));
}
}