# -*- coding: utf-8 -*- from __future__ import unicode_literals import datetime from django.apps import apps from django.contrib.auth import get_user_model from django.core import mail as django_mail from django.test import TestCase from dav_base.tests.generic import EmailTestMixin from ..models.oneclickaction import OneClickAction from .generic import RoleMixin, EventMixin TEST_EVENT_DATA = { 'title': 'Täst', 'description': 'Teßt', 'mode': 'joint', 'sport': 'W', 'level': 'beginner', 'first_day': datetime.date(2019, 3, 1), 'country': 'DE', 'trainer_firstname': 'Übungsleiter', 'trainer_familyname': 'Weißalles', 'trainer_email': 'trainer@localhost', } EVENT_UPDATED_EMAIL_TEMPLATE = """Hallo {recipient_first_name}, {editor_full_name} hat die folgende Veranstaltung geändert: {event} Link zur Veranstaltung: {base_url}{event_url} Ausschreibung: ============== W**/19 - Täst Freitag, 01. März 2019 -Teßt +Teßt Gößweinstein Leitung: Übungsleiter Weißalles (trainer@localhost) Nichtöffentliche Daten: ======================= Veranstaltungsart: gemeinschaftliche Tour Schwierigkeitsnivau: Anfänger Gelände: Kletterhalle Anmeldung: Nicht erforderlich Anreise des Kurs-/Tourenleiters am Vortag: Nein Veröffentlichung: sofort """ EVENT_SUBMITTED_EMAIL_TEMPLATE = """Hallo {recipient_first_name}, eine Veranstaltung wurde in deinem Namen eingereicht. Die entsprechenden Referenten wurden informiert, um deine Veranstaltung frei zu geben. Link zur Veranstaltung: {base_url}{event_url} Voraussichtliche Veröffentlichung: In wenigen Tagen Ausschreibung: ============== {event_text}""" EVENT_TO_ACCEPT_EMAIL_TEMPLATE = """Hallo {recipient_first_name}, {trainer_firstname} {trainer_familyname} hat eine Veranstaltung eingereicht. Der folgende Link führt zur Veranstaltung: {base_url}{event_url} Über den folgenden Link kannst du die Veranstaltung unmittelbar freigeben: {base_url}{accept_url} Veröffentlichung: sofort Ausschreibung: ============== {event_text}""" EVENT_ACCEPTED_EMAIL_TEMPLATE=u"""Hallo {recipient_first_name}, deine Veranstaltung wurde von {editor_full_name} freigegeben. Die Redaktion wurde informiert, um deine Veranstaltung zu veröffentlichen. Link zur Veranstaltung: {base_url}{event_url} Voraussichtliche Veröffentlichung: {planned_publication_date} Ausschreibung: ============== {event_text} Bearbeitungshinweis: ==================== {internal_note}""" EVENT_TO_PUBLISH_WEB_EMAIL_TEMPLATE = """Hallo {recipient_first_name}, {trainer_firstname} {trainer_familyname} hat eine neue Veranstaltung eingereicht. Die Veranstaltung wurde von {editor_full_name} zur Veröffentlichung auf der Webseite frei gegeben. Der folgende Link führt zur Veranstaltung: {base_url}{event_url} Über den folgenden Link kannst du die Veröffentlichung auf der Webseite unmittelbar bestätigen: {base_url}{confirm_publication_url} Veröffentlichung: ({planned_publication_date}) ================= Veröffentlichung starten: {planned_publication_date_short} 00:00:00 Veröffentlichung beenden: {day_after_short} 00:00:00 Erstellungsdatum: {first_day_short} 00:00:00 Titel: {number} - {title} Bearbeitungshinweis: ==================== {internal_note} Joomla HTML ===========
{description}
Leitung: {trainer_firstname} {trainer_familyname} (trainer@localhost)
""" EVENT_TO_PUBLISH_FACEBOOK_EMAIL_TEMPLATE = """Hallo {recipient_first_name}, {trainer_firstname} {trainer_familyname} hat eine neue Veranstaltung eingereicht. Die Veranstaltung wurde von {editor_full_name} zur Veröffentlichung auf Facebook frei gegeben. Der folgende Link führt zur Veranstaltung: {base_url}{event_url} Über den folgenden Link kannst du die Veröffentlichung auf Facebook unmittelbar bestätigen: {base_url}{confirm_publication_url} Veröffentlichung: (sofort) ================= Veröffentlichung starten: -- Veröffentlichung beenden: {day_after_short} 00:00:00 Erstellungsdatum: {first_day_short} 00:00:00 Titel: {number} {title} Ausschreibung: ============== {number} {title} {normalized_long_date} {description} Leitung: {trainer_firstname} {trainer_familyname} (trainer@localhost) """ class EmailTestCase(EmailTestMixin, RoleMixin, EventMixin, TestCase): def setUp(self): super(EmailTestCase, self).setUp() app_config = apps.get_containing_app_config(__package__) app_config.settings.enable_email_on_update = False app_config.settings.enable_email_on_status_update = False self.app_settings = app_config.settings event_data = TEST_EVENT_DATA self.event = self.create_event_by_model(event_data) self.trainer = self.event.owner self.manager_super = self.create_user_for_role('manager_super', 'password', 'Touren', 'Referent') self.manager_w = self.create_user_for_role('manager_w', 'password', 'Bereichsleiter', 'Wandern') self.manager_s = self.create_user_for_role('manager_s', 'password', 'Bereichsleiter', 'Ski') self.publisher_web = self.create_user_for_role('publisher_web', 'password', 'Joomla', 'Redakteur') self.publisher_facebook = self.create_user_for_role('publisher_facebook', 'password', 'Facebook', 'Redakteur') model = get_user_model() self.recipient = model.objects.create_user(username='recipient@example.com', email='recipient@example.com', password='mellon12', first_name='Re Ö.', last_name='Cipient', ) self.editor = model.objects.create_user(username='editor@example.com', email='editor@example.com', password='mellon12', first_name='Ed Ü.', last_name='Itor', ) def test_disabled_mail(self): self.event.workflow.update_status('submitted', self.trainer) self.event.description += ' Gößweinstein' self.event.save() self.event.workflow.update_status('accepted', self.editor) self.event.first_day += datetime.timedelta(1) self.event.save() self.assertEqual(len(django_mail.outbox), 0) def test_event_updated_mail(self): expected_recipient = self.manager_super editor = self.trainer self.app_settings.enable_email_on_update = True self.event.workflow.update_status('submitted', self.trainer) self.event.description += ' Gößweinstein' self.event.save() self.assertEqual(len(django_mail.outbox), 2) mail = django_mail.outbox[0] self.assertSender(mail) self.assertRecipients(mail, [expected_recipient]) self.assertSubject(mail, 'Veranstaltung geändert') expected_body = EVENT_UPDATED_EMAIL_TEMPLATE.format( recipient_first_name=expected_recipient.first_name, editor_full_name=editor.get_full_name(), event=self.event, base_url=self.email_base_url, event_url=self.event.get_absolute_url(), ) self.assertBody(mail, expected_body) def test_event_submitted_mail(self): expected_recipient = self.trainer self.app_settings.enable_email_on_status_update = True self.event.workflow.update_status('submitted', self.trainer) self.assertEqual(len(django_mail.outbox), 3) mail = django_mail.outbox[0] self.assertSender(mail) self.assertRecipients(mail, [expected_recipient]) self.assertSubject(mail, 'Veranstaltung eingereicht') expected_body = EVENT_SUBMITTED_EMAIL_TEMPLATE.format( recipient_first_name=expected_recipient.first_name, base_url=self.email_base_url, event_url=self.event.get_absolute_url(), event_text=self.event.render_as_text(), ) self.assertBody(mail, expected_body) def test_event_to_accept_mail(self): expected_recipient = self.manager_super self.app_settings.enable_email_on_status_update = True self.event.workflow.update_status('submitted', self.trainer) self.assertEqual(len(django_mail.outbox), 3) mail = django_mail.outbox[1] self.assertSender(mail) self.assertRecipients(mail, [expected_recipient]) self.assertSubject(mail, 'Veranstaltung freigeben') action_parameters = '{},{},{}'.format(self.event.id, 'accepted', expected_recipient.id) action = OneClickAction.objects.get(parameters=action_parameters) expected_body = EVENT_TO_ACCEPT_EMAIL_TEMPLATE.format( recipient_first_name=expected_recipient.first_name, trainer_firstname=self.event.trainer_firstname, trainer_familyname=self.event.trainer_familyname, base_url=self.email_base_url, event_url=self.event.get_absolute_url(), accept_url=action.get_absolute_url(), event_text=self.event.render_as_text(), ) self.assertBody(mail, expected_body) def test_accepted_mail(self): expected_recipient = self.trainer editor = self.manager_w self.event.workflow.update_status('submitted', self.trainer) self.event.internal_note = 'Automatischer Software Test.' self.event.planned_publication_date = datetime.date(2019, 3, 24) ppd_string = 'Sonntag, 24. März 2019' self.event.save() self.app_settings.enable_email_on_status_update = True self.event.workflow.update_status('accepted', editor) self.assertEqual(len(django_mail.outbox), 3) mail = django_mail.outbox[0] self.assertSender(mail) self.assertRecipients(mail, [expected_recipient]) self.assertSubject(mail, '{}: Veranstaltung freigegeben'.format(self.event.number)) expected_body = EVENT_ACCEPTED_EMAIL_TEMPLATE.format( recipient_first_name=expected_recipient.first_name, editor_full_name=editor.get_full_name(), base_url=self.email_base_url, event_url=self.event.get_absolute_url(), planned_publication_date=ppd_string, event_text=self.event.render_as_text(), internal_note=self.event.internal_note, ) self.assertBody(mail, expected_body) def test_event_to_publish_web_mail(self): expected_recipient = self.publisher_web editor = self.manager_w self.event.workflow.update_status('submitted', self.trainer) self.event.internal_note = 'Automatischer Software Test.' self.event.planned_publication_date = datetime.date(2019, 3, 24) ppd_string = 'Sonntag, 24. März 2019' self.event.save() self.app_settings.enable_email_on_status_update = True self.event.workflow.update_status('accepted', editor) self.assertEqual(len(django_mail.outbox), 3) mail = django_mail.outbox[1] self.assertSender(mail) self.assertRecipients(mail, [expected_recipient]) self.assertSubject(mail, '{}: Veranstaltung veröffentlichen'.format(self.event.number)) action_parameters = '{},{},{}'.format(self.event.id, 'publishing_web', expected_recipient.id) action = OneClickAction.objects.get(parameters=action_parameters) expected_body = EVENT_TO_PUBLISH_WEB_EMAIL_TEMPLATE.format( recipient_first_name=expected_recipient.first_name, trainer_firstname=self.event.trainer_firstname, trainer_familyname=self.event.trainer_familyname, editor_full_name=editor.get_full_name(), base_url=self.email_base_url, event_url=self.event.get_absolute_url(), confirm_publication_url=action.get_absolute_url(), planned_publication_date=ppd_string, internal_note=self.event.internal_note, number=self.event.number, title=self.event.title, description=self.event.description, planned_publication_date_short=self.event.planned_publication_date.strftime('%d.%m.%Y'), first_day_short=self.event.first_day.strftime('%d.%m.%Y'), day_after_short=(self.event.first_day + datetime.timedelta(1)).strftime('%d.%m.%Y'), normalized_long_date=self.event.get_formated_date(format='normalized_long'), ) self.assertBody(mail, expected_body) def test_event_to_publish_facebook_mail(self): expected_recipient = self.publisher_facebook editor = self.manager_super self.event.workflow.update_status('submitted', self.trainer) self.app_settings.enable_email_on_status_update = True self.event.workflow.update_status('accepted', editor) self.assertEqual(len(django_mail.outbox), 3) mail = django_mail.outbox[2] self.assertSender(mail) self.assertRecipients(mail, [expected_recipient]) self.assertSubject(mail, '{}: Veranstaltung veröffentlichen'.format(self.event.number)) action_parameters = '{},{},{}'.format(self.event.id, 'publishing_facebook', expected_recipient.id) action = OneClickAction.objects.get(parameters=action_parameters) expected_body = EVENT_TO_PUBLISH_FACEBOOK_EMAIL_TEMPLATE.format( recipient_first_name=expected_recipient.first_name, trainer_firstname=self.event.trainer_firstname, trainer_familyname=self.event.trainer_familyname, editor_full_name=editor.get_full_name(), base_url=self.email_base_url, event_url=self.event.get_absolute_url(), confirm_publication_url=action.get_absolute_url(), number=self.event.number, title=self.event.title, description=self.event.description, first_day_short=self.event.first_day.strftime('%d.%m.%Y'), day_after_short=(self.event.first_day + datetime.timedelta(1)).strftime('%d.%m.%Y'), normalized_long_date=self.event.get_formated_date(format='normalized_long'), ) self.assertBody(mail, expected_body)