From cfccfeb513e7129f9499aa068d7de9ea5eabf94c Mon Sep 17 00:00:00 2001 From: Kara Engelhardt Date: Tue, 24 Mar 2026 13:50:40 +0100 Subject: [PATCH] tests: replace broken monkeypatching with TransactionTestCase --- src/tests/base/test_orders.py | 49 +++++++++++++----------------- src/tests/presale/test_checkout.py | 10 ++---- 2 files changed, 23 insertions(+), 36 deletions(-) diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index b46745a368..06e05ff1ff 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -29,7 +29,8 @@ import pytest from django.conf import settings from django.core import mail as djmail from django.db.models import F, Sum -from django.test import TestCase, override_settings +from django.test import TestCase, TransactionTestCase, override_settings +from django.db import transaction from django.utils.timezone import make_aware, now from django_countries.fields import Country from django_scopes import scope @@ -1224,13 +1225,6 @@ class DownloadReminderTests(TestCase): send_download_reminders(sender=self.event) assert len(djmail.outbox) == 0 - -@pytest.fixture -def class_monkeypatch(request, monkeypatch): - request.cls.monkeypatch = monkeypatch - - -@pytest.mark.usefixtures("class_monkeypatch") class OrderCancelTests(TestCase): def setUp(self): super().setUp() @@ -1258,7 +1252,6 @@ class OrderCancelTests(TestCase): self.order.create_transactions() generate_invoice(self.order) djmail.outbox = [] - self.monkeypatch.setattr("django.db.transaction.on_commit", lambda t: t()) @classscope(attr='o') def test_cancel_canceled(self): @@ -1351,14 +1344,14 @@ class OrderCancelTests(TestCase): self.order.status = Order.STATUS_PAID self.order.save() djmail.outbox = [] - cancel_order(self.order.pk, send_mail=True) - print([s.subject for s in djmail.outbox]) - print([s.to for s in djmail.outbox]) + with self.captureOnCommitCallbacks(execute=True): + cancel_order(self.order.pk, send_mail=True) + assert len(djmail.outbox) == 2 - assert ["invoice@example.org"] == djmail.outbox[0].to - assert any(["Invoice_" in a[0] for a in djmail.outbox[0].attachments]) - assert ["dummy@dummy.test"] == djmail.outbox[1].to - assert not any(["Invoice_" in a[0] for a in djmail.outbox[1].attachments]) + assert ["dummy@dummy.test"] == djmail.outbox[0].to + assert not any(["Invoice_" in a[0] for a in djmail.outbox[0].attachments]) + assert ["invoice@example.org"] == djmail.outbox[1].to + assert any(["Invoice_" in a[0] for a in djmail.outbox[1].attachments]) @classscope(attr='o') def test_cancel_paid_with_too_high_fee(self): @@ -1487,9 +1480,7 @@ class OrderCancelTests(TestCase): assert not self.order.refunds.exists() assert self.order.all_logentries().filter(action_type='pretix.event.order.refund.requested').exists() - -@pytest.mark.usefixtures("class_monkeypatch") -class OrderChangeManagerTests(TestCase): +class BaseOrderChangeManagerTestCase: def setUp(self): super().setUp() self.o = Organizer.objects.create(name='Dummy', slug='dummy', plugins='pretix.plugins.banktransfer') @@ -1552,7 +1543,6 @@ class OrderChangeManagerTests(TestCase): self.seat_a1 = self.event.seats.create(seat_number="A1", product=self.stalls, seat_guid="A1") self.seat_a2 = self.event.seats.create(seat_number="A2", product=self.stalls, seat_guid="A2") self.seat_a3 = self.event.seats.create(seat_number="A3", product=self.stalls, seat_guid="A3") - self.monkeypatch.setattr("django.db.transaction.on_commit", lambda t: t()) def _enable_reverse_charge(self): self.tr7.eu_reverse_charge = True @@ -1566,6 +1556,7 @@ class OrderChangeManagerTests(TestCase): country=Country('AT') ) +class OrderChangeManagerTests(BaseOrderChangeManagerTestCase, TestCase): @classscope(attr='o') def test_multiple_commits_forbidden(self): self.ocm.change_price(self.op1, Decimal('10.00')) @@ -3895,15 +3886,16 @@ class OrderChangeManagerTests(TestCase): @classscope(attr='o') def test_set_valid_until(self): - self.event.settings.ticket_secret_generator = "pretix_sig1" - assign_ticket_secret(self.event, self.op1, force_invalidate=True, save=True) - old_secret = self.op1.secret + with transaction.atomic(): + self.event.settings.ticket_secret_generator = "pretix_sig1" + assign_ticket_secret(self.event, self.op1, force_invalidate=True, save=True) + old_secret = self.op1.secret - dt = make_aware(datetime(2022, 9, 20, 15, 0, 0, 0)) - self.ocm.change_valid_until(self.op1, dt) - self.ocm.commit() - self.op1.refresh_from_db() - assert self.op1.secret != old_secret + dt = make_aware(datetime(2022, 9, 20, 15, 0, 0, 0)) + self.ocm.change_valid_until(self.op1, dt) + self.ocm.commit() + self.op1.refresh_from_db() + assert self.op1.secret != old_secret @classscope(attr='o') def test_unset_valid_from_until(self): @@ -3928,6 +3920,7 @@ class OrderChangeManagerTests(TestCase): assert len(djmail.outbox) == 1 assert len(["Invoice_" in a[0] for a in djmail.outbox[0].attachments]) == 2 +class OrderChangeManagerTransactionalTests(BaseOrderChangeManagerTestCase, TransactionTestCase): @classscope(attr='o') def test_new_invoice_send_somewhere_else(self): generate_invoice(self.order) diff --git a/src/tests/presale/test_checkout.py b/src/tests/presale/test_checkout.py index f8a6ebd758..45ae444f3d 100644 --- a/src/tests/presale/test_checkout.py +++ b/src/tests/presale/test_checkout.py @@ -33,7 +33,7 @@ from django.conf import settings from django.core import mail as djmail from django.core.files.uploadedfile import SimpleUploadedFile from django.core.signing import dumps -from django.test import TestCase +from django.test import TestCase, TransactionTestCase from django.utils.crypto import get_random_string from django.utils.timezone import now from django_countries.fields import Country @@ -60,12 +60,6 @@ from pretix.testutils.sessions import get_cart_session_key from .test_timemachine import TimemachineTestMixin -@pytest.fixture -def class_monkeypatch(request, monkeypatch): - request.cls.monkeypatch = monkeypatch - - -@pytest.mark.usefixtures("class_monkeypatch") class BaseCheckoutTestCase: @scopes_disabled() def setUp(self): @@ -104,7 +98,6 @@ class BaseCheckoutTestCase: self.workshopquota.items.add(self.workshop2) self.workshopquota.variations.add(self.workshop2a) self.workshopquota.variations.add(self.workshop2b) - self.monkeypatch.setattr("django.db.transaction.on_commit", lambda t: t()) def _set_session(self, key, value): session = self.client.session @@ -4420,6 +4413,7 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase): assert len(djmail.outbox) == 1 assert any(["Invoice_" in a[0] for a in djmail.outbox[0].attachments]) +class CheckoutTransactionTestCase(BaseCheckoutTestCase, TransactionTestCase): def test_order_confirmation_mail_invoice_sent_somewhere_else(self): self.event.settings.invoice_address_asked = True self.event.settings.invoice_address_required = True