class TaskStatusesTestCase(unittest.TestCase): def setUp(self): self.task = Task('summary') def test_summary(self): self.assertEqual('summary', self.task.summary, 'Task should store sumammary') def test_initial_status_is_new(self): self.assertEqual(Status.NEW, self.task.status, 'Initial status should be "New"') def test_after_start_status_is_pending(self): self.task.start() self.assertEqual(Status.PENDING, self.task.status) def test_defer_change_status_to_deferred(self): self.task.start() self.task.defer() self.assertEqual(Status.DEFERRED, self.task.status) def test_done_change_status_to_done(self): self.task.done() self.assertEqual(Status.DONE, self.task.status) def test_cancel_change_status_to_cancelled(self): self.task.cancel() self.assertEqual(Status.CANCELLED, self.task.status)
class DurationCoputationTestCase(unittest.TestCase): def setUp(self): self.task = Task('summary') def test_initial_duration_is_0(self): self.assertEqual(datetime.timedelta(0), self.task.duration) @patch_datetime def test_duration_get_whole_time_spent_on_task(self, shift_time): self.task.start() shift_time(minutes=10) self.task.defer() self.assertEqual(datetime.timedelta(minutes=10), self.task.duration) self.task.start() shift_time(minutes=10) self.task.defer() self.assertEqual(datetime.timedelta(minutes=20), self.task.duration, 'Duration should be computed properly if task is resumed couple of times.') def test_default_estimate_is_None(self): self.assertIsNone(self.task.estimate) @patch_datetime def test_remain_is_estimate_minus_duration(self, shift_time): self.task.estimate = datetime.timedelta(minutes=60) self.task.start() shift_time(minutes=30) self.assertEqual(datetime.timedelta(minutes=30), self.task.remain) @patch_datetime def test_remain_can_not_be_negative(self, shift_time): self.task.estimate = datetime.timedelta(minutes=60) self.task.start() shift_time(minutes=70) self.assertEqual(datetime.timedelta(0), self.task.remain) @patch_datetime def test_deviation_is_always_0_if_estimate_is_None(self, shift_time): self.assertEqual(datetime.timedelta(0), self.task.deviation) self.task.start() shift_time(days=2) self.assertEqual(datetime.timedelta(0), self.task.deviation) @patch_datetime def test_deviation_is_negative_if_task_is_late(self, shift_time): self.task.estimate = datetime.timedelta(minutes=60) self.task.start() shift_time(minutes=70) self.assertEqual(datetime.timedelta(minutes=-10), self.task.deviation) @patch_datetime def test_deviation_is_zero_if_task_is_on_time(self, shift_time): """deviation = estimate - (actual + remain)""" self.task.estimate = datetime.timedelta(minutes=60) self.task.start() shift_time(minutes=50) self.assertEqual(datetime.timedelta(0), self.task.deviation) shift_time(minutes=10) self.assertEqual(datetime.timedelta(0), self.task.deviation) @patch_datetime def test_deviation_is_positive_if_task_is_done_earlier_than_expected(self, shift_time): self.task.estimate = datetime.timedelta(minutes=60) self.task.start() shift_time(minutes=50) self.task.done() self.assertEqual(datetime.timedelta(minutes=10), self.task.deviation) @patch_datetime def test_pending_task_takes_into_account_time_from_last_start(self, shift_time): self.task.start() shift_time(minutes=10) self.assertEqual(datetime.timedelta(minutes=10), self.task.duration) @patch_datetime def test_marking_task_as_done_properly_updates_duration_time(self, shift_time): self.task.start() shift_time(minutes=10) self.task.done() self.assertEqual(datetime.timedelta(minutes=10), self.task.duration) @patch_datetime def test_marking_task_as_cancelled_properly_updates_duration_time(self, shift_time): self.task.start() shift_time(minutes=10) self.task.cancel() self.assertEqual(datetime.timedelta(minutes=10), self.task.duration)