import { describe, it, expect } from 'vitest' import { readFileSync } from 'node:fs' import { resolve } from 'node:path' const eventsDir = resolve(import.meta.dirname, '../../../server/api/events/[id]') describe('register.post.js', () => { const source = readFileSync(resolve(eventsDir, 'register.post.js'), 'utf-8') it('uses validateBody for input validation', () => { expect(source).toContain('validateBody(event') }) it('checks for duplicate registration with case-insensitive email', () => { expect(source).toContain('email.toLowerCase()') }) it('checks membersOnly restriction', () => { expect(source).toContain('membersOnly') }) it('checks capacity via maxAttendees', () => { expect(source).toContain('maxAttendees') }) it('does not let email failure block registration', () => { // The await call (not the import) must be wrapped in try/catch const emailCallIndex = source.indexOf('await sendEventRegistrationEmail') expect(emailCallIndex).toBeGreaterThan(-1) // A try block immediately precedes the email call const precedingSource = source.slice(0, emailCallIndex) const lastTryIndex = precedingSource.lastIndexOf('try') expect(lastTryIndex).toBeGreaterThan(-1) // The catch after the email call should log but not re-throw const afterEmail = source.slice(emailCallIndex) const catchBlock = afterEmail.match(/catch\s*\(\w+\)\s*\{[^}]*\}/s) expect(catchBlock).not.toBeNull() expect(catchBlock[0]).toContain('console.error') }) }) describe('guest-register.post.js', () => { const source = readFileSync(resolve(eventsDir, 'guest-register.post.js'), 'utf-8') it('uses validateBody for input validation', () => { expect(source).toContain('validateBody(event') }) it('checks membersOnly restriction with 403', () => { expect(source).toContain('membersOnly') expect(source).toContain('403') }) it('checks payment requirement with 402', () => { expect(source).toContain('paymentRequired') expect(source).toContain('402') }) it('checks capacity via maxAttendees', () => { expect(source).toContain('maxAttendees') }) it('does not require auth', () => { expect(source).not.toContain('requireAuth') }) }) describe('cancel-registration.post.js', () => { const source = readFileSync(resolve(eventsDir, 'cancel-registration.post.js'), 'utf-8') it('uses validateBody for input validation', () => { expect(source).toContain('validateBody(event') }) it('finds registration by email', () => { expect(source).toContain('email.toLowerCase()') }) it('notifies waitlist after cancellation', () => { expect(source).toContain('waitlist') expect(source).toContain('sendWaitlistNotificationEmail') }) it('does not require auth', () => { expect(source).not.toContain('requireAuth') }) })