Files
kvarta_project/packages/shared/src/phone.test.ts
T
nunuchek a2885d180c feat(shared): нормализация белорусского телефона и контракт заявки
normalizeBelarusPhone/phoneError/formatBelarusPhone: любые форматы ввода
→ +375XXXXXXXXX, коды 25/29/33/44/17, подсказки по причине ошибки.
validateLead: типы POST /api/lead, ошибки по полям, honeypot, очистка
касаний. Тесты Vitest.
2026-10-17 15:34:23 +03:00

89 lines
3.4 KiB
TypeScript

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