71 lines
2.2 KiB
TypeScript
71 lines
2.2 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
|
|
import { parseDashboardFilters, setDashboardQuery, type DashboardRange } from './dashboard-filters';
|
|
|
|
describe('dashboard filters', () => {
|
|
const terminals = ['T83', 'T84'];
|
|
|
|
it('uses safe, shareable defaults for invalid query values', () => {
|
|
const query = new URLSearchParams('range=year&terminal=someone-elses-terminal&minAmount=-1');
|
|
|
|
expect(parseDashboardFilters(query, terminals)).toEqual({
|
|
range: 'month',
|
|
period: '',
|
|
terminal: 'all',
|
|
status: 'all',
|
|
minAmount: null,
|
|
maxAmount: null,
|
|
});
|
|
});
|
|
|
|
it.each<DashboardRange>(['day', 'week', 'month', 'season'])(
|
|
'keeps the %s range in the copied URL',
|
|
(range) => {
|
|
const next = setDashboardQuery(new URL('https://example.test/transactions?terminal=T83'), {
|
|
range,
|
|
});
|
|
|
|
expect(next.searchParams.get('range')).toBe(range);
|
|
expect(next.searchParams.get('terminal')).toBe('T83');
|
|
},
|
|
);
|
|
|
|
it('keeps an offered reporting period in the copied URL without dropping other filters', () => {
|
|
const filters = parseDashboardFilters(
|
|
new URLSearchParams('range=month&period=jm-1405-05&terminal=T83&status=Verified'),
|
|
terminals,
|
|
);
|
|
|
|
expect(filters.period).toBe('jm-1405-05');
|
|
|
|
const next = setDashboardQuery(
|
|
new URL('https://example.test/transactions?range=month&terminal=T83&status=Verified'),
|
|
{ period: filters.period },
|
|
);
|
|
|
|
expect(next.searchParams.get('period')).toBe('jm-1405-05');
|
|
expect(next.searchParams.get('range')).toBe('month');
|
|
expect(next.searchParams.get('terminal')).toBe('T83');
|
|
expect(next.searchParams.get('status')).toBe('Verified');
|
|
});
|
|
|
|
it('rejects reporting period identifiers outside the server formats', () => {
|
|
const filters = parseDashboardFilters(
|
|
new URLSearchParams('range=day&period=javascript:alert(1)'),
|
|
terminals,
|
|
);
|
|
|
|
expect(filters.period).toBe('');
|
|
});
|
|
|
|
it('normalizes an inverted amount range', () => {
|
|
const filters = parseDashboardFilters(
|
|
new URLSearchParams('minAmount=900000&maxAmount=100000'),
|
|
terminals,
|
|
);
|
|
|
|
expect(filters.minAmount).toBe(100000);
|
|
expect(filters.maxAmount).toBe(900000);
|
|
});
|
|
});
|