- real Mantine login form -> POST /api/auth/login; 401 inline error; redirect when already authed - ProtectedRoute: loading state, preserves intended destination, gates force_password_change - ChangePasswordPage forced-change gate -> POST /api/auth/password - logout control in AppLayout nav -> POST /api/auth/logout - typed client only; vitest tests for the login flow
39 lines
1.3 KiB
TypeScript
39 lines
1.3 KiB
TypeScript
/**
|
|
* Vitest global setup file.
|
|
* Imports @testing-library/jest-dom to extend vitest matchers with DOM assertions.
|
|
*
|
|
* Also polyfills browser APIs that jsdom does not implement but Mantine needs:
|
|
* - window.matchMedia (Mantine uses it for color-scheme detection)
|
|
* - ResizeObserver (Mantine uses it for responsive components)
|
|
*/
|
|
import '@testing-library/jest-dom'
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// window.matchMedia polyfill (jsdom does not implement this)
|
|
// ---------------------------------------------------------------------------
|
|
Object.defineProperty(window, 'matchMedia', {
|
|
writable: true,
|
|
value: (query: string) => ({
|
|
matches: false,
|
|
media: query,
|
|
onchange: null,
|
|
addListener: () => {},
|
|
removeListener: () => {},
|
|
addEventListener: () => {},
|
|
removeEventListener: () => {},
|
|
dispatchEvent: () => false,
|
|
}),
|
|
})
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// ResizeObserver polyfill (jsdom does not implement this)
|
|
// ---------------------------------------------------------------------------
|
|
if (typeof ResizeObserver === 'undefined') {
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
;(globalThis as any).ResizeObserver = class ResizeObserver {
|
|
observe() {}
|
|
unobserve() {}
|
|
disconnect() {}
|
|
}
|
|
}
|