Add PATCH /events/{eventToken} endpoint for organizers to cancel events,
cancellation banner for visitors, and RSVP rejection on cancelled events.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
75 lines
2.4 KiB
TypeScript
75 lines
2.4 KiB
TypeScript
import { http, HttpResponse } from 'msw'
|
|
import { test, expect } from './msw-setup'
|
|
|
|
const cancelledEventWithReason = {
|
|
eventToken: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
|
|
title: 'Summer BBQ',
|
|
description: 'Bring your own drinks!',
|
|
dateTime: '2026-03-15T20:00:00+01:00',
|
|
timezone: 'Europe/Berlin',
|
|
location: 'Central Park, NYC',
|
|
attendeeCount: 12,
|
|
cancelled: true,
|
|
cancellationReason: 'Venue no longer available',
|
|
}
|
|
|
|
const cancelledEventWithoutReason = {
|
|
...cancelledEventWithReason,
|
|
cancellationReason: null,
|
|
}
|
|
|
|
test.describe('US2: Visitor sees cancelled event with reason', () => {
|
|
test('visitor sees red banner with cancellation reason on cancelled event', async ({
|
|
page,
|
|
network,
|
|
}) => {
|
|
network.use(
|
|
http.get('*/api/events/:token', () => HttpResponse.json(cancelledEventWithReason)),
|
|
)
|
|
|
|
await page.goto(`/events/${cancelledEventWithReason.eventToken}`)
|
|
|
|
await expect(page.getByText(/This event has been cancelled/i)).toBeVisible()
|
|
await expect(page.getByText('Venue no longer available')).toBeVisible()
|
|
})
|
|
})
|
|
|
|
test.describe('US2: Visitor sees cancelled event without reason', () => {
|
|
test('visitor sees red banner without reason when no reason was provided', async ({
|
|
page,
|
|
network,
|
|
}) => {
|
|
network.use(
|
|
http.get('*/api/events/:token', () => HttpResponse.json(cancelledEventWithoutReason)),
|
|
)
|
|
|
|
await page.goto(`/events/${cancelledEventWithoutReason.eventToken}`)
|
|
|
|
await expect(page.getByText(/This event has been cancelled/i)).toBeVisible()
|
|
// No reason text shown
|
|
await expect(page.getByText('Venue no longer available')).not.toBeVisible()
|
|
})
|
|
})
|
|
|
|
test.describe('US2: RSVP buttons hidden on cancelled event', () => {
|
|
test('RSVP buttons hidden on cancelled event, other details remain visible', async ({
|
|
page,
|
|
network,
|
|
}) => {
|
|
network.use(
|
|
http.get('*/api/events/:token', () => HttpResponse.json(cancelledEventWithReason)),
|
|
)
|
|
|
|
await page.goto(`/events/${cancelledEventWithReason.eventToken}`)
|
|
|
|
// Event details are still visible
|
|
await expect(page.getByRole('heading', { name: 'Summer BBQ' })).toBeVisible()
|
|
await expect(page.getByText('Bring your own drinks!')).toBeVisible()
|
|
await expect(page.getByText('Central Park, NYC')).toBeVisible()
|
|
await expect(page.getByText('12 going')).toBeVisible()
|
|
|
|
// RSVP bar is NOT visible
|
|
await expect(page.getByRole('button', { name: "I'm attending" })).not.toBeVisible()
|
|
})
|
|
})
|