tests: replace broken monkeypatching with TransactionTestCase

This commit is contained in:
Kara Engelhardt
2026-03-24 13:50:40 +01:00
committed by pajowu
parent 2e2e57d231
commit a57810cf41
2 changed files with 26 additions and 34 deletions

View File

@@ -28,8 +28,9 @@ from zoneinfo import ZoneInfo
import pytest import pytest
from django.conf import settings from django.conf import settings
from django.core import mail as djmail from django.core import mail as djmail
from django.db import transaction
from django.db.models import F, Sum from django.db.models import F, Sum
from django.test import TestCase, override_settings from django.test import TestCase, TransactionTestCase, override_settings
from django.utils.timezone import make_aware, now from django.utils.timezone import make_aware, now
from django_countries.fields import Country from django_countries.fields import Country
from django_scopes import scope from django_scopes import scope
@@ -1225,12 +1226,6 @@ class DownloadReminderTests(TestCase):
assert len(djmail.outbox) == 0 assert len(djmail.outbox) == 0
@pytest.fixture
def class_monkeypatch(request, monkeypatch):
request.cls.monkeypatch = monkeypatch
@pytest.mark.usefixtures("class_monkeypatch")
class OrderCancelTests(TestCase): class OrderCancelTests(TestCase):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
@@ -1258,7 +1253,6 @@ class OrderCancelTests(TestCase):
self.order.create_transactions() self.order.create_transactions()
generate_invoice(self.order) generate_invoice(self.order)
djmail.outbox = [] djmail.outbox = []
self.monkeypatch.setattr("django.db.transaction.on_commit", lambda t: t())
@classscope(attr='o') @classscope(attr='o')
def test_cancel_canceled(self): def test_cancel_canceled(self):
@@ -1351,14 +1345,14 @@ class OrderCancelTests(TestCase):
self.order.status = Order.STATUS_PAID self.order.status = Order.STATUS_PAID
self.order.save() self.order.save()
djmail.outbox = [] djmail.outbox = []
cancel_order(self.order.pk, send_mail=True) with self.captureOnCommitCallbacks(execute=True):
print([s.subject for s in djmail.outbox]) cancel_order(self.order.pk, send_mail=True)
print([s.to for s in djmail.outbox])
assert len(djmail.outbox) == 2 assert len(djmail.outbox) == 2
assert ["invoice@example.org"] == djmail.outbox[0].to assert ["dummy@dummy.test"] == djmail.outbox[0].to
assert any(["Invoice_" in a[0] for a in djmail.outbox[0].attachments]) assert not any(["Invoice_" in a[0] for a in djmail.outbox[0].attachments])
assert ["dummy@dummy.test"] == djmail.outbox[1].to assert ["invoice@example.org"] == djmail.outbox[1].to
assert not any(["Invoice_" in a[0] for a in djmail.outbox[1].attachments]) assert any(["Invoice_" in a[0] for a in djmail.outbox[1].attachments])
@classscope(attr='o') @classscope(attr='o')
def test_cancel_paid_with_too_high_fee(self): def test_cancel_paid_with_too_high_fee(self):
@@ -1488,8 +1482,7 @@ class OrderCancelTests(TestCase):
assert self.order.all_logentries().filter(action_type='pretix.event.order.refund.requested').exists() assert self.order.all_logentries().filter(action_type='pretix.event.order.refund.requested').exists()
@pytest.mark.usefixtures("class_monkeypatch") class BaseOrderChangeManagerTestCase:
class OrderChangeManagerTests(TestCase):
def setUp(self): def setUp(self):
super().setUp() super().setUp()
self.o = Organizer.objects.create(name='Dummy', slug='dummy', plugins='pretix.plugins.banktransfer') self.o = Organizer.objects.create(name='Dummy', slug='dummy', plugins='pretix.plugins.banktransfer')
@@ -1552,7 +1545,6 @@ class OrderChangeManagerTests(TestCase):
self.seat_a1 = self.event.seats.create(seat_number="A1", product=self.stalls, seat_guid="A1") 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_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.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): def _enable_reverse_charge(self):
self.tr7.eu_reverse_charge = True self.tr7.eu_reverse_charge = True
@@ -1566,6 +1558,8 @@ class OrderChangeManagerTests(TestCase):
country=Country('AT') country=Country('AT')
) )
class OrderChangeManagerTests(BaseOrderChangeManagerTestCase, TestCase):
@classscope(attr='o') @classscope(attr='o')
def test_multiple_commits_forbidden(self): def test_multiple_commits_forbidden(self):
self.ocm.change_price(self.op1, Decimal('10.00')) self.ocm.change_price(self.op1, Decimal('10.00'))
@@ -3904,15 +3898,16 @@ class OrderChangeManagerTests(TestCase):
@classscope(attr='o') @classscope(attr='o')
def test_set_valid_until(self): def test_set_valid_until(self):
self.event.settings.ticket_secret_generator = "pretix_sig1" with transaction.atomic():
assign_ticket_secret(self.event, self.op1, force_invalidate=True, save=True) self.event.settings.ticket_secret_generator = "pretix_sig1"
old_secret = self.op1.secret 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)) dt = make_aware(datetime(2022, 9, 20, 15, 0, 0, 0))
self.ocm.change_valid_until(self.op1, dt) self.ocm.change_valid_until(self.op1, dt)
self.ocm.commit() self.ocm.commit()
self.op1.refresh_from_db() self.op1.refresh_from_db()
assert self.op1.secret != old_secret assert self.op1.secret != old_secret
@classscope(attr='o') @classscope(attr='o')
def test_unset_valid_from_until(self): def test_unset_valid_from_until(self):
@@ -3937,6 +3932,8 @@ class OrderChangeManagerTests(TestCase):
assert len(djmail.outbox) == 1 assert len(djmail.outbox) == 1
assert len(["Invoice_" in a[0] for a in djmail.outbox[0].attachments]) == 2 assert len(["Invoice_" in a[0] for a in djmail.outbox[0].attachments]) == 2
class OrderChangeManagerTransactionalTests(BaseOrderChangeManagerTestCase, TransactionTestCase):
@classscope(attr='o') @classscope(attr='o')
def test_new_invoice_send_somewhere_else(self): def test_new_invoice_send_somewhere_else(self):
generate_invoice(self.order) generate_invoice(self.order)

View File

@@ -33,7 +33,7 @@ from django.conf import settings
from django.core import mail as djmail from django.core import mail as djmail
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from django.core.signing import dumps 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.crypto import get_random_string
from django.utils.timezone import now from django.utils.timezone import now
from django_countries.fields import Country from django_countries.fields import Country
@@ -60,12 +60,6 @@ from pretix.testutils.sessions import get_cart_session_key
from .test_timemachine import TimemachineTestMixin from .test_timemachine import TimemachineTestMixin
@pytest.fixture
def class_monkeypatch(request, monkeypatch):
request.cls.monkeypatch = monkeypatch
@pytest.mark.usefixtures("class_monkeypatch")
class BaseCheckoutTestCase: class BaseCheckoutTestCase:
@scopes_disabled() @scopes_disabled()
def setUp(self): def setUp(self):
@@ -104,7 +98,6 @@ class BaseCheckoutTestCase:
self.workshopquota.items.add(self.workshop2) self.workshopquota.items.add(self.workshop2)
self.workshopquota.variations.add(self.workshop2a) self.workshopquota.variations.add(self.workshop2a)
self.workshopquota.variations.add(self.workshop2b) self.workshopquota.variations.add(self.workshop2b)
self.monkeypatch.setattr("django.db.transaction.on_commit", lambda t: t())
def _set_session(self, key, value): def _set_session(self, key, value):
session = self.client.session session = self.client.session
@@ -4420,6 +4413,8 @@ class CheckoutTestCase(BaseCheckoutTestCase, TimemachineTestMixin, TestCase):
assert len(djmail.outbox) == 1 assert len(djmail.outbox) == 1
assert any(["Invoice_" in a[0] for a in djmail.outbox[0].attachments]) 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): def test_order_confirmation_mail_invoice_sent_somewhere_else(self):
self.event.settings.invoice_address_asked = True self.event.settings.invoice_address_asked = True
self.event.settings.invoice_address_required = True self.event.settings.invoice_address_required = True