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(['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); }); });