/*
* Copyright 2011 Last.fm
*
* Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package fm.last.citrine.web;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import fm.last.citrine.model.Status;
import fm.last.citrine.model.Task;
import fm.last.citrine.model.TaskRun;
import fm.last.citrine.scheduler.SchedulerManager;
import fm.last.citrine.scheduler.SchedulerStatus;
import fm.last.citrine.service.TaskManager;
import fm.last.citrine.service.TaskRunManager;
public class TaskControllerTest {
private final TaskController taskController = new TaskController();
@Mock
private TaskManager mockTaskManager;
@Mock
private TaskRunManager mockTaskRunManager;
@Mock
private SchedulerManager mockSchedulerManager;
private final MockHttpServletRequest mockRequest = new MockHttpServletRequest();
private final MockHttpServletResponse mockResponse = new MockHttpServletResponse();
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
when(mockSchedulerManager.getStatus()).thenReturn(SchedulerStatus.STARTED);
taskController.setTaskManager(mockTaskManager);
taskController.setTaskRunManager(mockTaskRunManager);
taskController.setSchedulerManager(mockSchedulerManager);
}
@Test
public void testListNoTasksOrGroupNames() throws Exception {
Map<String, Object> model = getModel();
assertEquals(SchedulerStatus.STARTED, model.get("schedulerStatus"));
assertEquals(Constants.GROUP_NAME_ALL, model.get("selectedGroupName"));
assertEquals(0, ((Set<String>) model.get("groupNames")).size());
assertEquals(0, ((Map<Long, String>) model.get("recentStatus")).size());
assertEquals(0, ((List<Task>) model.get("tasks")).size());
assertEquals(0, ((Map<Long, String>) model.get("lastRun")).size());
}
@Test
public void testTask() throws Exception {
List<Task> tasks = new ArrayList<Task>();
tasks.add(new Task("task1"));
when(mockTaskManager.getTasks()).thenReturn(tasks);
Map<String, Object> model = getModel();
assertEquals(SchedulerStatus.STARTED, model.get("schedulerStatus"));
assertEquals(Constants.GROUP_NAME_ALL, model.get("selectedGroupName"));
Map<Long, String> recentStatusMap = (Map<Long, String>) model.get("recentStatus");
assertEquals(1, recentStatusMap.size());
assertEquals(Status.UNKNOWN.toString().toLowerCase(), recentStatusMap.get(0L));
List<Task> tasksMapMap = (List<Task>) model.get("tasks");
assertEquals(1, tasksMapMap.size());
assertEquals(tasks.get(0), tasksMapMap.get(0));
Map<Long, String> lastRunMap = (Map<Long, String>) model.get("lastRun");
assertEquals(1, lastRunMap.size());
assertEquals("Never", lastRunMap.get(0L));
}
@Test
public void testTaskDisabled() throws Exception {
List<Task> tasks = new ArrayList<Task>();
Task task = new Task("task1");
task.setEnabled(false);
tasks.add(task);
when(mockTaskManager.getTasks()).thenReturn(tasks);
Map<String, Object> model = getModel();
Map<Long, String> recentStatusMap = (Map<Long, String>) model.get("recentStatus");
assertEquals(1, recentStatusMap.size());
assertEquals(TaskController.TASK_STATUS_DISABLED, recentStatusMap.get(0L));
}
@Test
public void testLastRun() throws Exception {
List<Task> tasks = new ArrayList<Task>();
Task task = new Task("task1");
tasks.add(task);
when(mockTaskManager.getTasks()).thenReturn(tasks);
DateTime startDate = new DateTime().minusDays(1);
TaskRun taskRun = new TaskRun(startDate.toDate(), startDate.plusHours(2).toDate(), "", "", "", task.getId());
when(mockTaskRunManager.getMostRecent(task.getId())).thenReturn(taskRun);
Map<String, Object> model = getModel();
Map<Long, String> lastRunMap = (Map<Long, String>) model.get("lastRun");
assertEquals(1, lastRunMap.size());
assertEquals("1 day ago", lastRunMap.get(0L));
}
private Map<String, Object> getModel() throws Exception {
ModelAndView modelAndView = taskController.list(mockRequest, mockResponse);
assertEquals("tasks_list", modelAndView.getViewName());
Map<String, Object> model = modelAndView.getModel();
return model;
}
// TODO: test with a selected group name
// TODO: test with the "all" selected group name
// TODO: select with no group name returning tasks with group names
// TODO: test with a long description that should get truncated
}