135 lines
3.9 KiB
JavaScript
135 lines
3.9 KiB
JavaScript
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()
|
|
})
|
|
})
|