Files
hr-appeals/src/features/feedback/model.test.ts
T
gorbenko.pavel 49bf9b3c4e fix: переименовать вид обращения "Жалоба" в "Обращение"
Обновлены label в KIND_OPTIONS, комментарии и placeholder ФИО в форме.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 11:13:23 +05:00

50 lines
2.8 KiB
TypeScript

import { COMPANY_OPTIONS, getAppealFieldsConfig } from './model';
// Форма (AppealSection) и валидация (validateFeedback) читают одно и то же
// правило из getAppealFieldsConfig — если оно разойдётся, форма и валидация
// начнут спорить друг с другом. Эти тесты фиксируют контракт правила.
describe('getAppealFieldsConfig', () => {
it('обращение: описание обязательно, предложение показано, но необязательно', () => {
const fields = getAppealFieldsConfig('complaint');
expect(fields.situation).toEqual({ visible: true, required: true });
expect(fields.suggestion).toEqual({ visible: true, required: false });
});
it('предложение: описания ситуации нет вовсе, само предложение обязательно', () => {
const fields = getAppealFieldsConfig('suggestion');
expect(fields.situation).toEqual({ visible: false, required: false });
expect(fields.suggestion).toEqual({ visible: true, required: true });
});
it('другое: обязательно только описание, предложения не показываем', () => {
const fields = getAppealFieldsConfig('other');
expect(fields.situation).toEqual({ visible: true, required: true });
expect(fields.suggestion).toEqual({ visible: false, required: false });
});
it('обязательное поле не может быть скрыто ни для одного вида обращения', () => {
// Форма не сможет попросить исправить поле, которого не видно на экране —
// required: true при visible: false — это несогласованная настройка.
(['complaint', 'suggestion', 'other'] as const).forEach((kind) => {
const fields = getAppealFieldsConfig(kind);
expect(fields.situation.required && !fields.situation.visible).toBe(false);
expect(fields.suggestion.required && !fields.suggestion.visible).toBe(false);
});
});
});
// Справочник компаний используется бэкендом по Id (см. комментарий в model.ts) —
// дубликат Id незаметно перепутал бы два разных юрлица.
describe('COMPANY_OPTIONS', () => {
it('не содержит повторяющихся Id', () => {
const ids = COMPANY_OPTIONS.map((option) => option.value);
expect(new Set(ids).size).toBe(ids.length);
});
it('у каждой компании есть непустое название', () => {
COMPANY_OPTIONS.forEach((option) => {
expect(option.label.trim().length).toBeGreaterThan(0);
});
});
});