package eu.dnetlib.iis.wf.affmatching.bucket.projectorg.read; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertFalse; 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 static org.mockito.Mockito.when; 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.Test; 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.wf.affmatching.bucket.projectorg.model.AffMatchDocumentOrganization; import eu.dnetlib.iis.wf.affmatching.bucket.projectorg.model.AffMatchDocumentProject; import eu.dnetlib.iis.wf.affmatching.bucket.projectorg.model.AffMatchProjectOrganization; import scala.Tuple2; /** * @author mhorst * */ @RunWith(MockitoJUnitRunner.class) public class DocumentOrganizationCombinerTest { DocumentOrganizationCombiner builder = new DocumentOrganizationCombiner(); @Mock private JavaRDD<AffMatchDocumentProject> documentProjectRdd; @Captor private ArgumentCaptor<Function<AffMatchDocumentProject, String>> keyByDocumentProjectFunction; @Mock private JavaPairRDD<String, AffMatchDocumentProject> documentProjectPairedRdd; @Captor private ArgumentCaptor<Function<Tuple2<String, AffMatchDocumentProject>, Boolean>> filterDocumentProjectFunction; @Mock private JavaPairRDD<String, AffMatchDocumentProject> documentProjectPairedFilteredRdd; @Mock private JavaRDD<AffMatchProjectOrganization> projectOrganizationRdd; @Captor private ArgumentCaptor<Function<AffMatchProjectOrganization, String>> keyByProjectOrganizationFunction; @Mock private JavaPairRDD<String, AffMatchProjectOrganization> projectOrganizationPairedRdd; @Mock private JavaPairRDD<String, Tuple2<AffMatchDocumentProject, AffMatchProjectOrganization>> documentOrganizationJoinedRdd; @Captor private ArgumentCaptor<Function<Tuple2<String, Tuple2<AffMatchDocumentProject, AffMatchProjectOrganization>>, AffMatchDocumentOrganization>> createDocumentOrganizationMapFunction; @Mock private JavaRDD<AffMatchDocumentOrganization> documentOrganizationMappedRdd; @Mock private JavaRDD<AffMatchDocumentOrganization> documentOrganizationDistinctRdd; private final String documentId = "docId"; private final String projectId = "projId"; private final String organizationId = "orgId"; private final Float confidenceLevel = 0.9f; // ------------------------ TESTS -------------------------- @Test(expected = NullPointerException.class) public void build_NULL_DOCUMENT_PROJECT() { // execute builder.combine(null, projectOrganizationRdd, null); } @Test(expected = NullPointerException.class) public void build_NULL_PROJECT_ORGANIZATION() { // execute builder.combine(documentProjectRdd, null, null); } @Test public void build_WITH_NULL_THRESHOLD() throws Exception { // given stub(); Float docProjConfidenceLevelThreshold = null; // execute JavaRDD<AffMatchDocumentOrganization> result = builder.combine(documentProjectRdd, projectOrganizationRdd, docProjConfidenceLevelThreshold); // assert assertResults(result, docProjConfidenceLevelThreshold); } @Test public void build() throws Exception { // given stub(); Float docProjConfidenceLevelThreshold = 0.5f; // execute JavaRDD<AffMatchDocumentOrganization> result = builder.combine(documentProjectRdd, projectOrganizationRdd, docProjConfidenceLevelThreshold); // assert assertResults(result, docProjConfidenceLevelThreshold); } // ------------------------ PRIVATE -------------------------- private void stub() { doReturn(documentProjectPairedRdd).when(documentProjectRdd).keyBy(any()); doReturn(documentProjectPairedFilteredRdd).when(documentProjectPairedRdd).filter(any()); doReturn(projectOrganizationPairedRdd).when(projectOrganizationRdd).keyBy(any()); doReturn(documentOrganizationJoinedRdd).when(documentProjectPairedFilteredRdd).join(any()); doReturn(documentOrganizationMappedRdd).when(documentOrganizationJoinedRdd).map(any()); when(documentOrganizationMappedRdd.distinct()).thenReturn(documentOrganizationDistinctRdd); } private void assertResults(JavaRDD<AffMatchDocumentOrganization> result, Float docProjConfidenceLevelThreshold) throws Exception { assertTrue(result == documentOrganizationDistinctRdd); verify(documentProjectRdd).keyBy(keyByDocumentProjectFunction.capture()); assertKeyByDocumentProjectFunction(keyByDocumentProjectFunction.getValue()); verify(documentProjectPairedRdd).filter(filterDocumentProjectFunction.capture()); assertFilterDocumentProjectFunction(filterDocumentProjectFunction.getValue(), docProjConfidenceLevelThreshold); verify(projectOrganizationRdd).keyBy(keyByProjectOrganizationFunction.capture()); assertKeyByProjectOrganizationFunction(keyByProjectOrganizationFunction.getValue()); verify(documentProjectPairedFilteredRdd).join(projectOrganizationPairedRdd); verify(documentOrganizationJoinedRdd).map(createDocumentOrganizationMapFunction.capture()); assertMapDocumentOrganizationFunction(createDocumentOrganizationMapFunction.getValue()); verify(documentOrganizationMappedRdd).distinct(); } private void assertKeyByDocumentProjectFunction(Function<AffMatchDocumentProject, String> function) throws Exception { // given AffMatchDocumentProject docProj = new AffMatchDocumentProject(documentId, projectId, confidenceLevel); // execute String projId = function.call(docProj); // assert assertThat(projId, equalTo(projectId)); } private void assertFilterDocumentProjectFunction(Function<Tuple2<String, AffMatchDocumentProject>, Boolean> function, Float confidenceLevelThreshold) throws Exception { if (confidenceLevelThreshold != null) { // given float greaterConfidenceLevel = confidenceLevelThreshold+0.1f; // execute & assert assertTrue(function.call(new Tuple2<String, AffMatchDocumentProject>(projectId, new AffMatchDocumentProject(documentId, projectId, greaterConfidenceLevel)))); // given float smallerConfidenceLevel = confidenceLevelThreshold-0.1f; // execute & assert assertFalse(function.call(new Tuple2<String, AffMatchDocumentProject>(projectId, new AffMatchDocumentProject(documentId, projectId, smallerConfidenceLevel)))); } else { // execute & assert assertTrue(function.call(new Tuple2<String, AffMatchDocumentProject>(projectId, new AffMatchDocumentProject(documentId, projectId, 0.0001f)))); } } private void assertKeyByProjectOrganizationFunction( Function<AffMatchProjectOrganization, String> function) throws Exception { // given AffMatchProjectOrganization projOrg = new AffMatchProjectOrganization(projectId, organizationId); // execute String projId = function.call(projOrg); // assert assertThat(projId, equalTo(projectId)); } private void assertMapDocumentOrganizationFunction( Function<Tuple2<String, Tuple2<AffMatchDocumentProject, AffMatchProjectOrganization>>, AffMatchDocumentOrganization> function) throws Exception { // execute AffMatchDocumentOrganization result = function .call(new Tuple2<String, Tuple2<AffMatchDocumentProject, AffMatchProjectOrganization>>(projectId, new Tuple2<AffMatchDocumentProject, AffMatchProjectOrganization>( new AffMatchDocumentProject(documentId, projectId, confidenceLevel), new AffMatchProjectOrganization(projectId, organizationId)))); // assert assertThat(result.getDocumentId(), equalTo(documentId)); assertThat(result.getOrganizationId(), equalTo(organizationId)); } }