Files
Orchestrator/privat/CV/andreknie.de/src/utils/validation.test.js
T

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()
})
})