generated from bisco/codex-bootstrap
86 lines
3.1 KiB
Python
86 lines
3.1 KiB
Python
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,
|
|
)
|