Files
tnsu-approval-route/frontend/src/webparts/approvalAdmin/routing.test.ts
T
gorbenko.pavel a60d1d774d
Tests / frontend-test (pull_request) Successful in 47s
Tests / backend-test (pull_request) Successful in 1m40s
тесты
2026-08-07 14:38:12 +05:00

75 lines
3.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { navigate, parseRoute } from './routing';
// buildQuery/navigate читают/пишут window.location через history API — сбрасываем
// адрес перед каждым тестом, чтобы тесты не зависели от порядка запуска.
beforeEach(() => {
window.history.replaceState({}, '', '/');
});
describe('parseRoute', () => {
it('без aatab — вкладка по умолчанию dashboard, всё остальное пусто', () => {
expect(parseRoute('')).toEqual({ tab: 'dashboard', routeId: undefined, resolve: undefined, manage: undefined });
});
it('незнакомое значение aatab тоже откатывается на dashboard', () => {
expect(parseRoute('?aatab=bogus-tab').tab).toBe('dashboard');
});
it('manageRequests с aamtype+aamreq — даёт заполненный manage', () => {
const route = parseRoute('?aatab=manageRequests&aamtype=5&aamreq=42');
expect(route.tab).toBe('manageRequests');
expect(route.manage).toEqual({ requestTypeId: '5', requestId: '42' });
});
it('manageRequests без aamreq — manage не собирается (id заявки обязателен)', () => {
const route = parseRoute('?aatab=manageRequests&aamtype=5');
expect(route.manage).toBeUndefined();
});
it('aaroute учитывается только при tab=routes', () => {
expect(parseRoute('?aatab=routes&aaroute=7').routeId).toBe(7);
expect(parseRoute('?aatab=manageRequests&aaroute=7').routeId).toBeUndefined();
});
it('нечисловой/отсутствующий aaroute — routeId не задан', () => {
expect(parseRoute('?aatab=routes&aaroute=not-a-number').routeId).toBeUndefined();
expect(parseRoute('?aatab=routes').routeId).toBeUndefined();
});
it('resolve.fieldValues парсит валидный JSON-массив', () => {
const fields = encodeURIComponent(JSON.stringify([{ fieldName: 'Amount', value: '100' }]));
const route = parseRoute(`?aatab=resolve&aartype=1&aafields=${fields}`);
expect(route.resolve?.fieldValues).toEqual([{ fieldName: 'Amount', value: '100' }]);
});
it('resolve.fieldValues на битом JSON не роняет парсинг маршрута — просто пустой массив', () => {
const route = parseRoute('?aatab=resolve&aartype=1&aafields=not-json');
expect(route.resolve?.fieldValues).toEqual([]);
});
it('resolve не собирается без requestTypeId, даже если tab=resolve', () => {
expect(parseRoute('?aatab=resolve').resolve).toBeUndefined();
});
});
describe('navigate', () => {
it('после navigate() параметры читаются обратно тем же parseRoute (round-trip)', () => {
navigate({ tab: 'manageRequests', manage: { requestTypeId: '3', requestId: '10' } });
const roundTripped = parseRoute(window.location.search);
expect(roundTripped.tab).toBe('manageRequests');
expect(roundTripped.manage).toEqual({ requestTypeId: '3', requestId: '10' });
});
it('navigate на dashboard полностью убирает параметры вкладки из адреса', () => {
navigate({ tab: 'manageRequests', manage: { requestTypeId: '3', requestId: '10' } });
navigate({ tab: 'dashboard' });
expect(window.location.search).toBe('');
});
it('дописывает новую запись в историю (pushState, а не replaceState)', () => {
const initialLength = window.history.length;
navigate({ tab: 'requestTypes' });
expect(window.history.length).toBe(initialLength + 1);
});
});