import { describe, expect, it } from 'vitest'; import { formatBelarusPhone, normalizeBelarusPhone, phoneError } from './phone'; describe('normalizeBelarusPhone', () => { it.each([ ['+375 (29) 123-45-67', '+375291234567'], ['375291234567', '+375291234567'], ['+375291234567', '+375291234567'], ['8 029 123 45 67', '+375291234567'], ['80291234567', '+375291234567'], ['8 (029) 123-45-67', '+375291234567'], ['029 1234567', '+375291234567'], ['29 123 45 67', '+375291234567'], ['291234567', '+375291234567'], ['+375 25 765-43-21', '+375257654321'], ['+375 33 111 22 33', '+375331112233'], ['+375 44 999-88-77', '+375449998877'], ['+375 17 222-33-44', '+375172223344'], [' +375 29 012-34-56 ', '+375290123456'], ])('%s → %s', (input, expected) => { expect(normalizeBelarusPhone(input)).toBe(expected); }); it.each([ '', ' ', '+7 912 345-67-89', '+48 512 345 678', '+375 24 123-45-67', '+375 15 123-45-67', '+375 29 123-45-6', '+375 29 123-45-678', '12345', 'abc', '++375291234567', '375 29 123 45 67 89', ])('отклоняет %j', (input) => { expect(normalizeBelarusPhone(input)).toBeNull(); }); }); describe('phoneError', () => { it('нет ошибки для валидного номера', () => { expect(phoneError('8 029 123 45 67')).toBeNull(); }); it('пустое поле', () => { expect(phoneError(' ')).toBe('Укажите телефон — по нему перезвоним'); }); it('другая страна', () => { expect(phoneError('+7 912 345-67-89')).toBe('Нужен белорусский номер: +375…'); expect(phoneError('+48 512 345 678')).toBe('Нужен белорусский номер: +375…'); expect(phoneError('8 912 345-67-89')).toBe('Нужен белорусский номер: +375…'); expect(phoneError('79123456789')).toBe('Нужен белорусский номер: +375…'); expect(phoneError('4851234567890')).toBe('Нужен белорусский номер: +375…'); }); it('неизвестный код оператора', () => { expect(phoneError('+375 24 123-45-67')).toBe('Проверьте код оператора: 25, 29, 33, 44 или 17'); expect(phoneError('80241234567')).toBe('Проверьте код оператора: 25, 29, 33, 44 или 17'); }); it('неверная длина', () => { expect(phoneError('+375 29 123-45-6')).toBe('После кода нужно 7 цифр'); expect(phoneError('+375 29 123-45-678')).toBe('После кода нужно 7 цифр'); expect(phoneError('29 123')).toBe('После кода нужно 7 цифр'); expect(phoneError('29 1234 5678')).toBe('После кода нужно 7 цифр'); }); it('мусор без цифр', () => { expect(phoneError('abc')).toBe('Нужен белорусский номер: +375…'); }); }); describe('formatBelarusPhone', () => { it('форматирует нормализованный номер', () => { expect(formatBelarusPhone('+375291234567')).toBe('+375 29 123-45-67'); }); it('форматирует любой валидный ввод', () => { expect(formatBelarusPhone('80291234567')).toBe('+375 29 123-45-67'); }); it('возвращает null для невалидного', () => { expect(formatBelarusPhone('123')).toBeNull(); }); });