package org.ei.drishti.service;
import org.ei.drishti.domain.EligibleCouple;
import org.ei.drishti.domain.FPProductInformation;
import org.ei.drishti.domain.register.*;
import org.ei.drishti.form.domain.FormSubmission;
import org.ei.drishti.repository.AllEligibleCouples;
import org.ei.drishti.service.formSubmission.handler.ReportFieldsDefinition;
import org.ei.drishti.service.reporting.ECReportingService;
import org.ei.drishti.service.scheduling.ECSchedulingService;
import org.ei.drishti.util.FormSubmissionBuilder;
import org.ei.drishti.util.SafeMap;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.Mock;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static java.util.Arrays.asList;
import static org.ei.drishti.common.util.EasyMap.create;
import static org.ei.drishti.common.util.EasyMap.mapOf;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.initMocks;
public class ECServiceTest {
@Mock
private AllEligibleCouples allEligibleCouples;
@Mock
private ECReportingService reportingService;
@Mock
private ECSchedulingService schedulingService;
@Mock
private ReportFieldsDefinition reportFieldsDefinition;
private ECService ecService;
@Before
public void setUp() throws Exception {
initMocks(this);
ecService = new ECService(allEligibleCouples, schedulingService, reportingService, reportFieldsDefinition);
}
@Test
public void shouldRegisterEligibleCouple() throws Exception {
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("ec_registration")
.withANMId("anm id 1")
.withEntityId("entity id 1")
.addFormField("someKey", "someValue")
.addFormField("lmpDate", "2011-01-01")
.addFormField("uptResult", "negative")
.addFormField("currentMethod", "iud")
.addFormField("isHighPriority", "yes")
.addFormField("submissionDate", "2011-01-01")
.addFormField("dmpaInjectionDate", "2010-12-20")
.addFormField("numberOfOCPDelivered", "1")
.addFormField("ocpRefillDate", "2010-12-25")
.addFormField("iudPlace", "phc")
.addFormField("familyPlanningMethodChangeDate", "2011-01-01")
.build();
EligibleCouple eligibleCouple = new EligibleCouple("entity id 1", "0").withCouple("Wife 1", "Husband 1");
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(eligibleCouple);
when(reportFieldsDefinition.get("ec_registration")).thenReturn(asList("someKey"));
ecService.registerEligibleCouple(submission);
verify(allEligibleCouples).update(Matchers.eq(eligibleCouple
.withANMIdentifier("ANM X")
.withIUDFPDetails(asList(new IUDFPDetails("2011-01-01", "phc", "2011-01-01", "negative")))
.withCondomFPDetails(Collections.<CondomFPDetails>emptyList())
.withOCPFPDetails(Collections.<OCPFPDetails>emptyList())
.withFemaleSterilizationFPDetails(Collections.<FemaleSterilizationFPDetails>emptyList())
.withMaleSterilizationFPDetails(Collections.<MaleSterilizationFPDetails>emptyList())
));
verify(reportingService).registerEC(new SafeMap(mapOf("someKey", "someValue")));
verify(schedulingService).registerEC(new FPProductInformation("entity id 1", "anm id 1", "iud", null, "2010-12-20", "1", "2010-12-25"
, null, "2011-01-01", "2011-01-01", null, null, null));
}
@Test
public void shouldRegisterEligibleCoupleAndUpdateCondomDetails() throws Exception {
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("ec_registration")
.withANMId("anm id 1")
.withEntityId("entity id 1")
.addFormField("someKey", "someValue")
.addFormField("lmpDate", "2011-01-01")
.addFormField("uptResult", "negative")
.addFormField("currentMethod", "some method")
.addFormField("isHighPriority", "yes")
.addFormField("submissionDate", "2011-01-01")
.addFormField("dmpaInjectionDate", "2010-12-20")
.addFormField("familyPlanningMethodChangeDate", "2011-01-01")
.addFormField("numberOfCondomsSupplied", "20")
.build();
EligibleCouple eligibleCouple = new EligibleCouple("entity id 1", "0").withCouple("Wife 1", "Husband 1");
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(eligibleCouple);
when(reportFieldsDefinition.get("ec_registration")).thenReturn(asList("someKey"));
ecService.registerEligibleCouple(submission);
verify(allEligibleCouples).update(eligibleCouple
.withANMIdentifier("ANM X")
.withCondomFPDetails(asList(new CondomFPDetails("2011-01-01",
asList(create("date", "2011-01-01").put("quantity", "20").map())))));
verify(reportingService).registerEC(new SafeMap(mapOf("someKey", "someValue")));
verify(schedulingService).registerEC(new FPProductInformation("entity id 1", "anm id 1", "some method", null, "2010-12-20", null, null
, "20", "2011-01-01", "2011-01-01", null, null, null));
}
@Test
public void shouldUpdateCurrentFPMethodOfECWhenFPMethodIsChanged() throws Exception {
List<CondomFPDetails> condomFPDetails = new ArrayList<>();
condomFPDetails.add(new CondomFPDetails(
"2010-01-01", asList(create("date", "2010-01-01").put("quantity", "20").map())));
EligibleCouple ec = new EligibleCouple("entity id 1", "EC Number 1")
.withDetails(create("currentMethod", "ocp").put("caste", "c_others").map())
.withIUDFPDetails(Collections.<IUDFPDetails>emptyList())
.withCondomFPDetails(condomFPDetails)
.withOCPFPDetails(asList(new OCPFPDetails(
"2010-06-01", asList(create("date", "2011-06-01").put("quantity", "20").map()), "2011-06-01", "negative")))
.withFemaleSterilizationFPDetails(Collections.<FemaleSterilizationFPDetails>emptyList())
.withMaleSterilizationFPDetails(Collections.<MaleSterilizationFPDetails>emptyList());
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(ec);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("fp_change")
.addFormField("currentMethod", "ocp")
.addFormField("newMethod", "condom")
.addFormField("familyPlanningMethodChangeDate", "2011-01-01")
.addFormField("numberOfCondomsSupplied", "20")
.build();
EligibleCouple expectedEc = new EligibleCouple("entity id 1", "EC Number 1")
.withDetails(create("currentMethod", "condom")
.put("caste", "c_others")
.map())
.withIUDFPDetails(Collections.<IUDFPDetails>emptyList())
.withOCPFPDetails(asList(new OCPFPDetails(
"2010-06-01", asList(create("date", "2011-06-01").put("quantity", "20").map()), "2011-06-01", "negative")))
.withFemaleSterilizationFPDetails(Collections.<FemaleSterilizationFPDetails>emptyList())
.withMaleSterilizationFPDetails(Collections.<MaleSterilizationFPDetails>emptyList())
.withCondomFPDetails(asList(new CondomFPDetails(
"2010-01-01", asList(create("date", "2010-01-01").put("quantity", "20").map())),
new CondomFPDetails("2011-01-01",
asList(create("date", "2011-01-01").put("quantity", "20").map()))));
ecService.reportFPChange(submission);
verify(allEligibleCouples).update(expectedEc);
}
@Test
public void shouldSendDataToReportingServiceDuringReportFPChange() throws Exception {
EligibleCouple ec = new EligibleCouple("entity id 1", "EC Number 1").withDetails(create("caste", "sc").put("economicStatus", "bpl").map())
.withIUDFPDetails(new ArrayList<IUDFPDetails>())
.withCondomFPDetails(new ArrayList<CondomFPDetails>())
.withOCPFPDetails(new ArrayList<OCPFPDetails>())
.withFemaleSterilizationFPDetails(new ArrayList<FemaleSterilizationFPDetails>())
.withMaleSterilizationFPDetails(new ArrayList<MaleSterilizationFPDetails>());
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(ec);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("fp_change")
.addFormField("someKey", "someValue")
.addFormField("newMethod", "condom")
.build();
when(reportFieldsDefinition.get("fp_change")).thenReturn(asList("someKey"));
ecService.reportFPChange(submission);
verify(allEligibleCouples).findByCaseId("entity id 1");
verify(reportingService).fpChange(new SafeMap(create("someKey", "someValue").put("caste", "sc").put("economicStatus", "bpl").map()));
}
@Test
public void shouldNotDoAnythingDuringReportFPChangeIfNoECIsFound() throws Exception {
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(null);
FormSubmission submission = FormSubmissionBuilder.create().build();
ecService.reportFPChange(submission);
verify(allEligibleCouples).findByCaseId("entity id 1");
verifyZeroInteractions(reportingService);
verifyZeroInteractions(schedulingService);
}
@Test
public void shouldUpdateECSchedulesWhenFPMethodIsChanged() throws Exception {
EligibleCouple ec = new EligibleCouple("entity id 1", "EC Number 1").withDetails(Collections.<String, String>emptyMap());
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(ec);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("fp_change")
.withANMId("anm id 1")
.addFormField("currentMethod", "previous method")
.addFormField("newMethod", "new method")
.addFormField("submissionDate", "2011-01-01")
.addFormField("familyPlanningMethodChangeDate", "2011-01-02")
.addFormField("numberOfOCPDelivered", "1")
.addFormField("numberOfCondomsSupplied", "20")
.build();
when(reportFieldsDefinition.get("fp_change")).thenReturn(asList("someKey"));
ecService.reportFPChange(submission);
verify(schedulingService).fpChange(
new FPProductInformation("entity id 1", "anm id 1", "new method",
"previous method", null, "1", null, "20", "2011-01-01", "2011-01-02", null, null, null));
}
@Test
public void shouldUseSubmissionDateAsChangeDateWhenFPMethodIsChangedAndChangeDateIsBlank() throws Exception {
EligibleCouple ec = new EligibleCouple("entity id 1", "EC Number 1").withDetails(Collections.<String, String>emptyMap());
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(ec);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("fp_change")
.withANMId("anm id 1")
.addFormField("currentMethod", "previous method")
.addFormField("newMethod", "none")
.addFormField("submissionDate", "2011-02-01")
.build();
when(reportFieldsDefinition.get("fp_change")).thenReturn(asList("someKey"));
ecService.reportFPChange(submission);
verify(schedulingService).fpChange(
new FPProductInformation("entity id 1", "anm id 1", "none",
"previous method", null, null, null, null, "2011-02-01", "2011-02-01", null, null, null));
}
@Test
public void shouldUpdateECSchedulesWhenCondomFPProductIsRenewed() throws Exception {
List<Map<String, String>> refillsForFirstCondomFPDetail = new ArrayList<>();
refillsForFirstCondomFPDetail.add(create("date", "2010-01-01").put("quantity", "10").map());
refillsForFirstCondomFPDetail.add(create("date", "2010-05-01").put("quantity", "10").map());
List<Map<String, String>> refillsForSecondCondomFPDetail = new ArrayList<>();
refillsForSecondCondomFPDetail.add(create("date", "2011-01-01").put("quantity", "10").map());
List<CondomFPDetails> condomFPDetails = new ArrayList<>();
condomFPDetails.add(new CondomFPDetails("2010-01-01", refillsForFirstCondomFPDetail));
condomFPDetails.add(new CondomFPDetails("2011-01-01", refillsForSecondCondomFPDetail));
EligibleCouple ec = new EligibleCouple("entity id 1", "EC Number 1")
.withIUDFPDetails(Collections.<IUDFPDetails>emptyList())
.withCondomFPDetails(condomFPDetails)
.withOCPFPDetails(Collections.<OCPFPDetails>emptyList())
.withMaleSterilizationFPDetails(Collections.<MaleSterilizationFPDetails>emptyList())
.withFemaleSterilizationFPDetails(Collections.<FemaleSterilizationFPDetails>emptyList());
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(ec);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("renew_fp_product")
.withANMId("anm id 1")
.addFormField("currentMethod", "condom")
.addFormField("fpRenewMethodVisitDate", "2011-01-01")
.addFormField("submissionDate", "2011-01-01")
.addFormField("numberOfOCPDelivered", "1")
.addFormField("ocpRefillDate", "2010-12-25")
.addFormField("dmpaInjectionDate", "2010-12-20")
.addFormField("numberOfCondomsSupplied", "20")
.build();
List<Map<String, String>> expectedRefillsForFirstCondomFPDetail = new ArrayList<>();
expectedRefillsForFirstCondomFPDetail.add(create("date", "2010-01-01").put("quantity", "10").map());
expectedRefillsForFirstCondomFPDetail.add(create("date", "2010-05-01").put("quantity", "10").map());
List<Map<String, String>> expectedRefillsForSecondCondomFPDetail = new ArrayList<>();
expectedRefillsForSecondCondomFPDetail.add(create("date", "2011-01-01").put("quantity", "10").map());
expectedRefillsForSecondCondomFPDetail.add(create("date", "2011-01-01").put("quantity", "20").map());
List<CondomFPDetails> expectedCondomDetails = new ArrayList<>();
expectedCondomDetails.add(new CondomFPDetails("2010-01-01", expectedRefillsForFirstCondomFPDetail));
expectedCondomDetails.add(new CondomFPDetails("2011-01-01", expectedRefillsForSecondCondomFPDetail));
EligibleCouple expectedEC = new EligibleCouple("entity id 1", "EC Number 1")
.withIUDFPDetails(Collections.<IUDFPDetails>emptyList())
.withCondomFPDetails(expectedCondomDetails)
.withOCPFPDetails(Collections.<OCPFPDetails>emptyList())
.withMaleSterilizationFPDetails(Collections.<MaleSterilizationFPDetails>emptyList())
.withFemaleSterilizationFPDetails(Collections.<FemaleSterilizationFPDetails>emptyList());
ecService.renewFPProduct(submission);
verify(schedulingService).renewFPProduct(new FPProductInformation("entity id 1", "anm id 1", "condom", null, "2010-12-20", "1", "2010-12-25", "20", "2011-01-01", null, null, null, null));
verify(allEligibleCouples).update(expectedEC);
}
@Test
public void shouldUpdateECSchedulesWhenOCPFPProductIsRenewed() throws Exception {
List<Map<String, String>> refillsForFirstOCPFPDetail = new ArrayList<>();
refillsForFirstOCPFPDetail.add(create("date", "2010-01-01").put("quantity", "10").map());
refillsForFirstOCPFPDetail.add(create("date", "2010-05-01").put("quantity", "10").map());
List<Map<String, String>> refillsForSecondOCPFPDetail = new ArrayList<>();
refillsForSecondOCPFPDetail.add(create("date", "2011-01-01").put("quantity", "10").map());
List<OCPFPDetails> ocpFPDetails = new ArrayList<>();
ocpFPDetails.add(new OCPFPDetails("2010-01-01", refillsForFirstOCPFPDetail, null, null));
ocpFPDetails.add(new OCPFPDetails("2011-01-01", refillsForSecondOCPFPDetail, null, null));
EligibleCouple ec = new EligibleCouple("entity id 1", "EC Number 1")
.withIUDFPDetails(Collections.<IUDFPDetails>emptyList())
.withCondomFPDetails(Collections.<CondomFPDetails>emptyList())
.withOCPFPDetails(ocpFPDetails)
.withMaleSterilizationFPDetails(Collections.<MaleSterilizationFPDetails>emptyList())
.withFemaleSterilizationFPDetails(Collections.<FemaleSterilizationFPDetails>emptyList());
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(ec);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("renew_fp_product")
.withANMId("anm id 1")
.addFormField("currentMethod", "ocp")
.addFormField("fpRenewMethodVisitDate", "2011-01-01")
.addFormField("submissionDate", "2011-01-01")
.addFormField("numberOfOCPDelivered", "15")
.addFormField("ocpRefillDate", "2010-12-25")
.addFormField("dmpaInjectionDate", "2010-12-20")
.addFormField("numberOfCondomsSupplied", "20")
.build();
List<Map<String, String>> expectedRefillsForFirstOCPFPDetail = new ArrayList<>();
expectedRefillsForFirstOCPFPDetail.add(create("date", "2010-01-01").put("quantity", "10").map());
expectedRefillsForFirstOCPFPDetail.add(create("date", "2010-05-01").put("quantity", "10").map());
List<Map<String, String>> expectedRefillsForSecondOCPFPDetail = new ArrayList<>();
expectedRefillsForSecondOCPFPDetail.add(create("date", "2011-01-01").put("quantity", "10").map());
expectedRefillsForSecondOCPFPDetail.add(create("date", "2011-01-01").put("quantity", "15").map());
List<OCPFPDetails> expectedOCPDetails = new ArrayList<>();
expectedOCPDetails.add(new OCPFPDetails("2010-01-01", expectedRefillsForFirstOCPFPDetail,null,null));
expectedOCPDetails.add(new OCPFPDetails("2011-01-01", expectedRefillsForSecondOCPFPDetail,null,null));
EligibleCouple expectedEC = new EligibleCouple("entity id 1", "EC Number 1")
.withIUDFPDetails(Collections.<IUDFPDetails>emptyList())
.withCondomFPDetails(Collections.<CondomFPDetails>emptyList())
.withOCPFPDetails(expectedOCPDetails)
.withMaleSterilizationFPDetails(Collections.<MaleSterilizationFPDetails>emptyList())
.withFemaleSterilizationFPDetails(Collections.<FemaleSterilizationFPDetails>emptyList());
ecService.renewFPProduct(submission);
verify(schedulingService).renewFPProduct(new FPProductInformation("entity id 1", "anm id 1", "ocp", null, "2010-12-20", "15", "2010-12-25", "20", "2011-01-01", null, null, null, null));
verify(allEligibleCouples).update(expectedEC);
}
@Test
public void shouldNotDoAnythingDuringRenewFPProductWhenNoECIsFound() throws Exception {
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(null);
FormSubmission submission = FormSubmissionBuilder.create().build();
ecService.renewFPProduct(submission);
verify(allEligibleCouples).findByCaseId("entity id 1");
verifyZeroInteractions(reportingService);
verifyZeroInteractions(schedulingService);
}
@Test
public void shouldUpdateECAndECSchedulesWhenFPFollowupOccurs() throws Exception {
List<MaleSterilizationFPDetails> maleSterilizationFPDetails = new ArrayList<>();
maleSterilizationFPDetails.add(new MaleSterilizationFPDetails("nsv", "2010-01-01", null));
List<String> followUpVisitDates = new ArrayList<>();
followUpVisitDates.add("2010-10-20");
maleSterilizationFPDetails.add(new MaleSterilizationFPDetails("nsv", "2010-10-01", followUpVisitDates));
EligibleCouple ec = new EligibleCouple("entity id 1", "EC Number 1")
.withIUDFPDetails(Collections.<IUDFPDetails>emptyList())
.withCondomFPDetails(Collections.<CondomFPDetails>emptyList())
.withOCPFPDetails(Collections.<OCPFPDetails>emptyList())
.withMaleSterilizationFPDetails(maleSterilizationFPDetails)
.withFemaleSterilizationFPDetails(Collections.<FemaleSterilizationFPDetails>emptyList());
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(ec);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("fp_followup")
.withANMId("anm id 1")
.addFormField("currentMethod", "male_sterilization")
.addFormField("submissionDate", "2011-01-01")
.addFormField("fpFollowupDate", "2010-12-20")
.addFormField("needsFollowup", "yes")
.addFormField("needsReferralFollowup", "no")
.build();
List<MaleSterilizationFPDetails> expectedMaleSterilizationDetails = new ArrayList<>();
expectedMaleSterilizationDetails.add(new MaleSterilizationFPDetails("nsv", "2010-01-01", null));
expectedMaleSterilizationDetails.add(new MaleSterilizationFPDetails("nsv", "2010-10-01", asList("2010-10-20", "2010-12-20")));
EligibleCouple expectedEC = new EligibleCouple("entity id 1", "EC Number 1")
.withMaleSterilizationFPDetails(expectedMaleSterilizationDetails)
.withIUDFPDetails(Collections.<IUDFPDetails>emptyList())
.withCondomFPDetails(Collections.<CondomFPDetails>emptyList())
.withOCPFPDetails(Collections.<OCPFPDetails>emptyList())
.withFemaleSterilizationFPDetails(Collections.<FemaleSterilizationFPDetails>emptyList());
ecService.followupOnFPMethod(submission);
verify(schedulingService).fpFollowup(new FPProductInformation("entity id 1", "anm id 1", "male_sterilization", null, null, null, null, null, "2011-01-01", null, "2010-12-20", "yes", "no"));
verify(allEligibleCouples).update(eq(expectedEC));
}
@Test
public void shouldUpdateECAndECSchedulesWhenFPFollowupOccursForFemaleSterilization() throws Exception {
List<FemaleSterilizationFPDetails> femaleSterilizationFPDetails = new ArrayList<>();
femaleSterilizationFPDetails.add(new FemaleSterilizationFPDetails("minilap", "2010-01-01", new ArrayList<String>()));
List<String> followUpVisitDates = new ArrayList<>();
followUpVisitDates.add("2010-10-20");
femaleSterilizationFPDetails.add(new FemaleSterilizationFPDetails("minilap", "2010-10-01", followUpVisitDates));
EligibleCouple ec = new EligibleCouple("entity id 1", "EC Number 1")
.withIUDFPDetails(Collections.<IUDFPDetails>emptyList())
.withCondomFPDetails(Collections.<CondomFPDetails>emptyList())
.withOCPFPDetails(Collections.<OCPFPDetails>emptyList())
.withMaleSterilizationFPDetails(Collections.<MaleSterilizationFPDetails>emptyList())
.withFemaleSterilizationFPDetails(femaleSterilizationFPDetails);
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(ec);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("fp_followup")
.withANMId("anm id 1")
.addFormField("currentMethod", "female_sterilization")
.addFormField("submissionDate", "2011-01-01")
.addFormField("fpFollowupDate", "2010-12-20")
.addFormField("needsFollowup", "yes")
.addFormField("needsReferralFollowup", "no")
.build();
List<FemaleSterilizationFPDetails> expectedFemaleSterilizationDetails = new ArrayList<>();
expectedFemaleSterilizationDetails.add(new FemaleSterilizationFPDetails("minilap", "2010-01-01", new ArrayList<String>()));
expectedFemaleSterilizationDetails.add(new FemaleSterilizationFPDetails("minilap", "2010-10-01", asList("2010-10-20", "2010-12-20")));
EligibleCouple expectedEC = new EligibleCouple("entity id 1", "EC Number 1")
.withMaleSterilizationFPDetails(Collections.<MaleSterilizationFPDetails>emptyList())
.withIUDFPDetails(Collections.<IUDFPDetails>emptyList())
.withCondomFPDetails(Collections.<CondomFPDetails>emptyList())
.withOCPFPDetails(Collections.<OCPFPDetails>emptyList())
.withFemaleSterilizationFPDetails(femaleSterilizationFPDetails);
ecService.followupOnFPMethod(submission);
verify(schedulingService).fpFollowup(new FPProductInformation("entity id 1", "anm id 1", "female_sterilization", null, null, null, null, null, "2011-01-01", null, "2010-12-20", "yes", "no"));
verify(allEligibleCouples).update(eq(expectedEC));
}
@Test
public void shouldNotDoAnythingDuringFPFollowupWhenNoECIsFound() throws Exception {
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(null);
FormSubmission submission = FormSubmissionBuilder.create().build();
ecService.followupOnFPMethod(submission);
verify(allEligibleCouples).findByCaseId("entity id 1");
verifyZeroInteractions(reportingService);
verifyZeroInteractions(schedulingService);
}
@Test
public void shouldNotDoAnythingWhenFPComplicationIsReportedAndECIsNotFound() throws Exception {
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(null);
FormSubmission submission = FormSubmissionBuilder.create().withFormName("fp_complications").build();
ecService.reportFPComplications(submission);
verify(allEligibleCouples).findByCaseId("entity id 1");
verifyZeroInteractions(reportingService);
verifyZeroInteractions(schedulingService);
}
@Test
public void shouldUpdateECSchedulesWhenFPComplicationsIsReported() throws Exception {
EligibleCouple ec = new EligibleCouple("entity id 1", "EC Number 1");
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(ec);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("fp_complications")
.withANMId("anm id 1")
.addFormField("currentMethod", "fp method")
.addFormField("complicationDate", "2010-12-25")
.addFormField("submissionDate", "2010-12-24")
.addFormField("needsFollowup", "yes")
.addFormField("needsReferralFollowup", "no")
.build();
ecService.reportFPComplications(submission);
verify(schedulingService).reportFPComplications(new FPProductInformation("entity id 1", "anm id 1", null, null, null, null, null, null, "2010-12-24", null, "2010-12-25", "yes", "no"));
}
@Test
public void shouldNotDoAnythingWhenFPReferralFollowupIsReportedAndECIsNotFound() throws Exception {
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(null);
FormSubmission submission = FormSubmissionBuilder.create().withFormName("fp_referral_followup").build();
ecService.handleReferralFollowup(submission);
verify(allEligibleCouples).findByCaseId("entity id 1");
verifyZeroInteractions(reportingService);
verifyZeroInteractions(schedulingService);
}
@Test
public void shouldUpdateECSchedulesWhenFPReferralFollowupIsReported() throws Exception {
List<MaleSterilizationFPDetails> maleSterilizationFPDetails = new ArrayList<>();
maleSterilizationFPDetails.add(new MaleSterilizationFPDetails("nsv", "2010-01-01", null));
List<String> followUpVisitDates = new ArrayList<>();
followUpVisitDates.add("2010-10-20");
maleSterilizationFPDetails.add(new MaleSterilizationFPDetails("nsv", "2010-10-01", followUpVisitDates));
EligibleCouple ec = new EligibleCouple("entity id 1", "EC Number 1")
.withIUDFPDetails(Collections.<IUDFPDetails>emptyList())
.withCondomFPDetails(Collections.<CondomFPDetails>emptyList())
.withOCPFPDetails(Collections.<OCPFPDetails>emptyList())
.withMaleSterilizationFPDetails(maleSterilizationFPDetails)
.withFemaleSterilizationFPDetails(Collections.<FemaleSterilizationFPDetails>emptyList());
when(allEligibleCouples.findByCaseId("entity id 1")).thenReturn(ec);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("fp_referral_followup")
.withANMId("anm id 1")
.addFormField("currentMethod", "male_sterilization")
.addFormField("referralFollowupDate", "2010-12-20")
.addFormField("submissionDate", "2010-12-24")
.addFormField("needsFollowup", "yes")
.addFormField("needsReferralFollowup", "no")
.build();
List<MaleSterilizationFPDetails> expectedMaleSterilizationDetails = new ArrayList<>();
expectedMaleSterilizationDetails.add(new MaleSterilizationFPDetails("nsv", "2010-01-01", null));
expectedMaleSterilizationDetails.add(new MaleSterilizationFPDetails("nsv", "2010-10-01", asList("2010-10-20", "2010-12-20")));
EligibleCouple expectedEC = new EligibleCouple("entity id 1", "EC Number 1")
.withMaleSterilizationFPDetails(expectedMaleSterilizationDetails)
.withIUDFPDetails(Collections.<IUDFPDetails>emptyList())
.withCondomFPDetails(Collections.<CondomFPDetails>emptyList())
.withOCPFPDetails(Collections.<OCPFPDetails>emptyList())
.withFemaleSterilizationFPDetails(Collections.<FemaleSterilizationFPDetails>emptyList());
ecService.handleReferralFollowup(submission);
verify(schedulingService).reportReferralFollowup(new FPProductInformation("entity id 1", "anm id 1", null, null, null, null, null, null, "2010-12-24", null, "2010-12-20", "yes", "no"));
verify(allEligibleCouples).update(eq(expectedEC));
}
@Test
public void shouldCloseECWithoutDeletingReportsWhenCloseReasonIsNotWrongEntry() throws Exception {
when(allEligibleCouples.exists("entity id 1")).thenReturn(true);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("ec_close")
.addFormField("isECCloseConfirmed", "yes")
.addFormField("closeReason", "permanent_relocation")
.build();
ecService.closeEligibleCouple(submission);
verify(allEligibleCouples).close("entity id 1");
verifyZeroInteractions(reportingService);
}
@Test
public void shouldCloseECAsWrongEntryAndDeleteAllReports() throws Exception {
when(allEligibleCouples.exists("entity id 1")).thenReturn(true);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("ec_close")
.addFormField("isECCloseConfirmed", "yes")
.addFormField("closeReason", "wrong_entry")
.build();
ecService.closeEligibleCouple(submission);
verify(allEligibleCouples).close("entity id 1");
verify(reportingService).deleteReportsForEC("entity id 1");
}
@Test
public void shouldNotCloseECWhenANMDoesNotConfirmClose() throws Exception {
when(allEligibleCouples.exists("entity id 1")).thenReturn(true);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("ec_close")
.addFormField("isECCloseConfirmed", "no")
.build();
ecService.closeEligibleCouple(submission);
verify(allEligibleCouples, times(0)).close("entity id 1");
}
@Test
public void shouldNotCloseECWhenECDoesNotExist() throws Exception {
when(allEligibleCouples.exists("entity id 1")).thenReturn(false);
FormSubmission submission = FormSubmissionBuilder.create()
.withFormName("ec_close")
.build();
ecService.closeEligibleCouple(submission);
verify(allEligibleCouples, times(0)).close("entity id 1");
}
}