from datetime import timedelta from django.contrib.auth import get_user_model from django.core import mail from django.test import TestCase from django.test.utils import override_settings from django.urls import reverse from django.utils import timezone from bookings.models import Reservation, ReservationToken from shows.models import Performance, Show, Venue @override_settings( EMAIL_BACKEND="django.core.mail.backends.locmem.EmailBackend", SITE_BASE_URL="https://tickets.azionelab.example", ) class ReservationAdminTests(TestCase): def setUp(self): user_model = get_user_model() self.admin_user = user_model.objects.create_superuser( username="admin-bookings", email="admin@example.com", password="password123", ) self.client.force_login(self.admin_user) self.show = Show.objects.create( title="Open Stage", slug="open-stage-admin", is_published=True, ) self.venue = Venue.objects.create( name="AzioneLab Theatre", slug="azionelab-theatre-admin", address="Via Example 1", city="Rome", ) self.performance = Performance.objects.create( show=self.show, venue=self.venue, starts_at=timezone.now() + timedelta(days=7), room_capacity=20, ) def test_reservation_add_page_accepts_preselected_performance(self): response = self.client.get( reverse("admin:bookings_reservation_add"), {"performance": self.performance.id}, ) self.assertEqual(response.status_code, 200) self.assertContains(response, "Create manual reservation") self.assertContains(response, "The reservation stays pending") def test_admin_can_create_manual_reservation_with_standard_email_flow(self): with self.captureOnCommitCallbacks(execute=True): response = self.client.post( reverse("admin:bookings_reservation_add"), { "performance": self.performance.id, "name": "Maria Rossi", "email": "maria@example.com", "phone": "+390600000000", "party_size": 2, "notes": "Entered by staff at the venue desk.", "_save": "Save", }, ) reservation = Reservation.objects.get() self.assertEqual(response.status_code, 302) self.assertEqual(reservation.performance, self.performance) self.assertEqual(reservation.status, Reservation.Status.PENDING) self.assertEqual(reservation.party_size, 2) self.assertTrue( ReservationToken.objects.filter( reservation=reservation, purpose=ReservationToken.Purpose.CONFIRMATION, ).exists() ) self.assertEqual(len(mail.outbox), 1) self.assertIn( "https://tickets.azionelab.example/api/reservations/confirm/?token=", mail.outbox[0].body, )