/** * Shared event payloads for consumer Playwright e2e. * * Next SSR fetches `NEXT_PUBLIC_API_URL` (127.0.0.1:3000 in e2e) — Playwright * `page.route` cannot intercept that. `global-setup` serves these shapes so * `/e/:slug` and `/e/:uuid` render instead of 404. */ export const E2E_PAYMENT_EVENT_ID = '11111111-1111-4111-8111-111111111111' export const E2E_PAYMENT_EVENT_SLUG = 'e2e-payment-event' export const E2E_WAITLIST_EVENT_ID = '22222222-2222-4222-8222-222222222222' export const E2E_WAITLIST_EVENT_SLUG = 'e2e-full-event' export const E2E_KEEPALIVE_EVENT_ID = '33333333-3333-4333-8333-333333333333' export const E2E_KEEPALIVE_EVENT_SLUG = 'demo-event' const baseEvent = (overrides: Record = {}) => ({ id: E2E_PAYMENT_EVENT_ID, organizerId: 'organizer-1', categoryId: 10, categoryName: 'ورزشی', cityName: 'تهران', title: 'رویداد تست پرداخت', slug: E2E_PAYMENT_EVENT_SLUG, shortDescription: 'توضیح کوتاه', description: 'توضیح کامل', startsAt: '2030-01-01T10:00:00.000Z', endsAt: '2030-01-01T12:00:00.000Z', provinceId: 1, cityId: 2, address: 'تهران', lat: 35.7, lng: 51.4, isFree: false, price: 100_000, capacity: 20, bookedCount: 1, reservedCapacity: 0, status: 'published', isFeatured: false, posterUrl: null, avgRating: null, reviewsCount: 0, genderRestriction: null, ageRestriction: null, settings: { isDiscoverable: true, addressVisibility: 'public' as const, generalArea: null, }, ...overrides, }) export const e2ePaymentEvent = (title = 'رویداد تست پرداخت') => baseEvent({ title }) export const e2eWaitlistEvent = () => baseEvent({ id: E2E_WAITLIST_EVENT_ID, slug: E2E_WAITLIST_EVENT_SLUG, title: 'رویداد تکمیل ظرفیت', status: 'full', capacity: 10, bookedCount: 10, settings: { isDiscoverable: true, autoCreateGroup: true, addressVisibility: 'public', generalArea: null, waitlistAutoOffer: true, }, }) export const e2eKeepAliveEvent = () => baseEvent({ id: E2E_KEEPALIVE_EVENT_ID, slug: E2E_KEEPALIVE_EVENT_SLUG, title: 'ایونت تست keep-alive', price: 0, isFree: true, }) const landingOrganizer = { id: 'organizer-1', firstName: 'سارا', lastName: 'احمدی', avatarUrl: null, gender: 'female' as const, followersCount: 0, pastEventsCount: 0, contactLinks: [] as { channel: string; label: string; url: string }[], } export const e2eEventLandingBootstrap = (event: ReturnType) => ({ event, category: { id: 10, name: 'ورزشی', slug: 'sports' }, city: { id: 2, name: 'تهران' }, media: [], faqs: [], organizer: landingOrganizer, reviews: [], reviewsTotal: 0, }) export const e2eDiscoveryCities = [{ id: 1, provinceId: 8, name: 'تهران', slug: 'tehran' }] export const e2eEmptyHomeFeed = { popular: [] as unknown[], categoryPreviews: [] as unknown[], cityPreviews: [] as unknown[], } /** Resolve SSR GETs used by consumer home + event landing during Playwright. */ export function matchConsumerE2eMockGet(pathname: string): { status: number; body: unknown } | null { if (pathname === '/api/v1/discovery/cities') { return { status: 200, body: { success: true, data: e2eDiscoveryCities } } } if (pathname === '/api/v1/discovery/categories') { return { status: 200, body: { success: true, data: [] } } } if (pathname === '/api/v1/discovery/home-feed') { return { status: 200, body: { success: true, data: e2eEmptyHomeFeed } } } if (pathname === `/api/v1/events/by-slug/${E2E_PAYMENT_EVENT_SLUG}/bootstrap`) { return { status: 200, body: { success: true, data: e2eEventLandingBootstrap(e2ePaymentEvent()) } } } if (pathname === `/api/v1/events/by-slug/${E2E_WAITLIST_EVENT_SLUG}/bootstrap`) { return { status: 200, body: { success: true, data: e2eEventLandingBootstrap(e2eWaitlistEvent()) } } } if (pathname === `/api/v1/events/by-slug/${E2E_KEEPALIVE_EVENT_SLUG}/bootstrap`) { return { status: 200, body: { success: true, data: e2eEventLandingBootstrap(e2eKeepAliveEvent()) } } } if (pathname === `/api/v1/events/${E2E_PAYMENT_EVENT_ID}`) { return { status: 200, body: { success: true, data: e2ePaymentEvent() } } } if (pathname === `/api/v1/events/${E2E_WAITLIST_EVENT_ID}`) { return { status: 200, body: { success: true, data: e2eWaitlistEvent() } } } if (pathname === `/api/v1/events/${E2E_KEEPALIVE_EVENT_ID}`) { return { status: 200, body: { success: true, data: e2eKeepAliveEvent() } } } return null }