def test_do_forums_digests_already_scheduled(self): # patch _time_slice # patch get_digest_subscribers dt1 = datetime.datetime.utcnow() dt2 = dt1 + datetime.timedelta(days=1) dt3 = dt2 + datetime.timedelta(days=1) # Scheduling the task for the first time sends the digests: with nested( patch('notifier.tasks.get_digest_subscribers', return_value=(usern(n) for n in range(10))), patch('notifier.tasks._time_slice', return_value=(dt1, dt2)), patch('notifier.tasks.generate_and_send_digests') ) as (_gs, _ts, t): task_result = do_forums_digests.delay() self.assertTrue(task_result.successful()) self.assertEqual(t.delay.call_count, 1) # Scheduling the task with the same time slice again does nothing: with nested( patch('notifier.tasks.get_digest_subscribers', return_value=(usern(n) for n in range(10))), patch('notifier.tasks._time_slice', return_value=(dt1, dt2)), patch('notifier.tasks.generate_and_send_digests') ) as (_gs, _ts, t): task_result = do_forums_digests.delay() self.assertTrue(task_result.successful()) self.assertEqual(t.delay.call_count, 0) # Scheduling the task with a different time slice sends the digests: with nested( patch('notifier.tasks.get_digest_subscribers', return_value=(usern(n) for n in range(10))), patch('notifier.tasks._time_slice', return_value=(dt2, dt3)), patch('notifier.tasks.generate_and_send_digests') ) as (_gs, _ts, t): task_result = do_forums_digests.delay() self.assertTrue(task_result.successful()) self.assertEqual(t.delay.call_count, 1)
def test_do_forums_digests_creates_database_entry(self): # Create some ForumDigestTask objects. now = datetime.datetime.utcnow() # Populate the database with four ForumDigestTask objects (1, 2, 7, and 10 days old). for days in [1, 2, 7, 10]: dt = now - datetime.timedelta(days=days) from_dt = dt - datetime.timedelta(days=1) task = ForumDigestTask.objects.create(from_dt=from_dt, to_dt=dt, node='some-node') # Bypass field's auto_now_add by forcing the update via query manager. ForumDigestTask.objects.filter(pk=task.pk).update(created=dt) with nested( patch('notifier.tasks.get_digest_subscribers', return_value=(usern(n) for n in xrange(11))), patch('notifier.tasks.generate_and_send_digests'), ) as (p, t): # Two of the tasks that we created above are older than 5 days. five_days_ago = now - datetime.timedelta(days=5) self.assertEqual( ForumDigestTask.objects.filter( created__lt=five_days_ago).count(), 2) task_result = do_forums_digests.delay() self.assertTrue(task_result.successful()) # The two tasks that are older than 5 days should be removed. self.assertEqual( ForumDigestTask.objects.filter( created__lt=five_days_ago).count(), 0)
def test_do_forums_digests(self): # patch _time_slice # patch get_digest_subscribers dt1 = datetime.datetime.utcnow() dt2 = dt1 + datetime.timedelta(days=1) with patch('notifier.tasks.get_digest_subscribers', return_value=(usern(n) for n in range(11))) as p, \ patch('notifier.tasks.generate_and_send_digests') as t, \ patch('notifier.tasks._time_slice', return_value=(dt1, dt2)) as ts: task_result = do_forums_digests.delay() self.assertTrue(task_result.successful()) self.assertEqual(t.delay.call_count, 2) t.delay.assert_called_with([usern(10)], dt1, dt2, language=settings.LANGUAGE_CODE)
def test_do_forums_digests_user_api_unavailable(self): # patch _time_slice # patch get_digest_subscribers dt1 = datetime.datetime.utcnow() dt2 = dt1 + datetime.timedelta(days=1) with patch('notifier.tasks.get_digest_subscribers', side_effect=UserServiceException("could not connect!")) as p, \ patch('notifier.tasks.generate_and_send_digests') as t: try: task_result = do_forums_digests.delay() except UserServiceException as e: self.assertEqual(p.call_count, settings.DAILY_TASK_MAX_RETRIES + 1) self.assertEqual(t.call_count, 0) else: # should have raised self.fail("task did not give up after exactly 3 attempts")
def test_do_forums_digests_creates_database_entry(self): # patch _time_slice # patch get_digest_subscribers dt1 = datetime.datetime.utcnow() dt2 = dt1 + datetime.timedelta(days=1) with patch('notifier.tasks.get_digest_subscribers', return_value=(usern(n) for n in range(11))) as p, \ patch('notifier.tasks.generate_and_send_digests') as t, \ patch('notifier.tasks._time_slice', return_value=(dt1, dt2)) as ts: self.assertEqual(ForumDigestTask.objects.count(), 0) task_result = do_forums_digests.delay() self.assertTrue(task_result.successful()) self.assertEqual(ForumDigestTask.objects.count(), 1) model = ForumDigestTask.objects.all()[0] self.assertEqual(model.from_dt, dt1) self.assertEqual(model.to_dt, dt2) self.assertEqual(model.node, platform.node())
def digest_job(): do_forums_digests.delay()