Тесты и анимация кнопок (#4)
Tests / frontend-test (push) Successful in 1m9s

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/timur.gorodetskiy/request-portal/pulls/4
This commit was merged in pull request #4.
This commit is contained in:
2026-08-07 11:53:48 +00:00
parent 3a15d83ded
commit f6f4872a7c
9 changed files with 905 additions and 13 deletions
@@ -0,0 +1,66 @@
import {
APPROVAL_PHASE,
APPROVAL_PHASE_CHOICES,
APPROVAL_ROW_STATUS_CHOICES,
EDITABLE_STATUSES,
REQUEST_STATUS,
REQUEST_STATUS_CHOICES,
isEditableStatus,
} from './statuses';
describe('isEditableStatus', () => {
it('новая заявка (статуса ещё нет) — редактируема', () => {
expect(isEditableStatus(undefined)).toBe(true);
expect(isEditableStatus('')).toBe(true);
});
it('черновик/возвращена/отклонена — редактируемы (можно доработать и переотправить)', () => {
expect(isEditableStatus(REQUEST_STATUS.draft)).toBe(true);
expect(isEditableStatus(REQUEST_STATUS.returned)).toBe(true);
expect(isEditableStatus(REQUEST_STATUS.rejected)).toBe(true);
});
it('заявка в работе или завершённая — только чтение', () => {
expect(isEditableStatus(REQUEST_STATUS.onApproval)).toBe(false);
expect(isEditableStatus(REQUEST_STATUS.approved)).toBe(false);
expect(isEditableStatus(REQUEST_STATUS.execution)).toBe(false);
expect(isEditableStatus(REQUEST_STATUS.closed)).toBe(false);
});
it('незнакомый статус считается нередактируемым (безопасный дефолт)', () => {
expect(isEditableStatus('какой-то новый статус')).toBe(false);
});
});
// Наборы Choice-значений держатся в синхроне с provisioning.json списков —
// расхождение ломает запись (SharePoint отвергает значение вне Choice).
describe('наборы Choice-значений', () => {
it('все редактируемые статусы существуют в REQUEST_STATUS', () => {
const known = Object.keys(REQUEST_STATUS).map((k) => REQUEST_STATUS[k as keyof typeof REQUEST_STATUS]);
EDITABLE_STATUSES.forEach((s) => expect(known).toContain(s));
});
it('редактируемые статусы — подмножество статусов ЗАЯВКИ', () => {
EDITABLE_STATUSES.forEach((s) => expect(REQUEST_STATUS_CHOICES).toContain(s));
});
it('в статусах ЗАЯВКИ нет состояний отдельного шага маршрута', () => {
expect(REQUEST_STATUS_CHOICES).not.toContain(REQUEST_STATUS.queued);
expect(REQUEST_STATUS_CHOICES).not.toContain(REQUEST_STATUS.onExecution);
expect(REQUEST_STATUS_CHOICES).not.toContain(REQUEST_STATUS.executed);
});
it('в статусах СТРОКИ МАРШРУТА нет агрегатных состояний заявки', () => {
expect(APPROVAL_ROW_STATUS_CHOICES).not.toContain(REQUEST_STATUS.execution);
expect(APPROVAL_ROW_STATUS_CHOICES).not.toContain(REQUEST_STATUS.closed);
});
it('оба набора статусов без повторов', () => {
expect(new Set(REQUEST_STATUS_CHOICES).size).toBe(REQUEST_STATUS_CHOICES.length);
expect(new Set(APPROVAL_ROW_STATUS_CHOICES).size).toBe(APPROVAL_ROW_STATUS_CHOICES.length);
});
it('фазы маршрута перечислены полностью', () => {
expect(APPROVAL_PHASE_CHOICES).toEqual([APPROVAL_PHASE.approval, APPROVAL_PHASE.execution]);
});
});