fix(events): keep registration status reads nonblocking

This commit is contained in:
2026-10-01 13:35:17 +03:30
parent 962238c32c
commit f924fcc52e
16 changed files with 498 additions and 107 deletions

View File

@@ -4,8 +4,9 @@ from datetime import timedelta
from django.contrib import admin
from django.utils import timezone
from apps.events.admin import EventAdmin, RegistrationAdmin
from apps.events.models import Event, Registration
from apps.events.models import Event, Registration, RegistrationNotification
from apps.events.tasks import send_registration_cancellation_notification, send_registration_confirmation_notification
from apps.events.tasks import deliver_pending_registration_notifications
from apps.users.models import User
@pytest.mark.django_db
@@ -25,10 +26,33 @@ class TestEventModelTests:
def test_capacity_counts_confirmed_registration(self, mocker):
delay = mocker.patch('apps.events.tasks.send_registration_confirmation_notification.delay')
Registration.objects.create(event=self.event, user=self.user, status=Registration.StatusChoices.CONFIRMED)
registration = Registration.objects.create(event=self.event, user=self.user, status=Registration.StatusChoices.CONFIRMED)
assert self.event.current_attendees_count == 1
assert not self.event.has_available_slots
delay.assert_called_once()
assert RegistrationNotification.objects.filter(
registration=registration, kind=RegistrationNotification.Kind.CONFIRMED,
).exists()
delay.assert_not_called()
def test_notification_worker_retries_after_redis_failure(self, mocker):
registration = Registration.objects.create(
event=self.event, user=self.user, status=Registration.StatusChoices.CONFIRMED,
)
entry = RegistrationNotification.objects.get(registration=registration)
notify = mocker.patch("apps.events.tasks.notify_user", side_effect=ConnectionError("redis unavailable"))
assert deliver_pending_registration_notifications() == 0
entry.refresh_from_db()
assert entry.delivered_at is None
notify.side_effect = None
assert deliver_pending_registration_notifications() == 1
entry.refresh_from_db()
registration.refresh_from_db()
assert entry.delivered_at is not None
assert registration.confirmation_notification_sent_at is not None
assert notify.call_args.args[1]["id"] == f"registration-{entry.pk}-confirmed"
assert deliver_pending_registration_notifications() == 0
def test_unlimited_capacity_allows_registration(self):
self.event.capacity = None