org.motechproject.server.service.ANCScheduleTest.java Source code

Java tutorial

Introduction

Here is the source code for org.motechproject.server.service.ANCScheduleTest.java

Source

/**
 * MOTECH PLATFORM OPENSOURCE LICENSE AGREEMENT
 *
 * Copyright (c) 2010-11 The Trustees of Columbia University in the City of
 * New York and Grameen Foundation USA.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * 3. Neither the name of Grameen Foundation USA, Columbia University, or
 * their respective contributors may be used to endorse or promote products
 * derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY GRAMEEN FOUNDATION USA, COLUMBIA UNIVERSITY
 * AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GRAMEEN FOUNDATION
 * USA, COLUMBIA UNIVERSITY OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package org.motechproject.server.service;

import junit.framework.TestCase;
import org.easymock.Capture;
import org.motechproject.server.model.ExpectedEncounter;
import org.motechproject.server.service.impl.ExpectedEncounterSchedule;
import org.motechproject.server.svc.RegistrarBean;
import org.motechproject.server.util.MotechConstants;
import org.openmrs.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import static org.easymock.EasyMock.*;

public class ANCScheduleTest extends TestCase {
    ApplicationContext ctx;

    RegistrarBean registrarBean;
    ExpectedEncounterSchedule ancSchedule;
    Concept nextANCDateConcept;

    @Override
    protected void setUp() throws Exception {
        ctx = new ClassPathXmlApplicationContext(
                new String[] { "test-common-program-beans.xml", "services/pregnancy-anc-service.xml" });
        ancSchedule = (ExpectedEncounterSchedule) ctx.getBean("pregnancyANCSchedule");

        // EasyMock setup in Spring config
        registrarBean = (RegistrarBean) ctx.getBean("registrarBean");

        nextANCDateConcept = new Concept(1);
        nextANCDateConcept.addName(new ConceptName(MotechConstants.CONCEPT_NEXT_ANC_DATE, null));
    }

    @Override
    protected void tearDown() throws Exception {
        ctx = null;
        ancSchedule = null;
        registrarBean = null;
        nextANCDateConcept = null;
    }

    public void testSatisfyExpected() {
        Date date = new Date();

        Patient patient = new Patient(1);

        Capture<ExpectedEncounter> anc1ExpectedCapture = new Capture<ExpectedEncounter>();
        Capture<ExpectedEncounter> anc2ExpectedCapture = new Capture<ExpectedEncounter>();

        List<Encounter> encounterList = new ArrayList<Encounter>();
        Encounter encounter1 = new Encounter();
        encounter1.setEncounterDatetime(date);
        encounterList.add(encounter1);
        Encounter encounter2 = new Encounter();
        encounter1.setEncounterDatetime(date);
        encounterList.add(encounter2);

        List<ExpectedEncounter> expectedEncounterList = new ArrayList<ExpectedEncounter>();
        ExpectedEncounter expectedEncounter1 = new ExpectedEncounter();
        expectedEncounter1.setName("ANC");
        expectedEncounterList.add(expectedEncounter1);
        ExpectedEncounter expectedEncounter2 = new ExpectedEncounter();
        expectedEncounter2.setName("ANC");
        expectedEncounterList.add(expectedEncounter2);
        ExpectedEncounter expectedEncounter3 = new ExpectedEncounter();
        expectedEncounter3.setName("ANC");
        expectedEncounterList.add(expectedEncounter3);

        Date pregnancyDate = new Date();

        expect(registrarBean.getActivePregnancyDueDate(patient.getPatientId())).andReturn(pregnancyDate);
        expect(registrarBean.getEncounters(eq(patient), eq(ancSchedule.getEncounterTypeName()), (Date) anyObject()))
                .andReturn(encounterList);
        expect(registrarBean.getExpectedEncounters(patient, ancSchedule.getName()))
                .andReturn(expectedEncounterList);
        expect(registrarBean.saveExpectedEncounter(capture(anc1ExpectedCapture)))
                .andReturn(new ExpectedEncounter());
        expect(registrarBean.saveExpectedEncounter(capture(anc2ExpectedCapture)))
                .andReturn(new ExpectedEncounter());

        replay(registrarBean);

        ancSchedule.updateSchedule(patient, date);

        verify(registrarBean);

        ExpectedEncounter capturedANC1Expected = anc1ExpectedCapture.getValue();
        assertEquals(Boolean.TRUE, capturedANC1Expected.getVoided());
        assertEquals(encounter1, capturedANC1Expected.getEncounter());

        ExpectedEncounter capturedANC2Expected = anc2ExpectedCapture.getValue();
        assertEquals(Boolean.TRUE, capturedANC2Expected.getVoided());
        assertEquals(encounter2, capturedANC2Expected.getEncounter());
    }

    public void testCreateExpected() {
        Date date = new Date();

        Patient patient = new Patient(1);

        Capture<Date> minDateCapture = new Capture<Date>();
        Capture<Date> dueDateCapture = new Capture<Date>();
        Capture<Date> lateDateCapture = new Capture<Date>();
        Capture<Date> maxDateCapture = new Capture<Date>();

        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, -1);
        Date nextANC1 = calendar.getTime();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, 1);
        Date nextANC2 = calendar.getTime();

        List<Encounter> encounterList = new ArrayList<Encounter>();
        Encounter encounter1 = new Encounter();
        encounter1.setEncounterDatetime(date);
        Obs nextANC1Obs = new Obs();
        nextANC1Obs.setConcept(nextANCDateConcept);
        nextANC1Obs.setValueDatetime(nextANC1);
        encounter1.addObs(nextANC1Obs);
        encounterList.add(encounter1);
        Encounter encounter2 = new Encounter();
        encounter2.setEncounterDatetime(date);
        Obs nextANC2Obs = new Obs();
        nextANC2Obs.setConcept(nextANCDateConcept);
        nextANC2Obs.setValueDatetime(nextANC2);
        encounter2.addObs(nextANC2Obs);
        encounterList.add(encounter2);

        List<ExpectedEncounter> expectedEncounterList = new ArrayList<ExpectedEncounter>();

        Date pregnancyDate = new Date();

        expect(registrarBean.getActivePregnancyDueDate(patient.getPatientId())).andReturn(pregnancyDate);
        expect(registrarBean.getEncounters(eq(patient), eq(ancSchedule.getEncounterTypeName()), (Date) anyObject()))
                .andReturn(encounterList);
        expect(registrarBean.getExpectedEncounters(patient, ancSchedule.getName()))
                .andReturn(expectedEncounterList);
        expect(registrarBean.createExpectedEncounter(eq(patient), eq(ancSchedule.getEncounterTypeName()),
                capture(minDateCapture), capture(dueDateCapture), capture(lateDateCapture), capture(maxDateCapture),
                eq(ancSchedule.getName()), eq(ancSchedule.getName()))).andReturn(new ExpectedEncounter());

        replay(registrarBean);

        ancSchedule.updateSchedule(patient, date);

        verify(registrarBean);

        Date capturedMinDate = minDateCapture.getValue();
        assertEquals(encounter2.getEncounterDatetime(), capturedMinDate);

        Date capturedDueDate = dueDateCapture.getValue();
        assertEquals(nextANC2, capturedDueDate);

        Date capturedLateDate = lateDateCapture.getValue();
        assertTrue(capturedLateDate.after(capturedDueDate));

        Date capturedMaxDate = maxDateCapture.getValue();
        assertTrue(capturedMaxDate.after(capturedDueDate));
    }

    public void testNotCreateExpectedAlreadyExists() {
        Date date = new Date();

        Patient patient = new Patient(1);

        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MONTH, -1);
        Date nextANC1 = calendar.getTime();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, 1);
        Date nextANC2 = calendar.getTime();

        List<Encounter> encounterList = new ArrayList<Encounter>();
        Encounter encounter1 = new Encounter();
        encounter1.setEncounterDatetime(date);
        Obs nextANC1Obs = new Obs();
        nextANC1Obs.setConcept(nextANCDateConcept);
        nextANC1Obs.setValueDatetime(nextANC1);
        encounter1.addObs(nextANC1Obs);
        encounterList.add(encounter1);
        Encounter encounter2 = new Encounter();
        encounter2.setEncounterDatetime(date);
        Obs nextANC2Obs = new Obs();
        nextANC2Obs.setConcept(nextANCDateConcept);
        nextANC2Obs.setValueDatetime(nextANC2);
        encounter2.addObs(nextANC2Obs);
        encounterList.add(encounter2);

        calendar.add(Calendar.DATE, 7); // Expecting 1 week
        Date lateDate = calendar.getTime();

        calendar.add(Calendar.DATE, 14); // Max 2 weeks week
        Date maxDate = calendar.getTime();

        List<ExpectedEncounter> expectedEncounterList = new ArrayList<ExpectedEncounter>();
        ExpectedEncounter expectedEncounter1 = new ExpectedEncounter();
        expectedEncounter1.setName("ANC");
        expectedEncounter1.setMinEncounterDatetime(encounter2.getEncounterDatetime());
        expectedEncounter1.setDueEncounterDatetime(nextANC2);
        expectedEncounter1.setLateEncounterDatetime(lateDate);
        expectedEncounter1.setMaxEncounterDatetime(maxDate);
        expectedEncounterList.add(expectedEncounter1);

        Date pregnancyDate = new Date();

        expect(registrarBean.getActivePregnancyDueDate(patient.getPatientId())).andReturn(pregnancyDate);
        expect(registrarBean.getEncounters(eq(patient), eq(ancSchedule.getEncounterTypeName()), (Date) anyObject()))
                .andReturn(encounterList);
        expect(registrarBean.getExpectedEncounters(patient, ancSchedule.getName()))
                .andReturn(expectedEncounterList);

        replay(registrarBean);

        ancSchedule.updateSchedule(patient, date);

        verify(registrarBean);
    }

    public void testRemoveExpected() {
        Date date = new Date();

        Patient patient = new Patient();

        List<ExpectedEncounter> expectedEncounterList = new ArrayList<ExpectedEncounter>();
        expectedEncounterList.add(new ExpectedEncounter());
        expectedEncounterList.add(new ExpectedEncounter());
        expectedEncounterList.add(new ExpectedEncounter());

        Capture<ExpectedEncounter> anc1ExpectedCapture = new Capture<ExpectedEncounter>();
        Capture<ExpectedEncounter> anc2ExpectedCapture = new Capture<ExpectedEncounter>();
        Capture<ExpectedEncounter> anc3ExpectedCapture = new Capture<ExpectedEncounter>();

        Date pregnancyDate = null;

        expect(registrarBean.getActivePregnancyDueDate(patient.getPatientId())).andReturn(pregnancyDate);
        expect(registrarBean.getExpectedEncounters(patient, ancSchedule.getName()))
                .andReturn(expectedEncounterList);
        expect(registrarBean.saveExpectedEncounter(capture(anc1ExpectedCapture)))
                .andReturn(new ExpectedEncounter());
        expect(registrarBean.saveExpectedEncounter(capture(anc2ExpectedCapture)))
                .andReturn(new ExpectedEncounter());
        expect(registrarBean.saveExpectedEncounter(capture(anc3ExpectedCapture)))
                .andReturn(new ExpectedEncounter());

        replay(registrarBean);

        ancSchedule.updateSchedule(patient, date);

        verify(registrarBean);

        ExpectedEncounter capturedANC1Expected = anc1ExpectedCapture.getValue();
        assertEquals(Boolean.TRUE, capturedANC1Expected.getVoided());

        ExpectedEncounter capturedANC2Expected = anc2ExpectedCapture.getValue();
        assertEquals(Boolean.TRUE, capturedANC2Expected.getVoided());

        ExpectedEncounter capturedANC3Expected = anc3ExpectedCapture.getValue();
        assertEquals(Boolean.TRUE, capturedANC3Expected.getVoided());
    }

    public void testNoAction() {
        Date date = new Date();

        Patient patient = new Patient();

        List<ExpectedEncounter> expectedEncounterList = new ArrayList<ExpectedEncounter>();

        Date pregnancyDate = null;

        expect(registrarBean.getActivePregnancyDueDate(patient.getPatientId())).andReturn(pregnancyDate);
        expect(registrarBean.getExpectedEncounters(patient, ancSchedule.getName()))
                .andReturn(expectedEncounterList);

        replay(registrarBean);

        ancSchedule.updateSchedule(patient, date);

        verify(registrarBean);
    }
}