X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/blobdiff_plain/6adf5e34ed35f8b5d9975867c92096f4b9bc080f..847794a5402c9a7f2ffd6f780a73bb92ae804898:/tasklib/tests.py

diff --git a/tasklib/tests.py b/tasklib/tests.py
index 76a9514..6d67a12 100644
--- a/tasklib/tests.py
+++ b/tasklib/tests.py
@@ -1,5 +1,6 @@
 # coding=utf-8
 
+import datetime
 import shutil
 import tempfile
 import unittest
@@ -69,6 +70,34 @@ class TaskFilterTest(TasklibTest):
         no_priority_task = self.tw.tasks.get(priority=None)
         self.assertEqual(no_priority_task['description'], "no priority task")
 
+    def test_filter_for_task_with_space_in_descripition(self):
+        task = Task(self.tw, description="test task")
+        task.save()
+
+        filtered_task = self.tw.tasks.get(description="test task")
+        self.assertEqual(filtered_task['description'], "test task")
+
+    def test_filter_for_task_without_space_in_descripition(self):
+        task = Task(self.tw, description="test")
+        task.save()
+
+        filtered_task = self.tw.tasks.get(description="test")
+        self.assertEqual(filtered_task['description'], "test")
+
+    def test_filter_for_task_with_space_in_project(self):
+        task = Task(self.tw, description="test", project="random project")
+        task.save()
+
+        filtered_task = self.tw.tasks.get(project="random project")
+        self.assertEqual(filtered_task['project'], "random project")
+
+    def test_filter_for_task_without_space_in_project(self):
+        task = Task(self.tw, description="test", project="random")
+        task.save()
+
+        filtered_task = self.tw.tasks.get(project="random")
+        self.assertEqual(filtered_task['project'], "random")
+
 
 class TaskTest(TasklibTest):
 
@@ -113,6 +142,29 @@ class TaskTest(TasklibTest):
 
         self.assertRaises(Task.DeletedTask, t.done)
 
+    def test_modify_simple_attribute_without_space(self):
+        t = Task(self.tw, description="test")
+        t.save()
+
+        self.assertEquals(t['description'], "test")
+
+        t['description'] = "test-modified"
+        t.save()
+
+        self.assertEquals(t['description'], "test-modified")
+
+    def test_modify_simple_attribute_with_space(self):
+        # Space can pose problems with parsing
+        t = Task(self.tw, description="test task")
+        t.save()
+
+        self.assertEquals(t['description'], "test task")
+
+        t['description'] = "test task modified"
+        t.save()
+
+        self.assertEquals(t['description'], "test task modified")
+
     def test_empty_dependency_set_of_unsaved_task(self):
         t = Task(self.tw, description="test task")
         self.assertEqual(t['depends'], set())
@@ -193,6 +245,28 @@ class TaskTest(TasklibTest):
 
         self.assertEqual(t['depends'], set([dependency1, dependency2]))
 
+    def test_simple_dependency_set_save_repeatedly(self):
+        # Adds only one dependency to task with no dependencies
+        t = Task(self.tw, description="test task")
+        dependency = Task(self.tw, description="needs to be done first")
+        dependency.save()
+
+        t['depends'] = set([dependency])
+        t.save()
+
+        # We taint the task, but keep depends intact
+        t['description'] = "test task modified"
+        t.save()
+
+        self.assertEqual(t['depends'], set([dependency]))
+
+        # We taint the task, but assign the same set to the depends
+        t['depends'] = set([dependency])
+        t['description'] = "test task modified again"
+        t.save()
+
+        self.assertEqual(t['depends'], set([dependency]))
+
     def test_compare_different_tasks(self):
         # Negative: compare two different tasks
         t1 = Task(self.tw, description="test task")
@@ -240,6 +314,106 @@ class TaskTest(TasklibTest):
         t2 = self.tw.tasks.get(uuid=t1['uuid'])
         self.assertEqual(t1.__hash__(), t2.__hash__())
 
+    def test_adding_task_with_priority(self):
+        t = Task(self.tw, description="test task", priority="M")
+        t.save()
+
+    def test_removing_priority_with_none(self):
+        t = Task(self.tw, description="test task", priority="L")
+        t.save()
+
+        # Remove the priority mark
+        t['priority'] = None
+        t.save()
+
+        # Assert that priority is not there after saving
+        self.assertEqual(t['priority'], None)
+
+    def test_adding_task_with_due_time(self):
+        t = Task(self.tw, description="test task", due=datetime.datetime.now())
+        t.save()
+
+    def test_removing_due_time_with_none(self):
+        t = Task(self.tw, description="test task", due=datetime.datetime.now())
+        t.save()
+
+        # Remove the due timestamp
+        t['due'] = None
+        t.save()
+
+        # Assert that due timestamp is no longer there
+        self.assertEqual(t['due'], None)
+
+    def test_modified_fields_new_task(self):
+        t = Task(self.tw)
+
+        # This should be empty with new task
+        self.assertEqual(set(t._modified_fields), set())
+
+        # Modify the task
+        t['description'] = "test task"
+        self.assertEqual(set(t._modified_fields), set(['description']))
+
+        t['due'] = datetime.datetime(2014, 2, 14, 14, 14, 14)  # <3
+        self.assertEqual(set(t._modified_fields), set(['description', 'due']))
+
+        t['project'] = "test project"
+        self.assertEqual(set(t._modified_fields),
+                         set(['description', 'due', 'project']))
+
+        # List of modified fields should clear out when saved
+        t.save()
+        self.assertEqual(set(t._modified_fields), set())
+
+        # Reassigning the fields with the same values now should not produce
+        # modified fields
+        t['description'] = "test task"
+        t['due'] = datetime.datetime(2014, 2, 14, 14, 14, 14)  # <3
+        t['project'] = "test project"
+        self.assertEqual(set(t._modified_fields), set())
+
+    def test_modified_fields_loaded_task(self):
+        t = Task(self.tw)
+
+        # Modify the task
+        t['description'] = "test task"
+        t['due'] = datetime.datetime(2014, 2, 14, 14, 14, 14)  # <3
+        t['project'] = "test project"
+
+        dependency = Task(self.tw, description="dependency")
+        dependency.save()
+        t['depends'] = set([dependency])
+
+        # List of modified fields should clear out when saved
+        t.save()
+        self.assertEqual(set(t._modified_fields), set())
+
+        # Get the task by using a filter by UUID
+        t2 = self.tw.tasks.get(uuid=t['uuid'])
+
+        # Reassigning the fields with the same values now should not produce
+        # modified fields
+        t['description'] = "test task"
+        t['due'] = datetime.datetime(2014, 2, 14, 14, 14, 14)  # <3
+        t['project'] = "test project"
+        t['depends'] = set([dependency])
+        self.assertEqual(set(t._modified_fields), set())
+
+    def test_setting_read_only_attrs_through_init(self):
+        # Test that we are unable to set readonly attrs through __init__
+        for readonly_key in Task.read_only_fields:
+            kwargs = {'description': 'test task', readonly_key: 'value'}
+            self.assertRaises(RuntimeError,
+                              lambda: Task(self.tw, **kwargs))
+
+    def test_setting_read_only_attrs_through_setitem(self):
+        # Test that we are unable to set readonly attrs through __init__
+        for readonly_key in Task.read_only_fields:
+            t = Task(self.tw, description='test task')
+            self.assertRaises(RuntimeError,
+                              lambda: t.__setitem__(readonly_key, 'value'))
+
+
 class AnnotationTest(TasklibTest):
 
     def setUp(self):