normalizeBelarusPhone/phoneError/formatBelarusPhone: любые форматы ввода → +375XXXXXXXXX, коды 25/29/33/44/17, подсказки по причине ошибки. validateLead: типы POST /api/lead, ошибки по полям, honeypot, очистка касаний. Тесты Vitest.
89 lines
3.4 KiB
TypeScript
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();
|
|
});
|
|
});
|