package eu.dnetlib.iis.wf.importer.input.approver;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
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.data.proto.KindProtos.Kind;
import eu.dnetlib.data.proto.OafProtos.Oaf;
import eu.dnetlib.iis.wf.importer.infospace.approver.ComplexApprover;
import eu.dnetlib.iis.wf.importer.infospace.approver.ResultApprover;
/**
* @author mhorst
*
*/
@RunWith(MockitoJUnitRunner.class)
public class ComplexApproverTest {
@Mock
private ResultApprover approver1;
@Mock
private ResultApprover approver2;
@Captor
private ArgumentCaptor<Oaf> approver1Captor;
@Captor
private ArgumentCaptor<Oaf> approver2Captor;
// ----------------------------- TESTS ----------------------------
@Test
public void testApproveEmpty() throws Exception {
// given
Oaf oaf = buildOaf();
ComplexApprover complexApprover = new ComplexApprover();
// execute & assert
assertTrue(complexApprover.approve(oaf));
}
@Test
public void testApprove() throws Exception {
// given
Oaf oaf = buildOaf();
ComplexApprover complexApprover = new ComplexApprover(approver1, approver2);
doReturn(true).when(approver1).approve(oaf);
doReturn(true).when(approver2).approve(oaf);
// execute
boolean result = complexApprover.approve(oaf);
// assert
assertTrue(result);
verify(approver1).approve(approver1Captor.capture());
verify(approver2).approve(approver2Captor.capture());
assertTrue(oaf == approver1Captor.getValue());
assertTrue(oaf == approver2Captor.getValue());
}
@Test
public void testDisapproveFirst() throws Exception {
// given
Oaf oaf = buildOaf();
ComplexApprover complexApprover = new ComplexApprover(approver1, approver2);
doReturn(false).when(approver1).approve(oaf);
// execute
boolean result = complexApprover.approve(oaf);
// assert
assertFalse(result);
verify(approver1, times(1)).approve(approver1Captor.capture());
verify(approver2, never()).approve(approver2Captor.capture());
assertTrue(oaf == approver1Captor.getValue());
}
@Test
public void testDisapproveLast() throws Exception {
// given
Oaf oaf = buildOaf();
ComplexApprover complexApprover = new ComplexApprover(approver1, approver2);
doReturn(true).when(approver1).approve(oaf);
doReturn(false).when(approver2).approve(oaf);
// execute
boolean result = complexApprover.approve(oaf);
// assert
assertFalse(result);
verify(approver1).approve(approver1Captor.capture());
verify(approver2).approve(approver2Captor.capture());
assertTrue(oaf == approver1Captor.getValue());
assertTrue(oaf == approver2Captor.getValue());
}
// ----------------------------- PRIVATE --------------------------
private Oaf buildOaf() {
return Oaf.newBuilder().setKind(Kind.entity).build();
}
}