]> 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:

normalizers: Handle None properly in all normalizers
[etc/taskwarrior.git] / tasklib / tests.py
index f7b9a2724614ba2004fdd4b6a2b4c492956eb530..5ebea1375aaeb682f845104f50f6d6fae369c449 100644 (file)
@@ -1,5 +1,6 @@
 # coding=utf-8
 
+import copy
 import datetime
 import itertools
 import json
@@ -9,7 +10,7 @@ import shutil
 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 = (
@@ -125,6 +126,8 @@ class TaskFilterTest(TasklibTest):
         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):
 
@@ -495,14 +498,22 @@ class TaskTest(TasklibTest):
         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)
+
         normalizers = [getattr(t, normalizer_name) for normalizer_name in
                        filter(lambda x: x.startswith('normalize_'), dir(t))]
+
         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):
 
@@ -693,3 +704,76 @@ class UnicodeTest(TasklibTest):
     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_readonlydict_items(self):
+        view_items = self.view.items()
+        sample_items = list(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 = list(self.sample.values())
+        self.assertEqual(view_values, sample_values)
+
+        view_list_item = list(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)