import { describe, it, expect } from 'vitest' import { validateAmount, validateIban, isValidSaudiIban, validateMerchant } from './validate' describe('validateAmount', () => { it('accepts a valid 2-decimal amount', () => expect(validateAmount('150.50')).toBeUndefined()) it('accepts an integer amount', () => expect(validateAmount('200')).toBeUndefined()) it('rejects empty', () => expect(validateAmount('')).toBe('error.amountEmpty')) it('rejects zero', () => expect(validateAmount('0')).toBe('error.amountZero')) it('rejects negative', () => expect(validateAmount('-5')).toBe('error.amountInvalid')) it('rejects non-numeric', () => expect(validateAmount('abc')).toBe('error.amountInvalid')) it('rejects >2 decimals', () => expect(validateAmount('1.234')).toBe('error.amountInvalid')) it('rejects too large', () => expect(validateAmount('2000000')).toBe('error.amountTooLarge')) it('rejects lone dot', () => expect(validateAmount('.')).toBe('error.amountInvalid')) }) describe('Saudi IBAN', () => { const VALID = 'SA0380000000608010167519' it('accepts a valid Saudi IBAN', () => expect(isValidSaudiIban(VALID)).toBe(true)) it('accepts with spaces', () => expect(isValidSaudiIban('SA03 8000 0000 6080 1016 7519')).toBe(true)) it('rejects wrong checksum', () => expect(isValidSaudiIban('SA0380000000608010167518')).toBe(false)) it('rejects wrong country', () => expect(isValidSaudiIban('GB0380000000608010167519')).toBe(false)) it('rejects short', () => expect(isValidSaudiIban('SA038000')).toBe(false)) it('validateIban maps invalid -> key', () => expect(validateIban('SA00')).toBe('error.ibanInvalid')) it('validateIban maps empty -> key', () => expect(validateIban('')).toBe('error.payeeEmpty')) it('validateIban passes valid', () => expect(validateIban(VALID)).toBeUndefined()) }) describe('validateMerchant', () => { it('rejects empty', () => expect(validateMerchant(' ')).toBe('error.merchantEmpty')) it('accepts text', () => expect(validateMerchant('Blue Bottle')).toBeUndefined()) })