package org.ei.drishti.service.scheduling.fpMethodStrategy;
import org.ei.drishti.domain.FPProductInformation;
import org.ei.drishti.service.ActionService;
import org.ei.drishti.service.scheduling.ScheduleService;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentMatcher;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.motechproject.scheduletracking.api.service.EnrollmentRecord;
import org.motechproject.scheduletracking.api.service.EnrollmentRequest;
import org.motechproject.scheduletracking.api.service.ScheduleTrackingService;
import static java.util.Arrays.asList;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
public class MaleSterilizationStrategyTest {
@Mock
private ScheduleTrackingService scheduleTrackingService;
@Mock
private ActionService actionService;
@Mock
private ScheduleService scheduleService;
private MaleSterilizationStrategy strategy;
@Before
public void setUp() throws Exception {
initMocks(this);
strategy = new MaleSterilizationStrategy(scheduleTrackingService, actionService, scheduleService);
}
@Test
public void shouldEnrollInMaleSterilizationFollowupScheduleOnECRegistration() throws Exception {
strategy.registerEC(new FPProductInformation("entity id 1", null, null, null, null, null, null, null, "2012-03-01", "2012-02-01", null, null, null));
verify(scheduleService).enroll("entity id 1", "Male sterilization Followup", "2012-02-01");
}
@Test
public void shouldEnrollInMaleSterilizationFollowupScheduleOnFPChange() throws Exception {
strategy.enrollToNewScheduleForNewFPMethod(new FPProductInformation("entity id 1", null, "Male sterilization Followup", "condom",
null, null, null, null, "2012-03-01", "2012-02-01", null, null, null));
verify(scheduleService).enroll("entity id 1", "Male sterilization Followup", "2012-02-01");
}
@Test
public void shouldUnEnrollFromMaleSterilizationFollowupScheduleOnFPMethodChange() throws Exception {
strategy.unEnrollFromPreviousScheduleAsFPMethodChanged(
new FPProductInformation("entity id 1", "anm x", "condom", "male_sterilization", null, null, null, "20", "2012-03-01", "2012-03-10", null, null, null));
verify(scheduleTrackingService).unenroll("entity id 1", asList("Male sterilization Followup"));
verify(actionService).markAlertAsClosed("entity id 1", "anm x", "Male sterilization Followup", "2012-03-10");
}
@Test
public void shouldFastForwardMaleSterilizationFollowupScheduleOnFPFollowup() throws Exception {
when(scheduleTrackingService.getEnrollment("entity id 1", "Male sterilization Followup")).thenReturn(new EnrollmentRecord(
"entity id 1", "Male sterilization Followup", "Male sterilization Followup 2", null, null, null, null, null, null, null
));
strategy.fpFollowup(new FPProductInformation("entity id 1", "anm x", "male_sterilization", null,
null, null, null, null, "2012-03-01", null, "2012-02-01", null, null));
InOrder inOrder = inOrder(scheduleTrackingService, actionService);
inOrder.verify(scheduleTrackingService).getEnrollment("entity id 1", "Male sterilization Followup");
inOrder.verify(scheduleTrackingService).fulfillCurrentMilestone("entity id 1", "Male sterilization Followup", LocalDate.parse("2012-02-01"));
inOrder.verify(actionService).markAlertAsClosed("entity id 1", "anm x", "Male sterilization Followup 2", "2012-02-01");
}
}