def test_unexpired_notification_merge(self): """Test that when there are multiple pending notifications, with at least one within the notification delay, that other notifications are held""" patches = create_patches(2, project=self.project) for patch in patches: patch.save() PatchChangeNotification(patch=patch, orig_state=patch.state).save() state = create_state() self.assertEqual(PatchChangeNotification.objects.count(), len(patches)) self._expire_notifications() # update one notification, to bring it out of the notification delay patches[0].state = state patches[0].save() # the updated notification should prevent the other from being sent errors = send_notifications() self.assertEqual(errors, []) self.assertEqual(len(mail.outbox), 0) # expire the updated notification self._expire_notifications() errors = send_notifications() self.assertEqual(errors, []) self.assertEqual(len(mail.outbox), 1) msg = mail.outbox[0] for patch in patches: self.assertIn(patch.get_absolute_url(), msg.body)
def handle(self, *args, **kwargs): errors = send_notifications() for (recipient, error) in errors: self.stderr.write("Failed sending to %s: %s" % (recipient.email, error)) expire_notifications()
def test_no_ready_notifications(self): """We shouldn't see immediate notifications.""" patch = create_patch(project=self.project) PatchChangeNotification(patch=patch, orig_state=patch.state).save() errors = send_notifications() self.assertEqual(errors, []) self.assertEqual(len(mail.outbox), 0)
def test_notification_optout(self): """Ensure opt-out addresses don't get notifications.""" patch = create_patch(project=self.project) PatchChangeNotification(patch=patch, orig_state=patch.state).save() self._expire_notifications() EmailOptout(email=patch.submitter.email).save() errors = send_notifications() self.assertEqual(errors, []) self.assertEqual(len(mail.outbox), 0)
def test_notifications(self): patch = create_patch(project=self.project) PatchChangeNotification(patch=patch, orig_state=patch.state).save() self._expire_notifications() errors = send_notifications() self.assertEqual(errors, []) self.assertEqual(len(mail.outbox), 1) msg = mail.outbox[0] self.assertEqual(msg.to, [patch.submitter.email]) self.assertIn(patch.get_absolute_url(), msg.body)
def test_notification_escaping(self): patch = create_patch(name='Patch name with " character', project=self.project) PatchChangeNotification(patch=patch, orig_state=patch.state).save() self._expire_notifications() errors = send_notifications() self.assertEqual(errors, []) self.assertEqual(len(mail.outbox), 1) msg = mail.outbox[0] self.assertEqual(msg.to, [patch.submitter.email]) self.assertNotIn(""", msg.body)
def test_notification_escaping(self): patch = create_patch(name='Patch name with " character', project=self.project) PatchChangeNotification(patch=patch, orig_state=patch.state).save() self._expire_notifications() errors = send_notifications() self.assertEqual(errors, []) self.assertEqual(len(mail.outbox), 1) msg = mail.outbox[0] self.assertEqual(msg.to, [patch.submitter.email]) self.assertNotIn('"', msg.body)
def test_notification_merge(self): """Ensure only one summary email is delivered to each user.""" patches = create_patches(2, project=self.project) for patch in patches: PatchChangeNotification(patch=patch, orig_state=patch.state).save() self.assertEqual(PatchChangeNotification.objects.count(), len(patches)) self._expire_notifications() errors = send_notifications() self.assertEqual(errors, []) self.assertEqual(len(mail.outbox), 1) msg = mail.outbox[0] for patch in patches: self.assertIn(patch.get_absolute_url(), msg.body)
def test_no_notifications(self): self.assertEqual(send_notifications(), [])