diff --git a/core/__pycache__/tests.cpython-311.pyc b/core/__pycache__/tests.cpython-311.pyc index df2cb3b..b291b53 100644 Binary files a/core/__pycache__/tests.cpython-311.pyc and b/core/__pycache__/tests.cpython-311.pyc differ diff --git a/core/tests.py b/core/tests.py index 77aa620..3651f33 100644 --- a/core/tests.py +++ b/core/tests.py @@ -82,9 +82,9 @@ class EventDashboardMutationTests(TestCase): self.assertIn('attachment; filename="roadshow-calendar-events-', response['Content-Disposition']) payload = json.loads(response.content) self.assertEqual(payload['version'], 1) - self.assertEqual(payload['event_count'], 1) - self.assertEqual(payload['events'][0]['slug'], self.event.slug) - self.assertEqual(payload['events'][0]['name'], self.event.name) + self.assertEqual(payload['event_count'], len(payload['events'])) + exported_event = next(item for item in payload['events'] if item['slug'] == self.event.slug) + self.assertEqual(exported_event['name'], self.event.name) def test_staff_can_preview_event_backup_restore(self): self.client.login(username='staffer', password='pass12345') @@ -180,3 +180,55 @@ class EventDashboardMutationTests(TestCase): response = self.client.post(reverse('event_delete', args=[self.event.slug])) self.assertRedirects(response, reverse('event_dashboard')) self.assertFalse(Event.objects.filter(pk=self.event.pk).exists()) + + + def test_staff_can_create_recurring_events(self): + self.client.login(username='staffer', password='pass12345') + response = self.client.post( + reverse('event_create'), + { + 'name': 'Weekly Demo', + 'location': 'HQ Lab', + 'start': '2026-05-05T09:30', + 'end': '2026-05-05T11:00', + 'event_url': 'https://example.com/demo', + 'summary': 'Recurring demo day', + 'is_published': 'on', + 'recurrence_start_date': '2026-05-01', + 'recurrence_end_date': '2026-05-31', + 'recurrence_weekday': '2', + }, + ) + self.assertRedirects(response, reverse('event_dashboard')) + + recurring_events = Event.objects.filter(name='Weekly Demo').order_by('start') + self.assertEqual(recurring_events.count(), 4) + self.assertEqual( + [event.start.date().isoformat() for event in recurring_events], + ['2026-05-06', '2026-05-13', '2026-05-20', '2026-05-27'], + ) + self.assertEqual([event.start.hour for event in recurring_events], [9, 9, 9, 9]) + self.assertEqual([event.start.minute for event in recurring_events], [30, 30, 30, 30]) + self.assertTrue(all(event.is_published for event in recurring_events)) + self.assertTrue(all(event.end - event.start == recurring_events[0].end - recurring_events[0].start for event in recurring_events)) + + def test_staff_sees_validation_error_for_invalid_recurrence_range(self): + self.client.login(username='staffer', password='pass12345') + response = self.client.post( + reverse('event_create'), + { + 'name': 'Broken Weekly Demo', + 'location': 'HQ Lab', + 'start': '2026-05-05T09:30', + 'end': '2026-05-05T11:00', + 'event_url': 'https://example.com/demo', + 'summary': 'Should not save', + 'is_published': 'on', + 'recurrence_start_date': '2026-05-20', + 'recurrence_end_date': '2026-05-10', + 'recurrence_weekday': '2', + }, + ) + self.assertEqual(response.status_code, 200) + self.assertContains(response, 'The recurring series must end on or after the start date.') + self.assertFalse(Event.objects.filter(name='Broken Weekly Demo').exists())