/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
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 javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.Assert;
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.BaseContextSensitiveTest;
import org.openmrs.test.Verifies;
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 BaseContextSensitiveTest {
private static final String INITIAL_SCHEDULER_TASK_CONFIG_XML = "org/openmrs/web/include/SchedulerServiceTest.xml";
/**
* @see {@link 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 {
executeDataSet(INITIAL_SCHEDULER_TASK_CONFIG_XML);
SchedulerService service = Context.getSchedulerService();
TaskDefinition task = service.getTaskByName("Hello World Task");
//sanity check
Assert.assertNull(task.getTaskInstance());
Calendar cal = Calendar.getInstance();
//schedule the task to run in the next 5 min for testing
cal.add(Calendar.MINUTE, 5);
task.setStartTime(cal.getTime());
service.saveTask(task);
try {
//start the task
service.scheduleTask(task);
//the task should have been started
Assert.assertTrue(task.getStarted());
Assert.assertNotNull(task.getTaskInstance());
Task oldTaskInstance = task.getTaskInstance();
SchedulerFormController controller = (SchedulerFormController) applicationContext
.getBean("schedulerFormController");
MockHttpServletRequest mockRequest = new MockHttpServletRequest();
mockRequest.setMethod("POST");
mockRequest.setParameter("action", "");
mockRequest.setParameter("taskId", "1");
//postpone the start time by 2 min and submit the form
cal.add(Calendar.MINUTE, 2);
mockRequest.setParameter("startTime", new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(cal.getTime()));
ModelAndView mav = controller.handleRequest(mockRequest, new MockHttpServletResponse());
assertNotNull(mav);
assertTrue(mav.getModel().isEmpty());
//the task should have been rescheduled to reflect the change in start time
Assert.assertNotSame(oldTaskInstance, task.getTaskInstance());
}
finally {
service.shutdownTask(task);
//Ensure that the task was stopped
Assert.assertFalse(task.getTaskInstance().isExecuting());
Assert.assertFalse(task.getStarted());
}
}
/**
* @see {@link 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 {
executeDataSet(INITIAL_SCHEDULER_TASK_CONFIG_XML);
SchedulerService service = Context.getSchedulerService();
TaskDefinition task = service.getTaskByName("Hello World Task");
//sanity check
Assert.assertNull(task.getTaskInstance());
Calendar cal = Calendar.getInstance();
//schedule the task to run in the next 5 min for testing
cal.add(Calendar.MINUTE, 5);
task.setStartTime(cal.getTime());
service.saveTask(task);
Task oldTaskInstance = task.getTaskInstance();
SchedulerFormController controller = (SchedulerFormController) applicationContext.getBean("schedulerFormController");
MockHttpServletRequest mockRequest = new MockHttpServletRequest();
mockRequest.setMethod("POST");
mockRequest.setParameter("action", "");
mockRequest.setParameter("taskId", "1");
//postpone the start time by 2 min and submit the form
cal.add(Calendar.MINUTE, 2);
mockRequest.setParameter("startTime", new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(cal.getTime()));
ModelAndView mav = controller.handleRequest(mockRequest, new MockHttpServletResponse());
assertNotNull(mav);
assertTrue(mav.getModel().isEmpty());
//the task shouldn't have been rescheduled
Assert.assertEquals(oldTaskInstance, task.getTaskInstance());
}
/**
* @see {@link 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 {
executeDataSet(INITIAL_SCHEDULER_TASK_CONFIG_XML);
SchedulerService service = Context.getSchedulerService();
TaskDefinition task = service.getTaskByName("Hello World Task");
//sanity check
Assert.assertNull(task.getTaskInstance());
Calendar cal = Calendar.getInstance();
//schedule the task to run in the next 5 min for testing
cal.add(Calendar.MINUTE, 5);
task.setStartTime(cal.getTime());
service.saveTask(task);
try {
//start the task
service.scheduleTask(task);
//the task should have been started
Assert.assertTrue(task.getStarted());
Assert.assertNotNull(task.getTaskInstance());
Task oldTaskInstance = task.getTaskInstance();
SchedulerFormController controller = (SchedulerFormController) applicationContext
.getBean("schedulerFormController");
MockHttpServletRequest mockRequest = new MockHttpServletRequest();
mockRequest.setMethod("POST");
mockRequest.setParameter("action", "");
mockRequest.setParameter("taskId", "1");
//set the start time to be in the past
Calendar cal2 = Calendar.getInstance();
cal2.add(Calendar.SECOND, -1);
mockRequest.setParameter("startTime", new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(cal2.getTime()));
ModelAndView mav = controller.handleRequest(mockRequest, new MockHttpServletResponse());
assertNotNull(mav);
assertTrue(mav.getModel().isEmpty());
//the task shouldn't have been rescheduled
Assert.assertSame(oldTaskInstance, task.getTaskInstance());
}
finally {
service.shutdownTask(task);
//Ensure that the task was stopped
Assert.assertFalse(task.getTaskInstance().isExecuting());
Assert.assertFalse(task.getStarted());
}
}
}