]> git.madduck.net Git - etc/taskwarrior.git/blobdiff - tasklib/tests.py

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Docs: Document the original attribute access to the task object
[etc/taskwarrior.git] / tasklib / tests.py
index f7b9a2724614ba2004fdd4b6a2b4c492956eb530..0dae79e53a3b5564ca45c9604268266a62f0f539 100644 (file)
@@ -1,5 +1,6 @@
 # coding=utf-8
 
 # coding=utf-8
 
+import copy
 import datetime
 import itertools
 import json
 import datetime
 import itertools
 import json
@@ -9,7 +10,7 @@ import shutil
 import tempfile
 import unittest
 
 import tempfile
 import unittest
 
-from .task import TaskWarrior, Task, local_zone, DATE_FORMAT
+from .task import TaskWarrior, Task, ReadOnlyDictView, local_zone, DATE_FORMAT
 
 # http://taskwarrior.org/docs/design/task.html , Section: The Attributes
 TASK_STANDARD_ATTRS = (
 
 # http://taskwarrior.org/docs/design/task.html , Section: The Attributes
 TASK_STANDARD_ATTRS = (
@@ -125,6 +126,8 @@ class TaskFilterTest(TasklibTest):
         filtered_task = self.tw.tasks.get(project="random")
         self.assertEqual(filtered_task['project'], "random")
 
         filtered_task = self.tw.tasks.get(project="random")
         self.assertEqual(filtered_task['project'], "random")
 
+    def test_filter_with_empty_uuid(self):
+        self.assertRaises(ValueError, lambda: self.tw.tasks.get(uuid=''))
 
 class TaskTest(TasklibTest):
 
 
 class TaskTest(TasklibTest):
 
@@ -495,14 +498,26 @@ class TaskTest(TasklibTest):
         for deserializer in deserializers:
             self.assertTrue(deserializer('') in (None, [], set()))
 
         for deserializer in deserializers:
             self.assertTrue(deserializer('') in (None, [], set()))
 
-    def test_normalizers_returning_empty_string_for_none(self):
+    def test_normalizers_handling_none(self):
         # Test that any normalizer can handle None as a valid value
         t = Task(self.tw)
         # Test that any normalizer can handle None as a valid value
         t = Task(self.tw)
+
+        # These normalizers are not supposed to handle None
+        exempt_normalizers = ('normalize_uuid', )
+
         normalizers = [getattr(t, normalizer_name) for normalizer_name in
         normalizers = [getattr(t, normalizer_name) for normalizer_name in
-                       filter(lambda x: x.startswith('normalize_'), dir(t))]
+                       filter(lambda x: x.startswith('normalize_'), dir(t))
+                       if normalizer_name not in exempt_normalizers]
+
         for normalizer in normalizers:
             normalizer(None)
 
         for normalizer in normalizers:
             normalizer(None)
 
+    def test_recurrent_task_generation(self):
+        today = datetime.date.today()
+        t = Task(self.tw, description="brush teeth",
+                 due=today, recur="daily")
+        t.save()
+        self.assertEqual(len(self.tw.tasks.pending()), 2)
 
 class TaskFromHookTest(TasklibTest):
 
 
 class TaskFromHookTest(TasklibTest):
 
@@ -693,3 +708,83 @@ class UnicodeTest(TasklibTest):
     def test_non_unicode_task(self):
         Task(self.tw, description="test task").save()
         self.tw.tasks.get()
     def test_non_unicode_task(self):
         Task(self.tw, description="test task").save()
         self.tw.tasks.get()
+
+class ReadOnlyDictViewTest(unittest.TestCase):
+
+    def setUp(self):
+        self.sample = dict(l=[1,2,3], d={'k':'v'})
+        self.original_sample = copy.deepcopy(self.sample)
+        self.view = ReadOnlyDictView(self.sample)
+
+    def test_readonlydictview_getitem(self):
+        l = self.view['l']
+        self.assertEqual(l, self.sample['l'])
+
+        # Assert that modification changed only copied value
+        l.append(4)
+        self.assertNotEqual(l, self.sample['l'])
+
+        # Assert that viewed dict is not changed
+        self.assertEqual(self.sample, self.original_sample)
+
+    def test_readonlydictview_contains(self):
+        self.assertEqual('l' in self.view, 'l' in self.sample)
+        self.assertEqual('d' in self.view, 'd' in self.sample)
+        self.assertEqual('k' in self.view, 'k' in self.sample)
+
+        # Assert that viewed dict is not changed
+        self.assertEqual(self.sample, self.original_sample)
+
+    def test_readonlydictview_iter(self):
+        self.assertEqual(list(k for k in self.view),
+                         list(k for k in self.sample))
+
+        # Assert the view is correct after modification
+        self.sample['new'] = 'value'
+        self.assertEqual(list(k for k in self.view),
+                         list(k for k in self.sample))
+
+    def test_readonlydictview_len(self):
+        self.assertEqual(len(self.view), len(self.sample))
+
+        # Assert the view is correct after modification
+        self.sample['new'] = 'value'
+        self.assertEqual(len(self.view), len(self.sample))
+
+    def test_readonlydictview_get(self):
+        l = self.view.get('l')
+        self.assertEqual(l, self.sample.get('l'))
+
+        # Assert that modification changed only copied value
+        l.append(4)
+        self.assertNotEqual(l, self.sample.get('l'))
+
+        # Assert that viewed dict is not changed
+        self.assertEqual(self.sample, self.original_sample)
+
+    def test_readonlydictview_contains(self):
+        self.assertEqual(self.view.has_key('l'), self.sample.has_key('l'))
+        self.assertEqual(self.view.has_key('k'), self.sample.has_key('k'))
+        self.assertEqual(self.view.has_key('d'), self.sample.has_key('d'))
+
+        # Assert that viewed dict is not changed
+        self.assertEqual(self.sample, self.original_sample)
+
+    def test_readonlydict_items(self):
+        view_items = self.view.items()
+        sample_items = self.sample.items()
+        self.assertEqual(view_items, sample_items)
+
+        view_items.append('newkey')
+        self.assertNotEqual(view_items, sample_items)
+        self.assertEqual(self.sample, self.original_sample)
+
+    def test_readonlydict_values(self):
+        view_values = self.view.values()
+        sample_values = self.sample.values()
+        self.assertEqual(view_values, sample_values)
+
+        view_list_item = filter(lambda x: type(x) is list, view_values)[0]
+        view_list_item.append(4)
+        self.assertNotEqual(view_values, sample_values)
+        self.assertEqual(self.sample, self.original_sample)