@openmrs/esm-styleguide
Version:
The styleguide for OpenMRS SPA
133 lines (127 loc) • 3.8 kB
text/typescript
import { describe, expect, it } from 'vitest';
import { shouldCloseOnUrlChange } from './scope-utils';
describe('shouldCloseOnUrlChange', () => {
it.each([
// Static patterns (no capture groups)
[
'stays open: both URLs match',
'^/home/appointments',
'http://localhost/home/appointments',
'http://localhost/home/appointments',
false,
],
[
'stays open: navigating within scope',
'^/home/appointments',
'http://localhost/home/appointments',
'http://localhost/home/appointments/scheduled',
false,
],
[
'closes: navigating away from scope',
'^/home/appointments',
'http://localhost/home/appointments',
'http://localhost/home/service-queues',
true,
],
[
'closes: old URL outside scope',
'^/home/appointments',
'http://localhost/home/service-queues',
'http://localhost/home/appointments',
true,
],
[
'closes: neither URL in scope',
'^/home/appointments',
'http://localhost/home/service-queues',
'http://localhost/patient/123/chart',
true,
],
// Capture groups (patient chart)
[
'stays open: same patient, different tab',
'^/patient/([^/]+)/chart',
'http://localhost/patient/abc-123/chart/vitals',
'http://localhost/patient/abc-123/chart/conditions',
false,
],
[
'stays open: same patient chart URL',
'^/patient/([^/]+)/chart',
'http://localhost/patient/abc-123/chart',
'http://localhost/patient/abc-123/chart',
false,
],
[
'closes: different patient',
'^/patient/([^/]+)/chart',
'http://localhost/patient/abc-123/chart',
'http://localhost/patient/def-456/chart',
true,
],
[
'closes: leaving patient chart',
'^/patient/([^/]+)/chart',
'http://localhost/patient/abc-123/chart',
'http://localhost/home/appointments',
true,
],
[
'closes: entering patient chart',
'^/patient/([^/]+)/chart',
'http://localhost/home/appointments',
'http://localhost/patient/abc-123/chart',
true,
],
// Multiple capture groups
[
'stays open: all captures match',
'^/ward/([^/]+)/patient/([^/]+)',
'http://localhost/ward/w1/patient/p1/details',
'http://localhost/ward/w1/patient/p1/vitals',
false,
],
[
'closes: first capture differs',
'^/ward/([^/]+)/patient/([^/]+)',
'http://localhost/ward/w1/patient/p1',
'http://localhost/ward/w2/patient/p1',
true,
],
[
'closes: second capture differs',
'^/ward/([^/]+)/patient/([^/]+)',
'http://localhost/ward/w1/patient/p1',
'http://localhost/ward/w1/patient/p2',
true,
],
// Query params and hash are ignored
[
'stays open: query param change',
'^/home/appointments',
'http://localhost/home/appointments?tab=scheduled',
'http://localhost/home/appointments?tab=completed',
false,
],
[
'stays open: hash change',
'^/home/appointments',
'http://localhost/home/appointments#s1',
'http://localhost/home/appointments#s2',
false,
],
// Edge cases
['closes: invalid regex (safety fallback)', '[invalid', 'http://localhost/home', 'http://localhost/home', true],
[
'stays open: relative URLs within scope',
'^/home/appointments',
'/home/appointments',
'/home/appointments/details',
false,
],
['closes: relative URLs leaving scope', '^/home/appointments', '/home/appointments', '/home/service-queues', true],
])('%s', (_desc, pattern, oldUrl, newUrl, expected) => {
expect(shouldCloseOnUrlChange(pattern, oldUrl, newUrl)).toBe(expected);
});
});