package org.ei.drishti.service.scheduling; import org.apache.commons.lang.builder.EqualsBuilder; import org.ei.drishti.service.ActionService; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentMatcher; import org.mockito.Mock; import org.motechproject.scheduletracking.api.service.EnrollmentRecord; import org.motechproject.scheduletracking.api.service.EnrollmentsQuery; import org.motechproject.scheduletracking.api.service.ScheduleTrackingService; import org.motechproject.testing.utils.BaseUnitTest; import java.util.Arrays; import java.util.List; import static org.ei.drishti.scheduler.DrishtiScheduleConstants.MotherScheduleConstants.SCHEDULE_AUTO_CLOSE_PNC; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.MockitoAnnotations.initMocks; import static org.motechproject.scheduletracking.api.domain.EnrollmentStatus.ACTIVE; import static org.powermock.api.mockito.PowerMockito.when; public class PNCSchedulesServiceTest extends BaseUnitTest { @Mock private ScheduleTrackingService scheduleTrackingService; @Mock private ActionService actionService; @Mock private ScheduleService scheduleService; private PNCSchedulesService schedulesService; @Before public void setUp() throws Exception { initMocks(this); schedulesService = new PNCSchedulesService(scheduleTrackingService, scheduleService, actionService); } @Test public void shouldEnrollMotherIntoSchedulesWhileDeliveryOutcome() { schedulesService.deliveryOutcome("mother id 1", "2012-01-01"); verify(scheduleService).enroll("mother id 1", SCHEDULE_AUTO_CLOSE_PNC, "2012-01-01"); verifyNoMoreInteractions(scheduleTrackingService); } @Test public void shouldUnenrollAMotherFromAllOpenSchedulesAndRaiseDeleteAllAlertActionDuringClose() { EnrollmentRecord record1 = new EnrollmentRecord("Case X", "Schedule 1", null, null, null, null, null, null, null, null); EnrollmentRecord record2 = new EnrollmentRecord("Case X", "Schedule 2", null, null, null, null, null, null, null, null); List<EnrollmentRecord> records = Arrays.asList(record1, record2); when(scheduleTrackingService.search(queryFor("Case X"))).thenReturn(records); schedulesService.unEnrollFromSchedules("Case X"); verify(scheduleTrackingService).unenroll("Case X", Arrays.asList("Schedule 1")); verify(scheduleTrackingService).unenroll("Case X", Arrays.asList("Schedule 2")); } private EnrollmentsQuery queryFor(final String externalId) { return argThat(new ArgumentMatcher<EnrollmentsQuery>() { @Override public boolean matches(Object o) { EnrollmentsQuery expectedQuery = new EnrollmentsQuery().havingExternalId(externalId).havingState(ACTIVE); return EqualsBuilder.reflectionEquals(expectedQuery.getCriteria(), ((EnrollmentsQuery) o).getCriteria()); } }); } }