import { describe, it, expect } from 'vitest' import { validateEmail, validateContact, validateTalkRequest, validateNewsletter, validateResourceDownload, } from './validation.js' describe('validateEmail', () => { it('accepts valid emails', () => { expect(validateEmail('user@example.com')).toBe(true) expect(validateEmail('a.b@sub.domain.org')).toBe(true) }) it('rejects invalid emails', () => { expect(validateEmail('')).toBe(false) expect(validateEmail('no-at-sign')).toBe(false) expect(validateEmail('@missing-local.com')).toBe(false) expect(validateEmail('spaces in@email.com')).toBe(false) }) }) describe('validateContact', () => { const valid = { name: 'Max', email: 'max@example.com', message: 'Hello' } it('passes with valid data', () => { const result = validateContact(valid) expect(result.valid).toBe(true) expect(result.errors).toEqual({}) }) it('fails without name', () => { const result = validateContact({ ...valid, name: '' }) expect(result.valid).toBe(false) expect(result.errors.name).toBeTruthy() }) it('fails without email', () => { const result = validateContact({ ...valid, email: '' }) expect(result.valid).toBe(false) expect(result.errors.email).toBeTruthy() }) it('fails without message', () => { const result = validateContact({ ...valid, message: '' }) expect(result.valid).toBe(false) expect(result.errors.message).toBeTruthy() }) it('fails with name over 100 chars', () => { const result = validateContact({ ...valid, name: 'x'.repeat(101) }) expect(result.valid).toBe(false) expect(result.errors.name).toBeTruthy() }) it('fails with message over 2000 chars', () => { const result = validateContact({ ...valid, message: 'x'.repeat(2001) }) expect(result.valid).toBe(false) expect(result.errors.message).toBeTruthy() }) }) describe('validateTalkRequest', () => { const valid = { name: 'Max', email: 'max@example.com', event_name: 'Conference 2026', topic: 'KI im Mittelstand', message: 'Interested in a keynote', } it('passes with valid data', () => { const result = validateTalkRequest(valid) expect(result.valid).toBe(true) }) it('fails without event_name', () => { const result = validateTalkRequest({ ...valid, event_name: '' }) expect(result.valid).toBe(false) expect(result.errors.event_name).toBeTruthy() }) it('fails without topic', () => { const result = validateTalkRequest({ ...valid, topic: '' }) expect(result.valid).toBe(false) expect(result.errors.topic).toBeTruthy() }) }) describe('validateNewsletter', () => { it('passes with valid email', () => { const result = validateNewsletter({ email: 'user@test.com' }) expect(result.valid).toBe(true) }) it('fails with invalid email', () => { const result = validateNewsletter({ email: 'bad' }) expect(result.valid).toBe(false) expect(result.errors.email).toBeTruthy() }) }) describe('validateResourceDownload', () => { const valid = { name: 'Max', email: 'max@example.com', company: 'Test GmbH', resource_id: 'speaker-cv', } it('passes with valid data', () => { const result = validateResourceDownload(valid) expect(result.valid).toBe(true) }) it('fails without company', () => { const result = validateResourceDownload({ ...valid, company: '' }) expect(result.valid).toBe(false) expect(result.errors.company).toBeTruthy() }) it('fails without resource_id', () => { const result = validateResourceDownload({ ...valid, resource_id: '' }) expect(result.valid).toBe(false) expect(result.errors.resource_id).toBeTruthy() }) it('fails for a resource id that could escape the resource naming scheme', () => { const result = validateResourceDownload({ ...valid, resource_id: '../profile' }) expect(result.valid).toBe(false) expect(result.errors.resource_id).toBeTruthy() }) })