dc654167e5
Подключил порт-модули лимитов (creativeLimits/urlRule/imageRule/imageMeta) к CreativeForm.vue: живые счётчики и ошибки длин заголовка/второго заголовка/текста, живая проверка ссылки, проверка картинки до отправки (imageError через readImageMeta+checkImage). Текст объявления стал обязательным (звёздочка в лейбле + блок сабмита пустого текста). Добавил humanizeCreativeErrors.ts (TDD, тест до кода) — заменяет технические имена полей (title/title2/text/href/image) в сообщениях 422 от сервера на русские подписи; подключил в CreativeForm через humanFieldErrors. Баг двоения v-file-input не трогал — отдельная задача. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
47 lines
2.8 KiB
TypeScript
47 lines
2.8 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { humanizeMessage } from '../../resources/js/lib/advertising/humanizeCreativeErrors';
|
|
|
|
/**
|
|
* humanizeMessage — заменяет технические имена полей (title/title2/text/href/image)
|
|
* в сообщениях 422 от сервера (B1 CreativeValidator) на русские подписи полей формы.
|
|
*/
|
|
describe('humanizeCreativeErrors — humanizeMessage', () => {
|
|
it('заменяет "в поле title" на "в поле «Заголовок»"', () => {
|
|
const result = humanizeMessage('Количество символов в поле title не может превышать 56.');
|
|
expect(result).not.toMatch(/\btitle\b/);
|
|
expect(result).toContain('«Заголовок»');
|
|
expect(result).toBe('Количество символов в поле «Заголовок» не может превышать 56.');
|
|
});
|
|
|
|
it('заменяет "Поле text" на "Поле «Текст объявления»"', () => {
|
|
const result = humanizeMessage('Поле text обязательно для заполнения.');
|
|
expect(result).not.toMatch(/\btext\b/);
|
|
expect(result).toContain('«Текст объявления»');
|
|
expect(result).toBe('Поле «Текст объявления» обязательно для заполнения.');
|
|
});
|
|
|
|
it('заменяет "Поле href" на "Поле «Ссылка на сайт»"', () => {
|
|
const result = humanizeMessage('Поле href должно содержать корректный URL.');
|
|
expect(result).not.toMatch(/\bhref\b/);
|
|
expect(result).toContain('«Ссылка на сайт»');
|
|
expect(result).toBe('Поле «Ссылка на сайт» должно содержать корректный URL.');
|
|
});
|
|
|
|
it('заменяет "в поле title2" на "в поле «Второй заголовок»"', () => {
|
|
const result = humanizeMessage('Значение в поле title2 некорректно.');
|
|
expect(result).not.toMatch(/\btitle2\b/);
|
|
expect(result).toContain('«Второй заголовок»');
|
|
});
|
|
|
|
it('заменяет "Поле image" на "Поле «Картинка»"', () => {
|
|
const result = humanizeMessage('Поле image обязательно для заполнения.');
|
|
expect(result).not.toMatch(/\bimage\b/);
|
|
expect(result).toContain('«Картинка»');
|
|
});
|
|
|
|
it('не трогает сообщение без известного технического имени поля', () => {
|
|
const result = humanizeMessage('Внутренняя ошибка сервера.');
|
|
expect(result).toBe('Внутренняя ошибка сервера.');
|
|
});
|
|
});
|