SchedulerFormValidatorTest.java

package org.openmrs.validator;

import org.junit.Assert;
import org.junit.Test;
import org.openmrs.scheduler.TaskDefinition;
import org.openmrs.test.Verifies;
import org.springframework.validation.BindException;
import org.springframework.validation.Errors;

/**
 * Tests methods on the {@link SchedulerFormValidator} class.
 */
public class SchedulerFormValidatorTest {
	
	/**
	 * @see {@link SchedulerFormValidator#validate(Object,Errors)}
	 */
	@Test
	@Verifies(value = "should fail validation if name is null or empty or whitespace", method = "validate(Object,Errors)")
	public void validate_shouldFailValidationIfNameIsNullOrEmptyOrWhitespace() throws Exception {
		TaskDefinition def = new TaskDefinition();
		def.setName(null);
		def.setRepeatInterval(3600000L);
		def.setTaskClass("org.openmrs.scheduler.tasks.HelloWorldTask");
		
		Errors errors = new BindException(def, "def");
		new SchedulerFormValidator().validate(def, errors);
		Assert.assertTrue(errors.hasFieldErrors("name"));
		
		def.setName("");
		errors = new BindException(def, "def");
		new SchedulerFormValidator().validate(def, errors);
		Assert.assertTrue(errors.hasFieldErrors("name"));
		
		def.setName(" ");
		errors = new BindException(def, "def");
		new SchedulerFormValidator().validate(def, errors);
		Assert.assertTrue(errors.hasFieldErrors("name"));
	}
	
	/**
	 * @see {@link SchedulerFormValidator#validate(Object,Errors)}
	 */
	@Test
	@Verifies(value = "should fail validation if taskClass is empty or whitespace", method = "validate(Object,Errors)")
	public void validate_shouldFailValidationIfTaskClassIsEmptyOrWhitespace() throws Exception {
		TaskDefinition def = new TaskDefinition();
		def.setName("Chores");
		def.setRepeatInterval(3600000L);
		def.setTaskClass("");
		
		Errors errors = new BindException(def, "def");
		new SchedulerFormValidator().validate(def, errors);
		Assert.assertTrue(errors.hasFieldErrors("taskClass"));
		
		def.setTaskClass(" ");
		errors = new BindException(def, "def");
		new SchedulerFormValidator().validate(def, errors);
		Assert.assertTrue(errors.hasFieldErrors("taskClass"));
	}
	
	/**
	 * @see {@link SchedulerFormValidator#validate(Object,Errors)}
	 */
	@Test
	@Verifies(value = "should fail validation if repeatInterval is null or empty or whitespace", method = "validate(Object,Errors)")
	public void validate_shouldFailValidationIfRepeatIntervalIsNullOrEmptyOrWhitespace() throws Exception {
		TaskDefinition def = new TaskDefinition();
		def.setName("Chores");
		def.setTaskClass("org.openmrs.scheduler.tasks.HelloWorldTask");
		
		Errors errors = new BindException(def, "def");
		new SchedulerFormValidator().validate(def, errors);
		Assert.assertTrue(errors.hasFieldErrors("repeatInterval"));
		
		def.setTaskClass(" ");
		errors = new BindException(def, "def");
		new SchedulerFormValidator().validate(def, errors);
		Assert.assertTrue(errors.hasFieldErrors("repeatInterval"));
	}
	
	/**
	 * @see {@link SchedulerFormValidator#validate(Object,Errors)}
	 */
	@Test
	@Verifies(value = "should fail validation if class is not instance of Task", method = "validate(Object,Errors)")
	public void validate_shouldFailValidationIfClassIsNotInstanceOfTask() throws Exception {
		TaskDefinition def = new TaskDefinition();
		def.setName("Chores");
		def.setRepeatInterval(3600000L);
		def.setTaskClass("org.openmrs.Obs");
		
		Errors errors = new BindException(def, "def");
		new SchedulerFormValidator().validate(def, errors);
		
		Assert.assertTrue(errors.hasFieldErrors("taskClass"));
		Assert.assertEquals("Scheduler.taskForm.classDoesNotImplementTask", errors.getFieldError("taskClass").getCode());
	}
	
	/**
	 * @see {@link SchedulerFormValidator#validate(Object,Errors)}
	 */
	@Test
	@Verifies(value = "should fail validation if class is not accessible", method = "validate(Object,Errors)")
	public void validate_shouldFailValidationIfClassIsNotAccessible() throws Exception {
		TaskDefinition def = new TaskDefinition();
		def.setName("Chores");
		def.setRepeatInterval(3600000L);
		def.setTaskClass("???"); //TODO: Find a way to trigger an IllegalAccessException
		
		Errors errors = new BindException(def, "def");
		new SchedulerFormValidator().validate(def, errors);
		
		Assert.assertTrue(errors.hasFieldErrors("taskClass"));
		Assert.assertEquals("Scheduler.taskForm.classNotFoundException", errors.getFieldError("taskClass").getCode());
	}
	
	/**
	 * @see {@link SchedulerFormValidator#validate(Object,Errors)}
	 */
	@Test
	@Verifies(value = "should fail validation if class cannot be instantiated", method = "validate(Object,Errors)")
	public void validate_shouldFailValidationIfClassCannotBeInstantiated() throws Exception {
		TaskDefinition def = new TaskDefinition();
		def.setName("Chores");
		def.setRepeatInterval(3600000L);
		def.setTaskClass("org.openmrs.BaseOpenmrsData");
		
		Errors errors = new BindException(def, "def");
		new SchedulerFormValidator().validate(def, errors);
		
		Assert.assertTrue(errors.hasFieldErrors("taskClass"));
		Assert.assertEquals("Scheduler.taskForm.instantiationException", errors.getFieldError("taskClass").getCode());
	}
	
	/**
	 * @see {@link SchedulerFormValidator#validate(Object,Errors)}
	 */
	@Test
	@Verifies(value = "sshould fail validation if class not found", method = "validate(Object,Errors)")
	public void validate_shouldFailValidationIfClassNotFound() throws Exception {
		TaskDefinition def = new TaskDefinition();
		def.setName("Chores");
		def.setRepeatInterval(3600000L);
		def.setTaskClass("org.openmrs.ScaryRobot");
		
		Errors errors = new BindException(def, "def");
		new SchedulerFormValidator().validate(def, errors);
		
		Assert.assertTrue(errors.hasFieldErrors("taskClass"));
		Assert.assertEquals("Scheduler.taskForm.classNotFoundException", errors.getFieldError("taskClass").getCode());
	}
	
	/**
	 * @see {@link SchedulerFormValidator#validate(Object,Errors)}
	 */
	@Test
	@Verifies(value = "should pass validation if all required fields have proper values", method = "validate(Object,Errors)")
	public void validate_shouldPassValidationIfAllRequiredFieldsHaveProperValues() throws Exception {
		TaskDefinition def = new TaskDefinition();
		def.setName("Chores");
		def.setRepeatInterval(3600000L);
		def.setTaskClass("org.openmrs.scheduler.tasks.HelloWorldTask");
		
		Errors errors = new BindException(def, "def");
		new SchedulerFormValidator().validate(def, errors);
		
		Assert.assertFalse(errors.hasErrors());
	}
}