self.tw.tasks.all()[0].done()
self.assertEqual(len(self.tw.tasks.completed()), 1)
+ def test_deleted_empty(self):
+ Task(self.tw, description="test task").save()
+ self.assertEqual(len(self.tw.tasks.deleted()), 0)
+
+ def test_deleted_non_empty(self):
+ Task(self.tw, description="test task").save()
+ self.assertEqual(len(self.tw.tasks.deleted()), 0)
+ self.tw.tasks.all()[0].delete()
+ self.assertEqual(len(self.tw.tasks.deleted()), 1)
+
+ def test_waiting_empty(self):
+ Task(self.tw, description="test task").save()
+ self.assertEqual(len(self.tw.tasks.waiting()), 0)
+
+ def test_waiting_non_empty(self):
+ Task(self.tw, description="test task").save()
+ self.assertEqual(len(self.tw.tasks.waiting()), 0)
+
+ t = self.tw.tasks.all()[0]
+ t['wait'] = datetime.datetime.now() + datetime.timedelta(days=1)
+ t.save()
+
+ self.assertEqual(len(self.tw.tasks.waiting()), 1)
+
+ def test_recurring_empty(self):
+ Task(self.tw, description="test task").save()
+ self.assertEqual(len(self.tw.tasks.recurring()), 0)
+
+ def test_recurring_non_empty(self):
+ Task(self.tw, description="test task", recur="daily",
+ due=datetime.datetime.now()).save()
+ self.assertEqual(len(self.tw.tasks.recurring()), 1)
+
def test_filtering_by_attribute(self):
Task(self.tw, description="no priority task").save()
Task(self.tw, priority="H", description="high priority task").save()
t2 = self.tw.tasks.get(uuid=t1['uuid'])
self.assertEqual(t1.__hash__(), t2.__hash__())
+ def test_hash_unequal_unsaved_tasks(self):
+ # Compare the hash of the task using two different objects
+ t1 = Task(self.tw, description="test task 1")
+ t2 = Task(self.tw, description="test task 2")
+
+ self.assertNotEqual(t1.__hash__(), t2.__hash__())
+
+ def test_hash_unequal_saved_tasks(self):
+ # Compare the hash of the task using two different objects
+ t1 = Task(self.tw, description="test task 1")
+ t2 = Task(self.tw, description="test task 2")
+
+ t1.save()
+ t2.save()
+
+ self.assertNotEqual(t1.__hash__(), t2.__hash__())
+
def test_adding_task_with_priority(self):
t = Task(self.tw, description="test task", priority="M")
t.save()
def test_adding_tag_by_appending(self):
t = Task(self.tw, description="test task", tags=['test1'])
t.save()
- t['tags'].append('test2')
+ t['tags'].add('test2')
t.save()
- self.assertEqual(t['tags'], ['test1', 'test2'])
+ self.assertEqual(t['tags'], set(['test1', 'test2']))
+
+ def test_adding_tag_twice(self):
+ t = Task(self.tw, description="test task", tags=['test1'])
+ t.save()
+ t['tags'].add('test2')
+ t['tags'].add('test2')
+ t.save()
+ self.assertEqual(t['tags'], set(['test1', 'test2']))
def test_adding_tag_by_appending_empty(self):
t = Task(self.tw, description="test task")
t.save()
- t['tags'].append('test')
+ t['tags'].add('test')
t.save()
- self.assertEqual(t['tags'], ['test'])
+ self.assertEqual(t['tags'], set(['test']))
def test_serializers_returning_empty_string_for_none(self):
# Test that any serializer returns '' when passed None
t.save()
self.assertEqual(len(self.tw.tasks.pending()), 2)
+ def test_spawned_task_parent(self):
+ today = datetime.date.today()
+ t = Task(self.tw, description="brush teeth",
+ due=today, recur="daily")
+ t.save()
+
+ spawned = self.tw.tasks.pending().get(due=today)
+ assert spawned['parent'] == t
+
def test_modify_number_of_tasks_at_once(self):
for i in range(1, 100):
Task(self.tw, description="test task %d" % i, tags=['test']).save()
'"start":"20141119T152233Z",'
'"uuid":"a360fc44-315c-4366-b70c-ea7e7520b749"}')
+ input_add_data_recurring = six.StringIO(
+ '{"description":"Mow the lawn",'
+ '"entry":"20160210T224304Z",'
+ '"parent":"62da6227-519c-42c2-915d-dccada926ad7",'
+ '"recur":"weekly",'
+ '"status":"pending",'
+ '"uuid":"81305335-0237-49ff-8e87-b3cdc2369cec"}')
+
input_modify_data = six.StringIO(input_add_data.getvalue() + '\n' +
'{"description":"Buy some milk finally",'
'"entry":"20141118T050231Z",'
self.assertEqual(t['description'], "Buy some milk")
self.assertEqual(t.pending, True)
+ def test_setting_up_from_add_hook_input_recurring(self):
+ t = Task.from_input(input_file=self.input_add_data_recurring,
+ backend=self.tw)
+ self.assertEqual(t['description'], "Mow the lawn")
+ 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,
backend=self.tw)
def test_normal_to_lazy_equality(self):
assert self.stored == self.lazy
+ assert not self.stored != self.lazy
assert type(self.lazy) is LazyUUIDTask
def test_lazy_to_lazy_equality(self):
lazy2 = LazyUUIDTask(self.tw, self.stored['uuid'])
assert lazy1 == lazy2
+ assert not lazy1 != lazy2
+ assert type(lazy1) is LazyUUIDTask
+ assert type(lazy2) is LazyUUIDTask
+
+ def test_normal_to_lazy_inequality(self):
+ # Create a different UUID by changing the last letter
+ wrong_uuid = self.stored['uuid']
+ wrong_uuid = wrong_uuid[:-1] + ('a' if wrong_uuid[-1] != 'a' else 'b')
+
+ wrong_lazy = LazyUUIDTask(self.tw, wrong_uuid)
+
+ assert not self.stored == wrong_lazy
+ assert self.stored != wrong_lazy
+ assert type(wrong_lazy) is LazyUUIDTask
+
+ def test_lazy_to_lazy_inequality(self):
+ # Create a different UUID by changing the last letter
+ wrong_uuid = self.stored['uuid']
+ wrong_uuid = wrong_uuid[:-1] + ('a' if wrong_uuid[-1] != 'a' else 'b')
+
+ lazy1 = LazyUUIDTask(self.tw, self.stored['uuid'])
+ lazy2 = LazyUUIDTask(self.tw, wrong_uuid)
+
+ assert not lazy1 == lazy2
+ assert lazy1 != lazy2
assert type(lazy1) is LazyUUIDTask
assert type(lazy2) is LazyUUIDTask
def test_config(self):
assert self.tw.config['nag'] == "You have more urgent tasks."
- assert self.tw.config['debug'] == "no"
+ assert self.tw.config['default.command'] == "next"
+ assert self.tw.config['dependency.indicator'] == "D"