Files
django-dav-events/dav_events/tests/test_emails.py
heinzel 37519d59e5
All checks were successful
buildbot/tox Build done.
Merged migrations and minor improvements
2020-11-03 11:18:48 +01:00

384 lines
14 KiB
Python

# -*- 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
===========
<h6>{normalized_long_date}</h6>
<p>{description}</p>
<hr id="system-readmore" />
<p>
<strong>Leitung:</strong> {trainer_firstname} {trainer_familyname} (<a href="mailto:trainer@localhost">trainer@localhost</a>)
</p>
"""
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)