def test_optional_mail_GEANNULEERD(self): # check normal signal new_status = StatusFactory.create(_signal=self.signal, state=workflow.GEANNULEERD, send_email=False) self.signal.status = new_status self.signal.save() rules = self._get_mail_rules(['Send mail optional' ])._get_actions(self.signal) self.assertEqual(len(rules), 0) new_status = StatusFactory.create(_signal=self.signal, state=workflow.GEANNULEERD, send_email=True) self.signal.status = new_status self.signal.save() rules = self._get_mail_rules(['Send mail optional' ])._get_actions(self.signal) self.assertEqual(len(rules), 1) # ... not for child signal new_status = StatusFactory.create(_signal=self.child_signal, state=workflow.GEANNULEERD, send_email=True) self.child_signal.status = new_status self.child_signal.save() rules = self._get_mail_rules(['Send mail optional' ])._get_actions(self.child_signal) self.assertEqual(len(rules), 0)
def test_links_in_different_environments(self): """Test that generated feedback links contain the correct host.""" # Prepare signal with status change to `AFGEHANDELD`. StatusFactory.create(_signal=self.signal, state=workflow.BEHANDELING) status = StatusFactory.create(_signal=self.signal, state=workflow.AFGEHANDELD) self.signal.status = status self.signal.save() # Check that generated emails contain the correct links for all # configured environments: env_fe_mapping = getattr(settings, 'FEEDBACK_ENV_FE_MAPPING', feedback_settings.FEEDBACK_ENV_FE_MAPPING) self.assertEqual(len(env_fe_mapping), 3) # sanity check Amsterdam installation has three for environment, fe_location in env_fe_mapping.items(): local_env = {'ENVIRONMENT': environment} with mock.patch.dict('os.environ', local_env): mail.outbox = [] ma = MailActions() ma.apply(signal_id=self.signal.id) self.assertEqual(len(mail.outbox), 1) message = mail.outbox[0] self.assertIn(fe_location, message.body) self.assertIn(fe_location, message.alternatives[0][0]) # we want a history entry when a email was sent self.assertEqual(Note.objects.count(), len(env_fe_mapping))
def test_send_mail_reporter_status_changed_afgehandeld(self): # Prepare signal with status change from `BEHANDELING` to `AFGEHANDELD`. StatusFactory.create(_signal=self.signal, state=workflow.BEHANDELING) status = StatusFactory.create(_signal=self.signal, state=workflow.AFGEHANDELD) self.signal.status = status self.signal.save() # Is the intended rule activated? actions = self._get_mail_rules(['Send mail signal handled' ])._get_actions(self.signal) self.assertEqual(len(actions), 1) # Is it the only one that activates? ma = MailActions(mail_rules=SIGNAL_MAIL_RULES) activated = ma._get_actions(self.signal) self.assertEqual(set(actions), set(activated)) # Check mail contents ma.apply(signal_id=self.signal.id) self.assertEqual(1, Feedback.objects.count()) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, f'Betreft melding: {self.signal.id}') self.assertEqual(mail.outbox[0].to, [ self.signal.reporter.email, ]) # we want a history entry when a email was sent self.assertEqual(Note.objects.count(), 1)
def test_send_mail_reporter_status_changed_afgehandeld_no_email(self): # Prepare signal with status change to `AFGEHANDELD`. StatusFactory.create(_signal=self.signal_no_email, state=workflow.BEHANDELING) status = StatusFactory.create(_signal=self.signal_no_email, state=workflow.AFGEHANDELD) self.signal_no_email.status = status self.signal_no_email.save() self._apply_mail_actions(['Send mail signal handled'], self.signal_no_email) # no mail rule should activate actions = self._get_mail_rules(['Send mail signal handled' ])._get_actions(self.signal_no_email) self.assertEqual(len(actions), 0) # Check mail contents ma = MailActions() ma.apply(signal_id=self.signal_no_email.id) self.assertEqual(0, Feedback.objects.count()) self.assertEqual(len(mail.outbox), 0) # we want no history entry when no email was sent self.assertEqual(Note.objects.count(), 0)
def test_send_mail_reporter_status_changed_afgehandeld_txt_and_html(self): # Prepare signal with status change from `BEHANDELING` to `AFGEHANDELD`. StatusFactory.create(_signal=self.signal, state=workflow.BEHANDELING) status = StatusFactory.create(_signal=self.signal, state=workflow.AFGEHANDELD) self.signal.status = status self.signal.save() # Is the intended rule activated? actions = self._get_mail_rules(['Send mail signal handled' ])._get_actions(self.signal) self.assertEqual(len(actions), 1) # Is it the only one that activates? ma = MailActions(mail_rules=SIGNAL_MAIL_RULES) activated = ma._get_actions(self.signal) self.assertEqual(set(actions), set(activated)) # Check mail contents ma.apply(signal_id=self.signal.id) self.assertEqual(len(mail.outbox), 1) self.assertEqual(1, Feedback.objects.count()) feedback = Feedback.objects.get(_signal__id=self.signal.id) message = mail.outbox[0] self.assertEqual(message.subject, f'Betreft melding: {self.signal.id}') self.assertEqual(message.to, [ self.signal.reporter.email, ]) positive_feedback_url, negative_feedback_url = get_feedback_urls( feedback) context = { 'negative_feedback_url': negative_feedback_url, 'positive_feedback_url': positive_feedback_url, 'signal': self.signal, 'status': status, } txt_message = loader.get_template( 'email/signal_status_changed_afgehandeld.txt').render(context) html_message = loader.get_template( 'email/signal_status_changed_afgehandeld.html').render(context) self.assertEqual(message.body, txt_message) content, mime_type = message.alternatives[0] self.assertEqual(mime_type, 'text/html') self.assertEqual(content, html_message) # we want a history entry when a email was sent self.assertEqual(Note.objects.count(), 1)
def test_send_mail_reporter_status_changed_afgehandeld_no_email(self): # Prepare signal with status change to `AFGEHANDELD`. prev_status = StatusFactory.create(_signal=self.signal, state=workflow.BEHANDELING) status = StatusFactory.create(_signal=self.signal_no_email, state=workflow.AFGEHANDELD) self.signal_no_email.status = status self.signal_no_email.save() num_of_messages = reporter_mail.send_mail_reporter_status_changed_afgehandeld( self.signal_no_email, status, prev_status ) self.assertEqual(0, Feedback.objects.count()) self.assertEqual(num_of_messages, None)
def test_send_mail_reporter_status_changed_afgehandeld(self): # Prepare signal with status change from `BEHANDELING` to `AFGEHANDELD`. prev_status = StatusFactory.create(_signal=self.signal, state=workflow.BEHANDELING) status = StatusFactory.create(_signal=self.signal, state=workflow.AFGEHANDELD) self.signal.status = status self.signal.save() num_of_messages = reporter_mail.send_mail_reporter_status_changed_afgehandeld( self.signal, status, prev_status) self.assertEqual(1, Feedback.objects.count()) self.assertEqual(num_of_messages, 1) self.assertEqual(len(mail.outbox), 1) self.assertEqual(mail.outbox[0].subject, f'Betreft melding: {self.signal.id}') self.assertEqual(mail.outbox[0].to, ['*****@*****.**', ])
def test_send_no_mail_reporter_status_changed_afgehandeld_after_verzoek_tot_heropenen(self): # Prepare signal with status change from `VERZOEK_TOT_HEROPENEN` to `AFGEHANDELD`. prev_status = StatusFactory.create( _signal=self.signal, state=workflow.VERZOEK_TOT_HEROPENEN ) status = StatusFactory.create(_signal=self.signal, state=workflow.AFGEHANDELD) self.signal.status = status self.signal.save() num_of_messages = reporter_mail.send_mail_reporter_status_changed_afgehandeld( self.signal, status, prev_status) self.assertEqual(0, Feedback.objects.count()) self.assertEqual(num_of_messages, None) self.assertEqual(len(mail.outbox), 0)
def test_update_status_handler(self, mocked_tasks): prev_status = self.signal.status new_status = StatusFactory.create(_signal=self.signal) self.signal.status = new_status self.signal.save() update_status.send_robust(sender=self.__class__, signal_obj=self.signal, status=new_status, prev_status=prev_status) mocked_tasks.send_mail_reporter_status_changed_afgehandeld.delay.assert_called_once_with( signal_pk=self.signal.id, status_pk=new_status.id, prev_status_pk=prev_status.pk) mocked_tasks.send_mail_reporter_status_changed_heropend.delay.assert_called_once_with( signal_pk=self.signal.pk, status_pk=new_status.id, prev_status_pk=prev_status.pk) mocked_tasks.send_mail_reporter_status_changed_ingepland.delay.assert_called_once_with( signal_pk=self.signal.pk, status_pk=new_status.id, prev_status_pk=prev_status.pk) mocked_tasks.send_mail_reporter_status_changed_split.delay.assert_called_once_with( signal_pk=self.signal.pk, status_pk=new_status.id, prev_status_pk=prev_status.pk)
def test_links_environment_env_var_not_set(self): """Deals with the case where nothing is overridden and `environment` not set.""" # Prepare signal with status change to `AFGEHANDELD`. status = StatusFactory.create(_signal=self.signal, state=workflow.AFGEHANDELD) self.signal.status = status self.signal.save() # Check that generated emails contain the correct links for all # configured environments: env_fe_mapping = feedback_settings.FEEDBACK_ENV_FE_MAPPING self.assertEqual(len(env_fe_mapping), 1) for environment, fe_location in env_fe_mapping.items(): with mock.patch.dict('os.environ', {}, clear=True): mail.outbox = [] ma = MailActions() ma.apply(signal_id=self.signal.id) self.assertEqual(len(mail.outbox), 1) message = mail.outbox[0] self.assertIn('http://dummy_link', message.body) self.assertIn('http://dummy_link', message.alternatives[0][0]) # we want a history entry when a email was sent self.assertEqual(Note.objects.count(), len(env_fe_mapping))
def test_links_environment_env_var_not_set(self): """Deals with the case where nothing is overridden and `environment` not set.""" # Prepare signal with status change to `AFGEHANDELD`. prev_status = self.signal.status status = StatusFactory.create(_signal=self.signal, state=workflow.AFGEHANDELD) self.signal.status = status self.signal.save() # Check that generated emails contain the correct links for all # configured environments: env_fe_mapping = feedback_settings.FEEDBACK_ENV_FE_MAPPING self.assertEqual(len(env_fe_mapping), 1) for environment, fe_location in env_fe_mapping.items(): with mock.patch.dict('os.environ', {}, clear=True): mail.outbox = [] num_of_messages = reporter_mail.send_mail_reporter_status_changed_afgehandeld( self.signal, status, prev_status ) self.assertEqual(num_of_messages, 1) self.assertEqual(len(mail.outbox), 1) message = mail.outbox[0] self.assertIn('http://dummy_link', message.body) self.assertIn('http://dummy_link', message.alternatives[0][0])
def _create_signals(cls): """ Creates SIGNALS_DISTRIBUTE_DAYS_CNT signals. One per day backwards starting from yesterday current time. Creates SIGNALS_DISTRIBUTE_HOURS_CNT signals every hour backwards from now If today is Friday 16:00, and SIGNALS_DISTRIBUTE_DAYS_CNT and SIGNALS_DISTRIBUTE_HOURS_CNT are both set to 3, we will generate the following signals: - Per day: Thursday (yesterday) 16:00, Wednesday (day before yesterday) 16:00, Tuesday 16:00 - Per hour: Friday 16:00 (now), Friday 15:00 (now minus 1 hour), Friday 14:00 (now minus 2h) """ now = datetime.utcnow() # Generate created/updated times for new signals. times = [now - timedelta(days=idx + 1) for idx in range(cls.SIGNALS_DISTRIBUTE_DAYS_CNT)] + \ [now - timedelta(hours=idx) for idx in range(cls.SIGNALS_DISTRIBUTE_HOURS_CNT)] cls.states = 3 * [BEHANDELING] + 2 * [ON_HOLD] + (len(times) - 3 - 2) * [GEMELD] shuffle(cls.states) cls.sub_categories = [CategoryFactory.create() for _ in range(cls.SUBCATEGORY_CNT)] for idx, time in enumerate(times): with freeze_time(time): signal = SignalFactory.create() StatusFactory(_signal=signal, state=cls.states[idx]) category_assignment = CategoryAssignmentFactory(_signal=signal, category=cls.sub_categories[ idx % len(cls.sub_categories)]) signal.category_assignment = category_assignment signal.save() cls.signals.append(signal)
def test_links_in_different_environments(self): """Test that generated feedback links contain the correct host.""" # Prepare signal with status change to `AFGEHANDELD`. prev_status = self.signal.status status = StatusFactory.create(_signal=self.signal, state=workflow.AFGEHANDELD) self.signal.status = status self.signal.save() # Check that generated emails contain the correct links for all # configured environments: env_fe_mapping = getattr(settings, 'FEEDBACK_ENV_FE_MAPPING', feedback_settings.FEEDBACK_ENV_FE_MAPPING) self.assertEqual(len(env_fe_mapping), 3) # sanity check Amsterdam installation has three for environment, fe_location in env_fe_mapping.items(): local_env = {'ENVIRONMENT': environment} with mock.patch.dict('os.environ', local_env): mail.outbox = [] num_of_messages = reporter_mail.send_mail_reporter_status_changed_afgehandeld( self.signal, status, prev_status ) self.assertEqual(num_of_messages, 1) self.assertEqual(len(mail.outbox), 1) message = mail.outbox[0] self.assertIn(fe_location, message.body) self.assertIn(fe_location, message.alternatives[0][0])
def test_send_mail_reporter_status_changed_split_no_correct_status(self): """No resolution GESPLITST email should be sent if status is not GESPLITST.""" wrong_status = StatusFactory.create(state=workflow.GEMELD) self.parent_signal.status = wrong_status num_of_messages = reporter_mail.send_mail_reporter_status_changed_split( self.parent_signal, self.parent_signal.status) self.assertEqual(num_of_messages, None)
def test_send_mail_reporter_created_only_once(self): signal = SignalFactory.create(reporter__email='*****@*****.**') status = StatusFactory.create(_signal=signal, state=workflow.BEHANDELING) signal.status = status signal.save() status = StatusFactory.create(_signal=signal, state=workflow.GEMELD) signal.status = status signal.save() MailActions().apply(signal_id=signal.id, send_mail=True) self.assertEqual(len(mail.outbox), 0) # we want no history entry when no email was sent self.assertEqual(Note.objects.count(), 0)
def test_send_mail_reporter_status_changed_afgehandeld_txt_and_html(self): mail.outbox = [] # Prepare signal with status change from `BEHANDELING` to `AFGEHANDELD`. prev_status = StatusFactory.create(_signal=self.signal, state=workflow.BEHANDELING) status = StatusFactory.create(_signal=self.signal, state=workflow.AFGEHANDELD) self.signal.status = status self.signal.save() num_of_messages = reporter_mail.send_mail_reporter_status_changed_afgehandeld( self.signal, status, prev_status) self.assertEqual(1, Feedback.objects.count()) feedback = Feedback.objects.get(_signal__id=self.signal.id) self.assertEqual(num_of_messages, 1) self.assertEqual(len(mail.outbox), 1) message = mail.outbox[0] self.assertEqual(message.subject, f'Betreft melding: {self.signal.id}') self.assertEqual(message.to, [ '*****@*****.**', ]) positive_feedback_url, negative_feedback_url = get_feedback_urls( feedback) context = { 'negative_feedback_url': negative_feedback_url, 'positive_feedback_url': positive_feedback_url, 'signal': self.signal, 'status': status, } txt_message = reporter_mail._create_message( 'email/signal_status_changed_afgehandeld.txt', context=context) html_message = reporter_mail._create_message( 'email/signal_status_changed_afgehandeld.html', context=context) self.assertEqual(message.body, txt_message) content, mime_type = message.alternatives[0] self.assertEqual(mime_type, 'text/html') self.assertEqual(content, html_message)
def test_triggered_on_update_status(self, patched_actions): prev_status = self.signal.status new_status = StatusFactory.create(_signal=self.signal, state=workflow.BEHANDELING) self.signal.status = new_status self.signal.save() update_status.send_robust(sender=self.__class__, signal_obj=self.signal, status=new_status, prev_status=prev_status)
def test_send_optional_mail_GEANNULEERD(self, patched_send_mail): signal = self.signal new_status = StatusFactory.create(_signal=signal, state=workflow.GEANNULEERD, send_email=True) signal.status = new_status signal.save() self._get_mail_rules(['Send mail optional']).apply(signal_id=signal.pk, send_mail=True) patched_send_mail.assert_called_once() self.assertEqual(Note.objects.count(), 1)
def test_send_mail_reporter_status_changed_afgehandeld_no_status_afgehandeld(self): # Note: SignalFactory always creates a signal with GEMELD status. prev_status = self.signal.status status = StatusFactory.create(_signal=self.signal, state=workflow.BEHANDELING) self.signal.status = status self.signal.save() num_of_messages = reporter_mail.send_mail_reporter_status_changed_afgehandeld( signal=self.signal, status=self.signal.status, prev_status=prev_status ) self.assertEqual(0, Feedback.objects.count()) self.assertEqual(num_of_messages, None)
def test_send_no_mail_reporter_status_changed_afgehandeld_after_verzoek_tot_heropenen( self): # Prepare signal with status change from `VERZOEK_TOT_HEROPENEN` to `AFGEHANDELD`, # this should not lead to an email being sent. StatusFactory.create(_signal=self.signal, state=workflow.VERZOEK_TOT_HEROPENEN) status = StatusFactory.create(_signal=self.signal, state=workflow.AFGEHANDELD) self.signal.status = status self.signal.save() # no mail rule should activate ma = MailActions(mail_rules=SIGNAL_MAIL_RULES) activated = ma._get_actions(self.signal) self.assertEqual(len(activated), 0) # Check mail contents ma.apply(signal_id=self.signal.id) self.assertEqual(0, Feedback.objects.count()) self.assertEqual(len(mail.outbox), 0) # we want no history entry when no email was sent self.assertEqual(Note.objects.count(), 0)
def test_status_update_handler_object_does_not_exist(self): signal = SignalFactory.create() prev_status = signal.status new_status = StatusFactory.create(_signal=signal) signal.status = new_status signal.save() update_status.send_robust( sender=self.__class__, signal_obj=signal, status=new_status, prev_status=prev_status, )
def test_status_update_handler(self, mocked_tasks): signal = SignalFactory.create() prev_status = signal.status new_status = StatusFactory.create(_signal=signal) signal.status = new_status signal.save() update_status.send_robust( sender=self.__class__, signal_obj=signal, status=new_status, prev_status=prev_status, ) mocked_tasks.push_to_sigmax.delay.assert_called_once_with(pk=signal.id)
def test_send_mail_reporter_status_changed_afgehandeld_no_status_afgehandeld( self): # Note: SignalFactory always creates a signal with GEMELD status. # TODO: test is redundant, remove status = StatusFactory.create(_signal=self.signal, state=workflow.BEHANDELING) self.signal.status = status self.signal.save() # no mail rule should activate ma = MailActions(mail_rules=SIGNAL_MAIL_RULES) activated = ma._get_actions(self.signal) self.assertEqual(len(activated), 0) # Check mail contents ma.apply(signal_id=self.signal.id) self.assertEqual(0, Feedback.objects.count()) self.assertEqual(len(mail.outbox), 0) # we want no history entry when no email was sent self.assertEqual(Note.objects.count(), 0)
def setUp(self): self.signal = SignalFactory.create() self.prev_status = self.signal.status self.signal.status = StatusFactory(_signal=self.signal, state=workflow.BEHANDELING) self.signal.save()