+ 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'))
+