import { beforeEach, describe, expect, it, vi } from 'vitest'; import { NextRequest } from 'next/server'; import { GET } from '../app/api/group-rides/route'; const state = vi.hoisted(() => ({ rides: [] as Array<{ id: string; data: () => Record; ref: unknown }> })); vi.mock('../lib/firebase-admin', () => ({ getAdminAuth: () => ({ verifyIdToken: async () => ({ uid: 'viewer' }) }), getAdminFirestore: () => ({ collection: (name: string) => { if (name === 'users') return { doc: () => ({ collection: () => ({ get: async () => ({ docs: [] }), doc: () => ({ get: async () => ({ exists: false }) }) }) }) }; const query = { where: () => query, orderBy: () => query, limit: () => query, get: async () => ({ docs: state.rides }) }; return query; } }), })); beforeEach(() => { state.rides = []; }); describe('community personal ride schema', () => { it('discovers both absent and null clubId while excluding club-affiliated rides', async () => { for (const [id, extra] of [['absent', {}], ['null', { clubId: null }], ['club', { clubId: 'real-club' }]] as const) { state.rides.push({ id, data: () => ({ title: id, organizerUid: 'organizer', visibility: 'public', status: 'scheduled', scheduledStartAt: new Date(Date.now() + 86_400_000).toISOString(), ...extra }), ref: { collection: () => ({ doc: () => ({ get: async () => ({ data: () => undefined }) }) }) } }); } const response = await GET(new NextRequest('http://localhost/api/group-rides', { headers: { authorization: 'Bearer isolated-token' } })); expect(response.status).toBe(200); expect((await response.json()).rides.map((ride: { id: string }) => ride.id)).toEqual(['absent', 'null']); }); });