X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/blobdiff_plain/58f3ecf4ed9351d3226b3ac0152ec56313f79431..447b6c8847cbe8f52970ae097e7b676d8302aed0:/tasklib/tests.py diff --git a/tasklib/tests.py b/tasklib/tests.py index 35979a8..3a3f25d 100644 --- a/tasklib/tests.py +++ b/tasklib/tests.py @@ -1,6 +1,9 @@ # coding=utf-8 import datetime +import itertools +import json +import six import shutil import tempfile import unittest @@ -28,7 +31,7 @@ TASK_STANDARD_ATTRS = ( 'priority', 'depends', 'tags', - 'annotation', + 'annotations', ) class TasklibTest(unittest.TestCase): @@ -475,6 +478,73 @@ class TaskTest(TasklibTest): t.save() self.assertEqual(t['tags'], ['test']) + def test_serializers_returning_empty_string_for_none(self): + # Test that any serializer returns '' when passed None + t = Task(self.tw) + serializers = [getattr(t, serializer_name) for serializer_name in + filter(lambda x: x.startswith('serialize_'), dir(t))] + for serializer in serializers: + self.assertEqual(serializer(None), '') + + def test_deserializer_returning_empty_value_for_empty_string(self): + # Test that any deserializer returns empty value when passed '' + t = Task(self.tw) + deserializers = [getattr(t, deserializer_name) for deserializer_name in + filter(lambda x: x.startswith('deserialize_'), dir(t))] + for deserializer in deserializers: + self.assertTrue(deserializer('') in (None, [], set())) + + +class TaskFromHookTest(TasklibTest): + + input_add_data = six.StringIO( + '{"description":"Buy some milk",' + '"entry":"20141118T050231Z",' + '"status":"pending",' + '"uuid":"a360fc44-315c-4366-b70c-ea7e7520b749"}') + + input_modify_data = six.StringIO(input_add_data.getvalue() + '\n' + + '{"description":"Buy some milk finally",' + '"entry":"20141118T050231Z",' + '"status":"completed",' + '"uuid":"a360fc44-315c-4366-b70c-ea7e7520b749"}') + + exported_raw_data = ( + '{"project":"Home",' + '"due":"20150101T232323Z",' + '"description":"test task"}') + + def test_setting_up_from_add_hook_input(self): + t = Task.from_input(input_file=self.input_add_data) + 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) + 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'])) + + def test_export_data(self): + t = Task(self.tw, description="test task", + project="Home", due=datetime.datetime(2015,1,1,23,23,23)) + + # Check that the output is a permutation of: + # {"project":"Home","description":"test task","due":"20150101232323Z"} + allowed_segments = self.exported_raw_data[1:-1].split(',') + allowed_output = [ + '{' + ','.join(segments) + '}' + for segments in itertools.permutations(allowed_segments) + ] + + self.assertTrue(any(t.export_data() == expected + for expected in allowed_output)) + class AnnotationTest(TasklibTest): @@ -517,6 +587,23 @@ class AnnotationTest(TasklibTest): task.save() self.assertEqual(task['project'], 'test') + def test_serialize_annotations(self): + # Test that serializing annotations is possible + t = Task(self.tw, description="test") + t.save() + + t.add_annotation("annotation1") + t.add_annotation("annotation2") + + data = t._serialize('annotations', t._data['annotations']) + + self.assertEqual(len(data), 2) + self.assertEqual(type(data[0]), dict) + self.assertEqual(type(data[1]), dict) + + self.assertEqual(data[0]['description'], "annotation1") + self.assertEqual(data[1]['description'], "annotation2") + class UnicodeTest(TasklibTest):