package eu.dnetlib.iis.wf.citationmatching.direct.service;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.Function;
import org.junit.Before;
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 org.powermock.reflect.Whitebox;
import eu.dnetlib.iis.citationmatching.direct.schemas.Citation;
import eu.dnetlib.iis.citationmatching.direct.schemas.DocumentMetadata;
import scala.Tuple2;
/**
*
* @author madryk
*
*/
@RunWith(MockitoJUnitRunner.class)
public class ExternalIdCitationMatcherTest {
private ExternalIdCitationMatcher externalIdCitationMatcher = new ExternalIdCitationMatcher();
@Mock
private IdentifierMappingExtractor idMappingExtractor;
@Mock
private ExternalIdReferenceExtractor referencePicker;
@Mock
private JavaRDD<DocumentMetadata> documentsMetadataRdd;
@Mock
private Function<Iterable<DocumentMetadata>, DocumentMetadata> pickOneDocumentMetadataFunction;
@Mock
private JavaPairRDD<String, String> idMappingRdd;
@Mock
private JavaPairRDD<String, Citation> externalIdReferencesRdd;
@Mock
private JavaPairRDD<String, Tuple2<Citation, String>> joinedRdd;
@Captor
private ArgumentCaptor<Function<Tuple2<String, Tuple2<Citation, String>>, Citation>> fillCitationFunctionArg;
@Mock
private JavaRDD<Citation> citationsRdd;
@Before
public void setUp() {
Whitebox.setInternalState(externalIdCitationMatcher, "idMappingExtractor", idMappingExtractor);
Whitebox.setInternalState(externalIdCitationMatcher, "referencePicker", referencePicker);
}
//------------------------ TESTS --------------------------
@Test(expected = NullPointerException.class)
public void matchCitations_NULL_DOCUMENTS_METADATA_RDD() {
// execute
externalIdCitationMatcher.matchCitations(null, "someIdType", pickOneDocumentMetadataFunction);
}
@Test(expected = NullPointerException.class)
public void matchCitations_NULL_ID_TYPE() {
// execute
externalIdCitationMatcher.matchCitations(documentsMetadataRdd, null, pickOneDocumentMetadataFunction);
}
@Test(expected = NullPointerException.class)
public void matchCitations_NULL_PICK_SINGLE_FUNCTION() {
// execute
externalIdCitationMatcher.matchCitations(documentsMetadataRdd, "someIdType", null);
}
@Test
public void matchCitations() throws Exception {
// given
doReturn(idMappingRdd).when(idMappingExtractor).extractIdMapping(documentsMetadataRdd, "someIdType", pickOneDocumentMetadataFunction);
doReturn(externalIdReferencesRdd).when(referencePicker).extractExternalIdReferences(documentsMetadataRdd, "someIdType");
doReturn(joinedRdd).when(externalIdReferencesRdd).join(idMappingRdd);
doReturn(citationsRdd).when(joinedRdd).map(any());
// execute
JavaRDD<Citation> retCitationsRdd = externalIdCitationMatcher.matchCitations(documentsMetadataRdd, "someIdType", pickOneDocumentMetadataFunction);
// assert
assertTrue(retCitationsRdd == citationsRdd);
verify(idMappingExtractor).extractIdMapping(documentsMetadataRdd, "someIdType", pickOneDocumentMetadataFunction);
verify(referencePicker).extractExternalIdReferences(documentsMetadataRdd, "someIdType");
verify(externalIdReferencesRdd).join(idMappingRdd);
verify(joinedRdd).map(fillCitationFunctionArg.capture());
assertFillCitationFunction(fillCitationFunctionArg.getValue());
}
//------------------------ PRIVATE --------------------------
private void assertFillCitationFunction(Function<Tuple2<String, Tuple2<Citation, String>>, Citation> function) throws Exception {
Citation partialCitation = new Citation("source-id", 4, null);
Tuple2<Citation, String> partialCitationWithDestDocumentId = new Tuple2<>(partialCitation, "dest-id");
Tuple2<String, Tuple2<Citation, String>> tuple = new Tuple2<>("external-id", partialCitationWithDestDocumentId);
Citation retCitation = function.call(tuple);
assertEquals(new Citation("source-id", 4, "dest-id"), retCitation);
}
}