import tempfile
import unittest
-from .task import TaskWarrior, Task, ReadOnlyDictView, local_zone, DATE_FORMAT
+from .backends import TaskWarrior
+from .task import Task, ReadOnlyDictView, TaskQuerySet
+from .lazy import LazyUUIDTask, LazyUUIDTaskSet
+from .serializing import DATE_FORMAT, local_zone
# http://taskwarrior.org/docs/design/task.html , Section: The Attributes
TASK_STANDARD_ATTRS = (
self.assertRaises(Task.CompletedTask, t.start)
+ def test_add_completed_task(self):
+ t = Task(self.tw, description="test", status="completed",
+ end=datetime.datetime.now())
+ t.save()
+
+ def test_add_multiple_completed_tasks(self):
+ t1 = Task(self.tw, description="test1", status="completed",
+ end=datetime.datetime.now())
+ t2 = Task(self.tw, description="test2", status="completed",
+ end=datetime.datetime.now())
+ t1.save()
+ t2.save()
+
def test_complete_deleted_task(self):
t = Task(self.tw, description="test task")
t.save()
t.save()
self.assertFalse(t.active)
+ def test_start_active_task(self):
+ t = Task(self.tw, description="test task")
+ t.save()
+ t.start()
+ self.assertRaises(Task.ActiveTask, t.start)
+
+ def test_stop_completed_task(self):
+ t = Task(self.tw, description="test task")
+ t.save()
+ t.start()
+ t.done()
+
+ self.assertRaises(Task.InactiveTask, t.stop)
+
+ t = Task(self.tw, description="test task")
+ t.save()
+ t.done()
+
+ self.assertRaises(Task.InactiveTask, t.stop)
+
+ def test_stop_deleted_task(self):
+ t = Task(self.tw, description="test task")
+ t.save()
+ t.start()
+ t.delete()
+ t.stop()
+
+ def test_stop_inactive_task(self):
+ t = Task(self.tw, description="test task")
+ t.save()
+
+ self.assertRaises(Task.InactiveTask, t.stop)
+
+ t = Task(self.tw, description="test task")
+ t.save()
+ t.start()
+ t.stop()
+
+ self.assertRaises(Task.InactiveTask, t.stop)
+
+ def test_stopping_task(self):
+ t = Task(self.tw, description="test task")
+ now = t.datetime_normalizer(datetime.datetime.now())
+ t.save()
+ t.start()
+ t.stop()
+
+ self.assertEqual(t['end'], None)
+ self.assertEqual(t['status'], 'pending')
+ self.assertFalse(t.active)
+
def test_modify_simple_attribute_without_space(self):
t = Task(self.tw, description="test")
t.save()
def test_return_all_from_failed_executed_command(self):
Task(self.tw, description="test task", tags=['test']).save()
- out, err, rc = self.tw.execute_command(['countinvalid'], return_all=True)
+ out, err, rc = self.tw.execute_command(['countinvalid'],
+ return_all=True, allow_failure=False)
self.assertNotEqual(rc, 0)
'{"description":"Buy some milk",'
'"entry":"20141118T050231Z",'
'"status":"pending",'
+ '"start":"20141119T152233Z",'
'"uuid":"a360fc44-315c-4366-b70c-ea7e7520b749"}')
input_modify_data = six.StringIO(input_add_data.getvalue() + '\n' +
'"description":"test task"}')
def test_setting_up_from_add_hook_input(self):
- t = Task.from_input(input_file=self.input_add_data, warrior=self.tw)
+ t = Task.from_input(input_file=self.input_add_data, backend=self.tw)
self.assertEqual(t['description'], "Buy some milk")
self.assertEqual(t.pending, True)
def test_setting_up_from_modified_hook_input(self):
t = Task.from_input(input_file=self.input_modify_data, modify=True,
- warrior=self.tw)
+ backend=self.tw)
self.assertEqual(t['description'], "Buy some milk finally")
self.assertEqual(t.pending, False)
self.assertEqual(t.completed, True)
self.assertEqual(t._original_data['status'], "pending")
self.assertEqual(t._original_data['description'], "Buy some milk")
self.assertEqual(set(t._modified_fields),
- set(['status', 'description']))
+ set(['status', 'description', 'start']))
def test_export_data(self):
t = Task(self.tw, description="test task",
view_list_item.append(4)
self.assertNotEqual(view_values, sample_values)
self.assertEqual(self.sample, self.original_sample)
+
+
+class LazyUUIDTaskTest(TasklibTest):
+
+ def setUp(self):
+ super(LazyUUIDTaskTest, self).setUp()
+
+ self.stored = Task(self.tw, description="this is test task")
+ self.stored.save()
+
+ self.lazy = LazyUUIDTask(self.tw, self.stored['uuid'])
+
+ def test_uuid_non_conversion(self):
+ assert self.stored['uuid'] == self.lazy['uuid']
+ assert type(self.lazy) is LazyUUIDTask
+
+ def test_conversion(self):
+ assert self.stored['description'] == self.lazy['description']
+ assert type(self.lazy) is Task
+
+ def test_normal_to_lazy_equality(self):
+ assert self.stored == self.lazy
+ assert type(self.lazy) is LazyUUIDTask
+
+ def test_lazy_to_lazy_equality(self):
+ lazy1 = LazyUUIDTask(self.tw, self.stored['uuid'])
+ lazy2 = LazyUUIDTask(self.tw, self.stored['uuid'])
+
+ assert lazy1 == lazy2
+ assert type(lazy1) is LazyUUIDTask
+ assert type(lazy2) is LazyUUIDTask
+
+ def test_lazy_in_queryset(self):
+ tasks = self.tw.tasks.filter(uuid=self.stored['uuid'])
+
+ assert self.lazy in tasks
+ assert type(self.lazy) is LazyUUIDTask
+
+
+class LazyUUIDTaskSetTest(TasklibTest):
+
+ def setUp(self):
+ super(LazyUUIDTaskSetTest, self).setUp()
+
+ self.task1 = Task(self.tw, description="task 1")
+ self.task2 = Task(self.tw, description="task 2")
+ self.task3 = Task(self.tw, description="task 3")
+
+ self.task1.save()
+ self.task2.save()
+ self.task3.save()
+
+ self.uuids = (
+ self.task1['uuid'],
+ self.task2['uuid'],
+ self.task3['uuid']
+ )
+
+ self.lazy = LazyUUIDTaskSet(self.tw, self.uuids)
+
+ def test_length(self):
+ assert len(self.lazy) == 3
+ assert type(self.lazy) is LazyUUIDTaskSet
+
+ def test_contains(self):
+ assert self.task1 in self.lazy
+ assert self.task2 in self.lazy
+ assert self.task3 in self.lazy
+ assert type(self.lazy) is LazyUUIDTaskSet
+
+ def test_eq_lazy(self):
+ new_lazy = LazyUUIDTaskSet(self.tw, self.uuids)
+ assert self.lazy == new_lazy
+ assert not self.lazy != new_lazy
+ assert type(self.lazy) is LazyUUIDTaskSet
+
+ def test_eq_real(self):
+ assert self.lazy == self.tw.tasks.all()
+ assert self.tw.tasks.all() == self.lazy
+ assert not self.lazy != self.tw.tasks.all()
+
+ assert type(self.lazy) is LazyUUIDTaskSet