org.openmrs.scheduler.web.controller.SchedulerFormControllerTest.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.scheduler.web.controller.SchedulerFormControllerTest.java

Source

/**
 * This Source Code Form is subject to the terms of the Mozilla Public License,
 * v. 2.0. If a copy of the MPL was not distributed with this file, You can
 * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
 * the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
 *
 * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
 * graphic logo is a trademark of OpenMRS Inc.
 */
package org.openmrs.scheduler.web.controller;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.api.context.Context;
import org.openmrs.scheduler.SchedulerService;
import org.openmrs.scheduler.Task;
import org.openmrs.scheduler.TaskDefinition;
import org.openmrs.test.Verifies;
import org.openmrs.web.test.BaseModuleWebContextSensitiveTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;

/**
 * Contains tests for the SchedulerFormController
 */
public class SchedulerFormControllerTest extends BaseModuleWebContextSensitiveTest {

    private static final String DATE_TIME_FORMAT = "MM/dd/yyyy HH:mm:ss";

    private static final String INITIAL_SCHEDULER_TASK_CONFIG_XML = "org/openmrs/web/include/SchedulerFormControllerTest.xml";

    private static final long MAX_WAIT_TIME_IN_MILLISECONDS = 2048;

    private MockHttpServletRequest mockRequest;

    private TaskHelper taskHelper;

    @Autowired
    private SchedulerFormController controller;

    // should be @Autowired as well but the respective bean is commented out
    // in applicationContext-service.xml at the time of coding (Jan 2013)
    private SchedulerService service;

    @Before
    public void setUpSchedulerService() throws Exception {
        executeDataSet(INITIAL_SCHEDULER_TASK_CONFIG_XML);

        service = Context.getSchedulerService();
        taskHelper = new TaskHelper(service);

        mockRequest = new MockHttpServletRequest();
        mockRequest.setMethod("POST");
        mockRequest.setParameter("action", "");
        mockRequest.setParameter("taskId", "1");
    }

    /**
     * @see SchedulerFormController#onSubmit(HttpServletRequest,HttpServletResponse,Object,BindException)
     */
    @Test
    @Verifies(value = "should reschedule a currently scheduled task", method = "onSubmit(HttpServletRequest,HttpServletResponse,Object,BindException)")
    public void onSubmit_shouldRescheduleACurrentlyScheduledTask() throws Exception {
        Date timeOne = taskHelper.getTime(Calendar.MINUTE, 5);
        TaskDefinition task = taskHelper.getScheduledTaskDefinition(timeOne);
        Task oldTaskInstance = task.getTaskInstance();

        Date timeTwo = taskHelper.getTime(Calendar.MINUTE, 2);
        mockRequest.setParameter("startTime", new SimpleDateFormat(DATE_TIME_FORMAT).format(timeTwo));

        ModelAndView mav = controller.handleRequest(mockRequest, new MockHttpServletResponse());
        assertNotNull(mav);
        assertTrue(mav.getModel().isEmpty());

        Assert.assertNotSame(oldTaskInstance, task.getTaskInstance());
    }

    /**
     * @see SchedulerFormController#onSubmit(HttpServletRequest,HttpServletResponse,Object,BindException)
     */
    @Test
    @Verifies(value = "should not reschedule a task that is not currently scheduled", method = "onSubmit(HttpServletRequest,HttpServletResponse,Object,BindException)")
    public void onSubmit_shouldNotRescheduleATaskThatIsNotCurrentlyScheduled() throws Exception {
        Date timeOne = taskHelper.getTime(Calendar.MINUTE, 5);
        TaskDefinition task = taskHelper.getUnscheduledTaskDefinition(timeOne);
        Task oldTaskInstance = task.getTaskInstance();

        Date timeTwo = taskHelper.getTime(Calendar.MINUTE, 2);
        mockRequest.setParameter("startTime", new SimpleDateFormat(DATE_TIME_FORMAT).format(timeTwo));

        ModelAndView mav = controller.handleRequest(mockRequest, new MockHttpServletResponse());
        assertNotNull(mav);
        assertTrue(mav.getModel().isEmpty());

        Assert.assertSame(oldTaskInstance, task.getTaskInstance());
    }

    /**
     * @see SchedulerFormController#onSubmit(HttpServletRequest,HttpServletResponse,Object,BindException)
     */
    @Test
    @Verifies(value = "should not reschedule a task if the start time has passed", method = "onSubmit(HttpServletRequest,HttpServletResponse,Object,BindException)")
    public void onSubmit_shouldNotRescheduleATaskIfTheStartTimeHasPassed() throws Exception {
        Date timeOne = taskHelper.getTime(Calendar.MINUTE, 5);
        TaskDefinition task = taskHelper.getScheduledTaskDefinition(timeOne);
        Task oldTaskInstance = task.getTaskInstance();

        Date timeTwo = taskHelper.getTime(Calendar.SECOND, -1);
        mockRequest.setParameter("startTime", new SimpleDateFormat(DATE_TIME_FORMAT).format(timeTwo));

        ModelAndView mav = controller.handleRequest(mockRequest, new MockHttpServletResponse());
        assertNotNull(mav);
        assertTrue(mav.getModel().isEmpty());

        Assert.assertSame(oldTaskInstance, task.getTaskInstance());
    }

    /**
     * @see SchedulerFormController#onSubmit(HttpServletRequest,HttpServletResponse,Object,BindException)
     */
    @Test
    @Verifies(value = "should not reschedule an executing task", method = "onSubmit(HttpServletRequest,HttpServletResponse,Object,BindException)")
    public void onSubmit_shouldNotRescheduleAnExecutingTask() throws Exception {
        Date startTime = taskHelper.getTime(Calendar.SECOND, 1);
        TaskDefinition task = taskHelper.getScheduledTaskDefinition(startTime);

        taskHelper.waitUntilTaskIsExecuting(task, MAX_WAIT_TIME_IN_MILLISECONDS);
        Task oldTaskInstance = task.getTaskInstance();

        // use the *same* start time as in the task already running
        mockRequest.setParameter("startTime", new SimpleDateFormat(DATE_TIME_FORMAT).format(startTime));

        ModelAndView mav = controller.handleRequest(mockRequest, new MockHttpServletResponse());
        assertNotNull(mav);
        assertTrue(mav.getModel().isEmpty());

        Assert.assertSame(oldTaskInstance, task.getTaskInstance());
        deleteAllData();
    }

    /**
     * @see SchedulerFormController#processFormSubmission(HttpServletRequest,HttpServletResponse,Object,BindException)
     * @verifies not throw null pointer exception if repeat interval is null
     */
    @Test
    public void processFormSubmission_shouldNotThrowNullPointerExceptionIfRepeatIntervalIsNull() throws Exception {
        Date startTime = taskHelper.getTime(Calendar.SECOND, 2);
        TaskDefinition task = taskHelper.getScheduledTaskDefinition(startTime);

        mockRequest.setParameter("startTime", new SimpleDateFormat(DATE_TIME_FORMAT).format(startTime));
        mockRequest.setParameter("repeatInterval", " ");
        mockRequest.setParameter("repeatIntervalUnits", "minutes");

        ModelAndView mav = controller.handleRequest(mockRequest, new MockHttpServletResponse());
        assertNotNull(mav);
        Assert.assertNotNull(task.getRepeatInterval());
        Long interval = 0L;
        Assert.assertEquals(interval, task.getRepeatInterval());
    }

}