From 1ea61590491f81055707b213a78a5024ba9d7ac7 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 1 Oct 2026 12:14:19 +0200 Subject: [PATCH] Add tests --- src/pretix/base/notifications.py | 8 ++++--- src/tests/base/test_notifications.py | 29 ++++++++++++++++++++++-- src/tests/testdummy/signals.py | 34 +++++++++++++++++++++++++--- 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/pretix/base/notifications.py b/src/pretix/base/notifications.py index eccf7f5be6..ee2fc69f21 100644 --- a/src/pretix/base/notifications.py +++ b/src/pretix/base/notifications.py @@ -35,7 +35,7 @@ import logging from collections import OrderedDict, namedtuple from itertools import groupby -from typing import Union +from typing import Optional, Union from django.dispatch import receiver from django.utils.formats import date_format @@ -69,8 +69,10 @@ class Notification: each consisting of a button label and an absolute URL to point to. """ - def __init__(self, event: Event, title: str, detail: str=None, url: str=None, organizer: Organizer=None): - assert event or organizer + def __init__(self, event: Optional[Event], title: str, detail: Optional[str]=None, url: Optional[str]=None, organizer: Optional[Organizer]=None): + assert event or organizer, "You need to pass either event or organizer" + if event and organizer: + assert event.organizer_id == organizer.id, "Organizer and event mismatch" self.title = title self.organizer = organizer or event.organizer self.event = event diff --git a/src/tests/base/test_notifications.py b/src/tests/base/test_notifications.py index f285f6e05e..59f356cfaf 100644 --- a/src/tests/base/test_notifications.py +++ b/src/tests/base/test_notifications.py @@ -64,7 +64,7 @@ def order(event): @pytest.fixture def team(event): - return event.organizer.teams.create(all_events=True, all_event_permissions=True) + return event.organizer.teams.create(all_events=True, all_event_permissions=True, all_organizer_permissions=True) @pytest.fixture @@ -108,6 +108,17 @@ def test_notification_trigger_global_wildcard(event, order, user, django_capture assert len(djmail.outbox) == 1 +@pytest.mark.django_db +def test_notification_trigger_organizer(event, user, django_capture_on_commit_callbacks): + djmail.outbox = [] + user.notification_settings.create( + method='mail', event=None, action_type='pretix.organizer.changed', enabled=True + ) + with django_capture_on_commit_callbacks(execute=True): + event.organizer.log_action('pretix.organizer.changed', {}) + assert len(djmail.outbox) == 1 + + @pytest.mark.django_db def test_notification_enabled_global_ignored_specific(event, order, user, django_capture_on_commit_callbacks): djmail.outbox = [] @@ -134,7 +145,7 @@ def test_notification_ignore_same_user(event, order, user, django_capture_on_com @pytest.mark.django_db -def test_notification_ignore_insufficient_permissions(event, order, user, team, django_capture_on_commit_callbacks): +def test_notification_ignore_insufficient_event_permissions(event, order, user, team, django_capture_on_commit_callbacks): djmail.outbox = [] team.all_event_permissions = False team.limit_event_permissions = {"event.vouchers:read": True} @@ -146,4 +157,18 @@ def test_notification_ignore_insufficient_permissions(event, order, user, team, order.log_action('pretix.event.order.paid', {}) assert len(djmail.outbox) == 0 + +@pytest.mark.django_db +def test_notification_ignore_insufficient_organizer_permissions(event, team, user, django_capture_on_commit_callbacks): + djmail.outbox = [] + team.all_organizer_permissions = False + team.limit_organizer_permissions = {"organizer.giftcards:read": True} + team.save() + user.notification_settings.create( + method='mail', event=None, action_type='pretix.organizer.changed', enabled=True + ) + with django_capture_on_commit_callbacks(execute=True): + event.organizer.log_action('pretix.organizer.changed', {}) + assert len(djmail.outbox) == 0 + # TODO: Test email content diff --git a/src/tests/testdummy/signals.py b/src/tests/testdummy/signals.py index 4224d17c97..bdc247724a 100644 --- a/src/tests/testdummy/signals.py +++ b/src/tests/testdummy/signals.py @@ -26,11 +26,12 @@ from pretix.base.exporter import BaseExporter from pretix.base.invoicing.transmission import ( TransmissionProvider, transmission_providers, ) -from pretix.base.models import Invoice +from pretix.base.models import Invoice, LogEntry +from pretix.base.notifications import Notification, NotificationType from pretix.base.signals import ( register_data_exporters, register_multievent_data_exporters, - register_payment_providers, register_sales_channel_types, - register_ticket_outputs, + register_notification_types, register_payment_providers, + register_sales_channel_types, register_ticket_outputs, ) from pretix.presale.signals import html_head @@ -144,3 +145,30 @@ class TestPeppolTransmissionProvider(TransmissionProvider): def transmit(self, invoice): invoice.transmission_status = Invoice.TRANSMISSION_STATUS_COMPLETED invoice.save() + + +class OrgLevelTestNotificationType(NotificationType): + required_permission = "organizer.settings.general:write" # does not make much sense, just for tests + is_event_level = False + action_type = "pretix.organizer.changed" + verbose_name = "Organizer changed" + + def __init__(self, organizer): + super().__init__(organizer) + + def build_notification(self, logentry: LogEntry): + n = Notification( + event=None, + organizer=logentry.organizer, + title="Organizer Changed", + url="https://example.com" + ) + n.add_attribute('Organizer', logentry.organizer.name) + return n + + +@receiver(register_notification_types, dispatch_uid="testdummy_register_notification_types") +def testdummy_register_notification_types(sender, **kwargs): + return ( + OrgLevelTestNotificationType(sender) + )