/**
* Copyright (c) 2012 Todoroo Inc
*
* See the file "LICENSE" for the full license governing this code.
*/
package com.todoroo.astrid.dao;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.sql.Order;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.astrid.dao.TaskDao.TaskCriteria;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.test.DatabaseTestCase;
public class TaskDaoTests extends DatabaseTestCase {
public static Property<?>[] IDS = new Property<?>[] { Task.ID };
public static Property<?>[] TITLES = new Property<?>[] { Task.ID,
Task.TITLE };
@Autowired
TaskDao taskDao;
/**
* Test basic task creation, fetch, and save
*/
public void testTaskCreation() throws Exception {
TodorooCursor<Task> cursor = taskDao.query(
Query.select(IDS));
assertEquals(0, cursor.getCount());
cursor.close();
// create task "happy"
Task task = new Task();
task.setValue(Task.TITLE, "happy");
assertTrue(taskDao.save(task));
cursor = taskDao.query(
Query.select(IDS));
assertEquals(1, cursor.getCount());
cursor.close();
long happyId = task.getId();
assertNotSame(Task.NO_ID, happyId);
task = taskDao.fetch(happyId, TITLES);
assertEquals("happy", task.getValue(Task.TITLE));
// create task "sad"
task = new Task();
task.setValue(Task.TITLE, "sad");
assertTrue(taskDao.save(task));
cursor = taskDao.query(
Query.select(IDS));
assertEquals(2, cursor.getCount());
cursor.close();
// rename sad to melancholy
long sadId = task.getId();
assertNotSame(Task.NO_ID, sadId);
task.setValue(Task.TITLE, "melancholy");
assertTrue(taskDao.save(task));
cursor = taskDao.query(
Query.select(IDS));
assertEquals(2, cursor.getCount());
cursor.close();
// check state
task = taskDao.fetch(happyId, TITLES);
assertEquals("happy", task.getValue(Task.TITLE));
task = taskDao.fetch(sadId,TITLES);
assertEquals("melancholy", task.getValue(Task.TITLE));
}
/**
* Test various task fetch conditions
*/
public void testTaskConditions() throws Exception {
// create normal task
Task task = new Task();
task.setValue(Task.TITLE, "normal");
assertTrue(taskDao.save(task));
// create blank task
task = new Task();
task.setValue(Task.TITLE, "");
assertTrue(taskDao.save(task));
// create hidden task
task = new Task();
task.setValue(Task.TITLE, "hidden");
task.setValue(Task.HIDE_UNTIL, DateUtilities.now() + 10000);
assertTrue(taskDao.save(task));
// create task with deadlines
task = new Task();
task.setValue(Task.TITLE, "deadlineInFuture");
task.setValue(Task.DUE_DATE, DateUtilities.now() + 10000);
assertTrue(taskDao.save(task));
task = new Task();
task.setValue(Task.TITLE, "deadlineInPast");
task.setValue(Task.DUE_DATE, DateUtilities.now() - 10000);
assertTrue(taskDao.save(task));
// create completed task
task = new Task();
task.setValue(Task.TITLE, "completed");
task.setValue(Task.COMPLETION_DATE, DateUtilities.now() - 10000);
assertTrue(taskDao.save(task));
// check has no name
TodorooCursor<Task> cursor = taskDao.query(
Query.select(TITLES).where(TaskCriteria.hasNoTitle()));
assertEquals(1, cursor.getCount());
cursor.moveToNext();
assertEquals("", cursor.getString(1));
cursor.close();
// check has deadlines
cursor = taskDao.query(Query.select(TITLES).where(
TaskCriteria.hasDeadlines()).orderBy(Order.asc(Task.DUE_DATE)));
assertEquals(2, cursor.getCount());
cursor.moveToNext();
assertEquals("deadlineInPast", cursor.getString(1));
cursor.moveToNext();
assertEquals("deadlineInFuture", cursor.getString(1));
cursor.close();
// check is active
cursor = taskDao.query(Query.select(TITLES).where(TaskCriteria.
isActive()));
assertEquals(5, cursor.getCount());
cursor.close();
// check due before / after
cursor = taskDao.query(Query.select(TITLES).where(TaskCriteria.
dueBeforeNow()));
cursor.moveToNext();
assertEquals(1, cursor.getCount());
cursor.close();
cursor = taskDao.query(Query.select(TITLES).where(TaskCriteria.
dueAfterNow()));
assertEquals(1, cursor.getCount());
cursor.close();
// check completed before
cursor = taskDao.query(Query.select(TITLES).where(TaskCriteria.
completed()));
assertEquals(1, cursor.getCount());
cursor.close();
// check is visible
cursor = taskDao.query(Query.select(TITLES).where(TaskCriteria.
isVisible()));
assertEquals(5, cursor.getCount());
cursor.close();
}
/**
* Test task deletion
*/
public void testTDeletion() throws Exception {
TodorooCursor<Task> cursor = taskDao.query(
Query.select(IDS));
assertEquals(0, cursor.getCount());
cursor.close();
// create task "happy"
Task task = new Task();
task.setValue(Task.TITLE, "happy");
assertTrue(taskDao.save(task));
cursor = taskDao.query(
Query.select(IDS));
assertEquals(1, cursor.getCount());
cursor.close();
// delete
long happyId = task.getId();
assertTrue(taskDao.delete(happyId));
cursor = taskDao.query(
Query.select(IDS));
assertEquals(0, cursor.getCount());
cursor.close();
}
/**
* Test save without prior create doesn't work
*/
public void testSaveWithoutCreate() throws Exception {
TodorooCursor<Task> cursor;
// try to save task "happy"
Task task = new Task();
task.setValue(Task.TITLE, "happy");
task.setValue(Task.ID, 1L);
assertFalse(taskDao.save(task));
cursor = taskDao.query(
Query.select(IDS));
assertEquals(0, cursor.getCount());
cursor.close();
}
/**
* Test passing invalid task indices to various things
*/
public void testInvalidIndex() throws Exception {
TodorooCursor<Task> cursor;
cursor = taskDao.query(
Query.select(IDS));
assertEquals(0, cursor.getCount());
cursor.close();
assertNull(taskDao.fetch(1, IDS));
assertFalse(taskDao.delete(1));
// make sure db still works
cursor = taskDao.query(
Query.select(IDS));
assertEquals(0, cursor.getCount());
cursor.close();
}
// TODO check eventing
}