39586-vm/core/tests.py
2026-04-12 12:41:59 +00:00

118 lines
5.0 KiB
Python

from datetime import timedelta
from django.contrib.auth import get_user_model
from django.test import TestCase
from django.urls import reverse
from django.utils import timezone
from .models import Event, Registration
class EventFlowTests(TestCase):
def setUp(self):
now = timezone.now() + timedelta(days=7)
self.user = get_user_model().objects.create_user(username='organizer', password='testpass123')
self.event = Event.objects.create(
title='Design Systems Lab',
summary='Hands-on session for collaborative design systems.',
description='A practical session for teams building consistent digital products.',
venue='Northstar Studio',
start_at=now,
end_at=now + timedelta(hours=2),
capacity=2,
)
def test_home_page_loads_event(self):
response = self.client.get(reverse('home'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, self.event.title)
def test_registration_creates_attendee_and_redirects(self):
response = self.client.post(
reverse('event_detail', args=[self.event.slug]),
{
'full_name': 'Jordan Lee',
'email': 'jordan@example.com',
'company': 'Studio North',
'notes': 'Vegetarian meal',
},
follow=True,
)
self.assertEqual(response.status_code, 200)
self.assertEqual(Registration.objects.count(), 1)
self.assertContains(response, 'Your spot is secured')
def test_capacity_overflow_goes_to_waitlist(self):
Registration.objects.create(event=self.event, full_name='One', email='one@example.com')
Registration.objects.create(event=self.event, full_name='Two', email='two@example.com')
self.client.post(
reverse('event_detail', args=[self.event.slug]),
{
'full_name': 'Three',
'email': 'three@example.com',
'company': '',
'notes': '',
},
)
self.assertEqual(Registration.objects.get(email='three@example.com').status, Registration.Status.WAITLIST)
def test_dashboard_requires_login(self):
response = self.client.get(reverse('organizer_dashboard'))
self.assertEqual(response.status_code, 302)
self.assertIn(reverse('login'), response.url)
def test_logged_in_organizer_can_open_dashboard(self):
self.client.force_login(self.user)
response = self.client.get(reverse('organizer_dashboard'))
self.assertEqual(response.status_code, 200)
self.assertContains(response, 'Organizer dashboard')
def test_logged_in_organizer_can_create_event_from_dashboard_form(self):
self.client.force_login(self.user)
response = self.client.post(
reverse('organizer_event_create'),
{
'title': 'Community Breakfast',
'summary': 'Meet peers before the keynote.',
'description': 'A low-key networking breakfast for early arrivals.',
'venue': 'Northstar Cafe',
'start_at': (timezone.localtime(self.event.start_at) + timedelta(days=3)).strftime('%Y-%m-%dT%H:%M'),
'end_at': (timezone.localtime(self.event.end_at) + timedelta(days=3)).strftime('%Y-%m-%dT%H:%M'),
'capacity': 24,
'is_published': 'on',
'registration_opens': '',
'registration_closes': '',
},
follow=True,
)
self.assertEqual(response.status_code, 200)
self.assertTrue(Event.objects.filter(title='Community Breakfast', venue='Northstar Cafe').exists())
self.assertContains(response, 'created successfully')
def test_logged_in_organizer_can_edit_event_from_dashboard_form(self):
self.client.force_login(self.user)
response = self.client.post(
reverse('organizer_event_edit', args=[self.event.slug]),
{
'title': 'Design Systems Lab Updated',
'summary': 'Hands-on session for collaborative design systems.',
'description': 'A practical session for teams building consistent digital products.',
'venue': 'Northstar Auditorium',
'start_at': timezone.localtime(self.event.start_at).strftime('%Y-%m-%dT%H:%M'),
'end_at': timezone.localtime(self.event.end_at).strftime('%Y-%m-%dT%H:%M'),
'capacity': 40,
'is_published': 'on',
'registration_opens': '',
'registration_closes': '',
},
follow=True,
)
self.assertEqual(response.status_code, 200)
self.event.refresh_from_db()
self.assertEqual(self.event.title, 'Design Systems Lab Updated')
self.assertEqual(self.event.venue, 'Northstar Auditorium')
self.assertEqual(self.event.capacity, 40)
self.assertContains(response, 'updated successfully')