UPD: dav_registration: added tests.
This commit is contained in:
@@ -57,6 +57,13 @@ class EmailTestMixin(object):
|
|||||||
def assertSender(self, mail):
|
def assertSender(self, mail):
|
||||||
self.assertEqual(mail.from_email, self.email_sender)
|
self.assertEqual(mail.from_email, self.email_sender)
|
||||||
|
|
||||||
|
def assertReplyTo(self, mail, addresses):
|
||||||
|
self.assertEqual(len(mail.reply_to), len(addresses))
|
||||||
|
for expected_address in addresses:
|
||||||
|
if isinstance(expected_address, AbstractUser):
|
||||||
|
expected_address = u'"%s" <%s>' % (expected_address.get_full_name(), expected_address.email)
|
||||||
|
self.assertIn(expected_address, mail.reply_to)
|
||||||
|
|
||||||
def assertRecipients(self, mail, recipients):
|
def assertRecipients(self, mail, recipients):
|
||||||
self.assertEqual(len(mail.recipients()), len(recipients))
|
self.assertEqual(len(mail.recipients()), len(recipients))
|
||||||
for expected_recipient in recipients:
|
for expected_recipient in recipients:
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
import datetime
|
||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.contrib.auth.models import Group
|
from django.contrib.auth.models import Group
|
||||||
@@ -31,7 +32,21 @@ class EventMixin(object):
|
|||||||
def get_status_label(self, status_code):
|
def get_status_label(self, status_code):
|
||||||
return EventStatus.objects.get(code=status_code).label
|
return EventStatus.objects.get(code=status_code).label
|
||||||
|
|
||||||
def create_event(self, data):
|
def create_event(self, data=None):
|
||||||
|
if data is None:
|
||||||
|
data = {
|
||||||
|
'title': 'Daytrip',
|
||||||
|
'description': 'Testevent',
|
||||||
|
'mode': 'joint',
|
||||||
|
'sport': 'W',
|
||||||
|
'level': 'beginner',
|
||||||
|
'first_day': datetime.date.today(),
|
||||||
|
'country': 'DE',
|
||||||
|
'trainer_firstname': 'Trainer',
|
||||||
|
'trainer_familyname': 'One',
|
||||||
|
'trainer_email': 'trainer@localhost',
|
||||||
|
}
|
||||||
|
|
||||||
event = Event(**data)
|
event = Event(**data)
|
||||||
event.save()
|
event.save()
|
||||||
return event
|
return event
|
||||||
@@ -40,6 +55,14 @@ class EventMixin(object):
|
|||||||
event.workflow.update_status('submitted', event.owner)
|
event.workflow.update_status('submitted', event.owner)
|
||||||
return event
|
return event
|
||||||
|
|
||||||
def accept_event(self, event, user):
|
def accept_event(self, event, user=None):
|
||||||
|
if user is None:
|
||||||
|
user = event.owner
|
||||||
event.workflow.update_status('accepted', user)
|
event.workflow.update_status('accepted', user)
|
||||||
return event
|
return event
|
||||||
|
|
||||||
|
def confirm_publication_event(self, event, user=None):
|
||||||
|
if user is None:
|
||||||
|
user = event.owner
|
||||||
|
event.workflow.update_status('published', user)
|
||||||
|
return event
|
||||||
|
|||||||
0
dav_registration/tests/__init__.py
Normal file
0
dav_registration/tests/__init__.py
Normal file
8
dav_registration/tests/generic.py
Normal file
8
dav_registration/tests/generic.py
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
from ..models import Registration
|
||||||
|
|
||||||
|
|
||||||
|
class RegistrationMixin(object):
|
||||||
|
def create_registration(self, data):
|
||||||
|
r = Registration(**data)
|
||||||
|
r.save()
|
||||||
|
return r
|
||||||
12
dav_registration/tests/test_apps.py
Normal file
12
dav_registration/tests/test_apps.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
from django.apps import apps
|
||||||
|
from six import string_types
|
||||||
|
|
||||||
|
from dav_base.tests.generic import AppSetting, AppsTestCase
|
||||||
|
|
||||||
|
|
||||||
|
class TestCase(AppsTestCase):
|
||||||
|
app_config = apps.get_app_config('dav_registration')
|
||||||
|
|
||||||
|
settings = (
|
||||||
|
AppSetting('privacy_policy', string_types),
|
||||||
|
)
|
||||||
172
dav_registration/tests/test_emails.py
Normal file
172
dav_registration/tests/test_emails.py
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
from babel.dates import format_datetime
|
||||||
|
from django.apps import apps
|
||||||
|
from django.core import mail as django_mail
|
||||||
|
from django.test import TestCase
|
||||||
|
from django.utils.translation import get_language
|
||||||
|
|
||||||
|
from dav_base.tests.generic import EmailTestMixin
|
||||||
|
from dav_events.tests.generic import EventMixin
|
||||||
|
|
||||||
|
from .generic import RegistrationMixin
|
||||||
|
|
||||||
|
MAIL_SELF_TEMPLATE = """Hallo {participant_full_name},
|
||||||
|
|
||||||
|
wir haben deine Anmeldung zur Veranstaltung
|
||||||
|
{event_number} - {event_title}
|
||||||
|
an den/die Tourenleiter/in {trainer_full_name} weitergegeben.
|
||||||
|
{trainer_first_name} wird sich bei dir melden und dir mitteilen,
|
||||||
|
ob du teilnehmen kannst oder nicht.
|
||||||
|
|
||||||
|
========================================================================
|
||||||
|
Veranstaltung: {event_number} - {event_title}
|
||||||
|
Datum: {event_formated_date}
|
||||||
|
Tourenleitung: {trainer_full_name}
|
||||||
|
Anmeldezeitpunkt: {registration_at}
|
||||||
|
Referenz-Nr: {registration_id}
|
||||||
|
|
||||||
|
Personendaten
|
||||||
|
-------------
|
||||||
|
{participant_full_name}
|
||||||
|
|
||||||
|
|
||||||
|
Telefon:
|
||||||
|
E-Mail: {participant_email}
|
||||||
|
DAV Mitgliedsnummer:
|
||||||
|
|
||||||
|
Notfall-Kontakt
|
||||||
|
---------------
|
||||||
|
-
|
||||||
|
|
||||||
|
Erfahrung
|
||||||
|
---------
|
||||||
|
-
|
||||||
|
|
||||||
|
Anmerkung
|
||||||
|
---------
|
||||||
|
-
|
||||||
|
|
||||||
|
Erklärung zur Datenspeicherung
|
||||||
|
------------------------------
|
||||||
|
-
|
||||||
|
Zeitpunkt der Datenlöschung: {purge_at}
|
||||||
|
"""
|
||||||
|
|
||||||
|
MAIL_TRAINER_TEMPLATE = """Hallo {trainer_first_name},
|
||||||
|
|
||||||
|
Anmeldung zu deiner Veranstaltung
|
||||||
|
{event_number} - {event_title}
|
||||||
|
========================================================================
|
||||||
|
Anmeldezeitpunkt: {registration_at}
|
||||||
|
Referenz-Nr: {registration_id}
|
||||||
|
|
||||||
|
Teilnehmer*in:
|
||||||
|
{participant_full_name}
|
||||||
|
,
|
||||||
|
|
||||||
|
{participant_email}
|
||||||
|
|
||||||
|
|
||||||
|
Notfall-Kontakt:
|
||||||
|
-
|
||||||
|
|
||||||
|
Erfahrung:
|
||||||
|
-
|
||||||
|
|
||||||
|
Anmerkung:
|
||||||
|
-
|
||||||
|
|
||||||
|
------------------------------
|
||||||
|
Erklärung zur Datenspeicherung
|
||||||
|
------------------------------
|
||||||
|
-
|
||||||
|
Zeitpunkt der Datenlöschung: {purge_at}
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class EmailsTestCase(EmailTestMixin, EventMixin, RegistrationMixin, TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
super(EmailsTestCase, self).setUp()
|
||||||
|
|
||||||
|
app_config = apps.get_app_config('dav_events')
|
||||||
|
app_config.settings.enable_email_on_status_update = False
|
||||||
|
|
||||||
|
self.event = self.create_event()
|
||||||
|
self.submit_event(self.event)
|
||||||
|
self.accept_event(self.event)
|
||||||
|
self.confirm_publication_event(self.event)
|
||||||
|
|
||||||
|
def test_email_self(self):
|
||||||
|
event = self.event
|
||||||
|
trainer = event.owner
|
||||||
|
registration_data = {
|
||||||
|
'event': event,
|
||||||
|
'personal_names': 'Participant',
|
||||||
|
'family_names': 'One',
|
||||||
|
'email_address': 'participant@localhost',
|
||||||
|
}
|
||||||
|
registration = self.create_registration(registration_data)
|
||||||
|
|
||||||
|
recipient = '"{full_name}" <{email}>'.format(full_name=registration.get_full_name(),
|
||||||
|
email=registration.email_address)
|
||||||
|
reply_to = '"{full_name}" <{email}>'.format(full_name=trainer.get_full_name(),
|
||||||
|
email=trainer.email)
|
||||||
|
|
||||||
|
mail = django_mail.outbox[1]
|
||||||
|
self.assertRecipients(mail, [recipient])
|
||||||
|
self.assertReplyTo(mail, [reply_to])
|
||||||
|
subject = '{number}: Deine Anmeldung'.format(number=event.get_number())
|
||||||
|
self.assertSubject(mail, subject)
|
||||||
|
|
||||||
|
locale = get_language()[0:2]
|
||||||
|
body = MAIL_SELF_TEMPLATE.format(
|
||||||
|
participant_full_name=registration.get_full_name(),
|
||||||
|
participant_email=registration.email_address,
|
||||||
|
event_number=event.get_number(),
|
||||||
|
event_title=event.title,
|
||||||
|
event_formated_date=event.get_formated_date(),
|
||||||
|
trainer_full_name=trainer.get_full_name(),
|
||||||
|
trainer_first_name=trainer.first_name,
|
||||||
|
registration_id=registration.id,
|
||||||
|
registration_at=format_datetime(registration.created_at, 'EEEE, dd. MMMM yyyy, HH:mm', locale=locale),
|
||||||
|
purge_at=format_datetime(registration.purge_at, 'EEEE, dd. MMMM yyyy', locale=locale),
|
||||||
|
)
|
||||||
|
self.assertBody(mail, body)
|
||||||
|
|
||||||
|
def test_email_trainer(self):
|
||||||
|
event = self.event
|
||||||
|
trainer = event.owner
|
||||||
|
registration_data = {
|
||||||
|
'event': event,
|
||||||
|
'personal_names': 'Participant',
|
||||||
|
'family_names': 'One',
|
||||||
|
'email_address': 'participant@localhost',
|
||||||
|
}
|
||||||
|
registration = self.create_registration(registration_data)
|
||||||
|
|
||||||
|
reply_to = '"{full_name}" <{email}>'.format(full_name=registration.get_full_name(),
|
||||||
|
email=registration.email_address)
|
||||||
|
recipient = '"{full_name}" <{email}>'.format(full_name=trainer.get_full_name(),
|
||||||
|
email=trainer.email)
|
||||||
|
|
||||||
|
mail = django_mail.outbox[0]
|
||||||
|
self.assertRecipients(mail, [recipient])
|
||||||
|
self.assertReplyTo(mail, [reply_to])
|
||||||
|
subject = '{number}: Anmeldung {full_name}'.format(number=event.get_number(),
|
||||||
|
full_name=registration.get_full_name())
|
||||||
|
self.assertSubject(mail, subject)
|
||||||
|
|
||||||
|
locale = get_language()[0:2]
|
||||||
|
body = MAIL_TRAINER_TEMPLATE.format(
|
||||||
|
participant_full_name=registration.get_full_name(),
|
||||||
|
participant_email=registration.email_address,
|
||||||
|
event_number=event.get_number(),
|
||||||
|
event_title=event.title,
|
||||||
|
event_formated_date=event.get_formated_date(),
|
||||||
|
trainer_first_name=trainer.first_name,
|
||||||
|
registration_id=registration.id,
|
||||||
|
registration_at=format_datetime(registration.created_at, 'EEEE, dd. MMMM yyyy, HH:mm', locale=locale),
|
||||||
|
purge_at=format_datetime(registration.purge_at, 'EEEE, dd. MMMM yyyy', locale=locale),
|
||||||
|
)
|
||||||
|
self.assertBody(mail, body)
|
||||||
64
dav_registration/tests/test_utils.py
Normal file
64
dav_registration/tests/test_utils.py
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import datetime
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
from dav_events.tests.generic import EventMixin
|
||||||
|
|
||||||
|
from ..models import Registration
|
||||||
|
from ..utils import purge_registrations
|
||||||
|
|
||||||
|
from .generic import RegistrationMixin
|
||||||
|
|
||||||
|
|
||||||
|
class UtilsTestCase(RegistrationMixin, EventMixin, TestCase):
|
||||||
|
def test_purge(self):
|
||||||
|
today = datetime.date.today()
|
||||||
|
one_day = datetime.timedelta(1)
|
||||||
|
purge_after_days = 7
|
||||||
|
common_event_data = {
|
||||||
|
'title': 'Daytrip',
|
||||||
|
'description': 'Test',
|
||||||
|
'mode': 'joint',
|
||||||
|
'sport': 'W',
|
||||||
|
'level': 'beginner',
|
||||||
|
'country': 'DE',
|
||||||
|
'trainer_firstname': 'Trainer',
|
||||||
|
'trainer_familyname': 'One',
|
||||||
|
'trainer_email': 'trainer@localhost',
|
||||||
|
}
|
||||||
|
|
||||||
|
# We will create 4 events with different dates in the past
|
||||||
|
# 1. an event, that is happening right now -> we would still need the participants data
|
||||||
|
# 2. an event that will be finished few days ago, but the grace period were we have to keep
|
||||||
|
# the participants data is not over right now -> do not purge registrations
|
||||||
|
# 3. an event that will be finished long enough, so that we can purge the registrations
|
||||||
|
# 4. event will be finished even longer ago
|
||||||
|
# To all events, we will create some registrations
|
||||||
|
event_data = (
|
||||||
|
(True, today),
|
||||||
|
(True, today - one_day * (purge_after_days - 1)),
|
||||||
|
(False, today - one_day * purge_after_days),
|
||||||
|
(False, today - one_day * (purge_after_days + 1)),
|
||||||
|
)
|
||||||
|
events = []
|
||||||
|
for registrations_still_needed, first_day in event_data:
|
||||||
|
data = common_event_data.copy()
|
||||||
|
data['first_day'] = first_day
|
||||||
|
|
||||||
|
event = self.create_event(data)
|
||||||
|
self.submit_event(event)
|
||||||
|
self.accept_event(event)
|
||||||
|
|
||||||
|
self.create_registration({'event': event})
|
||||||
|
self.create_registration({'event': event})
|
||||||
|
self.create_registration({'event': event})
|
||||||
|
|
||||||
|
events.append((event, registrations_still_needed))
|
||||||
|
|
||||||
|
# Now we purge obsolete registrations
|
||||||
|
purge_registrations()
|
||||||
|
|
||||||
|
# Now we test for all 4 events, if there are still registrations
|
||||||
|
for event, registrations_still_needed in events:
|
||||||
|
self.assertEqual(Registration.objects.filter(event=event).exists(), registrations_still_needed)
|
||||||
46
dav_registration/tests/test_validators.py
Normal file
46
dav_registration/tests/test_validators.py
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.test import SimpleTestCase
|
||||||
|
|
||||||
|
from ..validators import DAVNumberValidator
|
||||||
|
|
||||||
|
|
||||||
|
class TestCase(SimpleTestCase):
|
||||||
|
def test_dav_number_validator(self):
|
||||||
|
valid_data = (
|
||||||
|
'131/00/1',
|
||||||
|
'1',
|
||||||
|
'22',
|
||||||
|
'333',
|
||||||
|
'1/22/22',
|
||||||
|
'54321/54321/54321*54321',
|
||||||
|
'54321/54321/54321*54321*4321*4321',
|
||||||
|
'54321/54321/54321*54321*4321*4321*87654321',
|
||||||
|
'54321*54321',
|
||||||
|
'54321*54321*4321*4321',
|
||||||
|
'54321*54321*4321*4321*87654321',
|
||||||
|
)
|
||||||
|
invalid_data = (
|
||||||
|
'131/00/',
|
||||||
|
'1/1/1',
|
||||||
|
'1/1',
|
||||||
|
'abc',
|
||||||
|
'131/00/abc',
|
||||||
|
'abc/00/131',
|
||||||
|
'131/ab/131',
|
||||||
|
)
|
||||||
|
|
||||||
|
v = DAVNumberValidator
|
||||||
|
|
||||||
|
for val in valid_data:
|
||||||
|
try:
|
||||||
|
v(val)
|
||||||
|
except ValidationError as e: # pragma: no cover
|
||||||
|
self.fail('%s: %s' % (val, e))
|
||||||
|
|
||||||
|
for val in invalid_data:
|
||||||
|
try:
|
||||||
|
v(val)
|
||||||
|
except ValidationError:
|
||||||
|
pass
|
||||||
|
else: # pragma: no cover
|
||||||
|
self.fail('%s: no ValidationError was raised' % val)
|
||||||
Reference in New Issue
Block a user