import { formatCurrency, validateStep } from '../utils'; import { EMPTY_FORM_DATA, VALID_STEP1_DATA, VALID_STEP2_DATA } from './helpers'; import { FormData } from '../types'; describe('formatCurrency', () => { it('should format 0 as £0', () => { expect(formatCurrency(0)).toBe('£0'); }); it('should format large numbers with comma separators', () => { expect(formatCurrency(50000)).toBe('£50,000'); }); it('should format mid-range numbers', () => { expect(formatCurrency(1500)).toBe('£1,500'); }); }); describe('validateStep', () => { describe('step 1 - personal details', () => { it('should return errors for all empty fields', () => { const result = validateStep(1, EMPTY_FORM_DATA); expect(result.isValid).toBe(false); expect(result.errors.firstName).toBeDefined(); expect(result.errors.lastName).toBeDefined(); expect(result.errors.telephone).toBeDefined(); expect(result.errors.email).toBeDefined(); }); it('should pass with valid data', () => { const data: FormData = { ...EMPTY_FORM_DATA, ...VALID_STEP1_DATA }; const result = validateStep(1, data); expect(result.isValid).toBe(true); expect(Object.keys(result.errors)).toHaveLength(0); }); it('should return error for invalid email', () => { const data: FormData = { ...EMPTY_FORM_DATA, ...VALID_STEP1_DATA, email: 'not-an-email' }; const result = validateStep(1, data); expect(result.isValid).toBe(false); expect(result.errors.email).toBe('Please enter a valid email address'); }); it('should return error for invalid phone', () => { const data: FormData = { ...EMPTY_FORM_DATA, ...VALID_STEP1_DATA, telephone: 'abc' }; const result = validateStep(1, data); expect(result.isValid).toBe(false); expect(result.errors.telephone).toBe( 'Please enter a valid telephone number' ); }); it('should trim whitespace-only fields', () => { const data: FormData = { ...EMPTY_FORM_DATA, firstName: ' ', lastName: ' ' }; const result = validateStep(1, data); expect(result.isValid).toBe(false); expect(result.errors.firstName).toBeDefined(); expect(result.errors.lastName).toBeDefined(); }); }); describe('step 2 - trip details', () => { it('should return errors for all empty fields', () => { const result = validateStep(2, EMPTY_FORM_DATA); expect(result.isValid).toBe(false); expect(result.errors.departurePort).toBeDefined(); expect(result.errors.destination).toBeDefined(); expect(result.errors.month).toBeDefined(); expect(result.errors.year).toBeDefined(); expect(result.errors.duration).toBeDefined(); expect(result.errors.adults).toBeDefined(); expect(result.errors.children).toBeDefined(); }); it('should pass with valid data', () => { const data: FormData = { ...EMPTY_FORM_DATA, ...VALID_STEP2_DATA }; const result = validateStep(2, data); expect(result.isValid).toBe(true); expect(Object.keys(result.errors)).toHaveLength(0); }); }); describe('step 3 - budget & extras', () => { it('should always pass (no required fields)', () => { const result = validateStep(3, EMPTY_FORM_DATA); expect(result.isValid).toBe(true); expect(Object.keys(result.errors)).toHaveLength(0); }); }); describe('unknown step', () => { it('should return valid for an unknown step number', () => { const result = validateStep(99, EMPTY_FORM_DATA); expect(result.isValid).toBe(true); }); }); });