1ee1b71e3e
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz> Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/14
153 lines
7.3 KiB
TypeScript
153 lines
7.3 KiB
TypeScript
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');
|
||
});
|
||
});
|