Files
tnsu-approval-route/frontend/src/webparts/approvalAdmin/routing.test.ts
T
gorbenko.pavel 1ee1b71e3e
Tests / frontend-test (push) Successful in 45s
Tests / backend-test (push) Successful in 7m18s
Редактирование заявок у конкретного пользователя (#14)
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/14
2026-08-19 12:58:07 +00:00

153 lines
7.3 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 { RouteStepStatus } from './models';
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,
manageByUser: 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', listId: '' });
});
it('manageRequests с aamlist — партиция заявки читается в manage.listId', () => {
const route = parseRoute('?aatab=manageRequests&aamtype=5&aamreq=42&aamlist=%2Fsites%2Fx%2FLists%2FForm2');
expect(route.manage).toEqual({ requestTypeId: '5', requestId: '42', listId: '/sites/x/Lists/Form2' });
});
it('manageRequests без aamreq — manage не собирается (id заявки обязателен)', () => {
const route = parseRoute('?aatab=manageRequests&aamtype=5');
expect(route.manage).toBeUndefined();
});
it('manageByUser с aabuser — email сотрудника читается в manageByUser', () => {
const route = parseRoute('?aatab=manageByUser&aabuser=ivanov%40tnsu.kz');
expect(route.tab).toBe('manageByUser');
expect(route.manageByUser).toEqual({ userEmail: 'ivanov@tnsu.kz', targetEmail: '' });
});
it('manageByUser с aabtarget — читается и тот, кем заменяют', () => {
const route = parseRoute('?aatab=manageByUser&aabuser=ivanov%40tnsu.kz&aabtarget=petrov%40tnsu.kz');
expect(route.manageByUser).toEqual({ userEmail: 'ivanov@tnsu.kz', targetEmail: 'petrov@tnsu.kz' });
});
it('aabtarget без aabuser игнорируется — сам по себе он экран не определяет', () => {
expect(parseRoute('?aatab=manageByUser&aabtarget=petrov%40tnsu.kz').manageByUser).toBeUndefined();
});
it('aabuser учитывается только при tab=manageByUser', () => {
expect(parseRoute('?aatab=dashboard&aabuser=ivanov%40tnsu.kz').manageByUser).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('aarfilter учитывается только при tab=routes', () => {
expect(parseRoute('?aatab=routes&aarfilter=11').routesFilter).toBe('11');
expect(parseRoute('?aatab=manageRequests&aarfilter=11').routesFilter).toBeUndefined();
});
// Фильтр живёт и при открытых шагах: возврат «к маршрутам» должен вернуть
// к тому же отфильтрованному списку (см. AdminApp.onBack).
it('aarfilter читается вместе с aaroute', () => {
const route = parseRoute('?aatab=routes&aaroute=7&aarfilter=11');
expect(route.routeId).toBe(7);
expect(route.routesFilter).toBe('11');
});
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();
});
it('resolve.departmentId читается из aadept (шаг «Руководитель указанного отдела»)', () => {
const route = parseRoute('?aatab=resolve&aartype=1&aadept=00000000-0000-0000-0000-0000000000aa');
expect(route.resolve?.departmentId).toBe('00000000-0000-0000-0000-0000000000aa');
});
it('resolve.departmentId пустой, если aadept не передан', () => {
const route = parseRoute('?aatab=resolve&aartype=1');
expect(route.resolve?.departmentId).toBe('');
});
});
describe('navigate', () => {
it('после navigate() параметры читаются обратно тем же parseRoute (round-trip)', () => {
navigate({ tab: 'manageRequests', manage: { requestTypeId: '3', requestId: '10', listId: '/sites/x/Lists/Form' } });
const roundTripped = parseRoute(window.location.search);
expect(roundTripped.tab).toBe('manageRequests');
expect(roundTripped.manage).toEqual({ requestTypeId: '3', requestId: '10', listId: '/sites/x/Lists/Form' });
});
it('navigate на dashboard полностью убирает параметры вкладки из адреса', () => {
navigate({ tab: 'manageRequests', manage: { requestTypeId: '3', requestId: '10', listId: '/sites/x/Lists/Form' } });
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);
});
it('round-trip для manageByUser (оба сотрудника)', () => {
navigate({ tab: 'manageByUser', manageByUser: { userEmail: 'ivanov@tnsu.kz', targetEmail: 'petrov@tnsu.kz' } });
const roundTripped = parseRoute(window.location.search);
expect(roundTripped.tab).toBe('manageByUser');
expect(roundTripped.manageByUser).toEqual({ userEmail: 'ivanov@tnsu.kz', targetEmail: 'petrov@tnsu.kz' });
});
it('round-trip для resolve.departmentId', () => {
navigate({
tab: 'resolve',
resolve: {
requestTypeId: '1',
userEmail: '',
projectId: '',
projectLabel: '',
status: RouteStepStatus.Approval,
fieldValues: [],
departmentId: '00000000-0000-0000-0000-0000000000aa'
}
});
const roundTripped = parseRoute(window.location.search);
expect(roundTripped.resolve?.departmentId).toBe('00000000-0000-0000-0000-0000000000aa');
});
});