test(team): Render-Harness, 151 neue Tests und README
Vorher gab es im Repo kein Muster für Komponententests — @testing-library/react wurde ausschliesslich für renderHook verwendet. test/teamTestUtils.tsx stellt den fehlenden Kontext bereit (Router, MUI-Theme, frischer QueryClient je Test). test/setup.ts registriert jetzt afterEach(cleanup). vitest.config.ts setzt `globals` nicht, deshalb erkennt Testing Library kein globales afterEach und richtet sein automatisches Cleanup nie ein; ohne diese Zeile stapeln sich gerenderte Komponenten und getByRole scheitert ab dem zweiten Test einer Datei. Abgedeckt: Kennzahlenberechnung, Freigabe-, Zurückweisungs-, Anpassungs- und Rückfrageprozess, lokale Persistenz samt Schemaversion und Demo-Reset, Badge-Familie, Vorgangs- und Agentenkarte, Aufgaben-Aktivierung, Einstellungsvalidierung und die Position des Navigationseintrags. Die Tests haben fünf echte Mängel aufgedeckt, alle in diesem Commit behoben: - AgentAvatar hatte keinen zugänglichen Namen. MUI reicht `alt` nur an den img-Slot weiter, und ohne `src` rendert Avatar gar kein <img> — der Wert landete nirgends im DOM. Jetzt role="img" + aria-label direkt am Element. - WorkItemCard verschluckte objectLabel, wenn keine objectId gesetzt war. Genau dort steht bei zuordnungsfreien Vorgängen die entscheidende Einordnung. - aria-current rendert nicht mehr "false", sondern entfällt. - AgentChannelBadge war auf `string` statt AgentChannelType typisiert. 414 Tests grün (vorher 263), Build grün, ESLint über den Property-On-Code sauber, check:tokens unverändert bei 2249. README ersetzt das unveränderte Vite-Template durch Startanleitung und die Architekturentscheidungen samt bekannter Altlasten. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
78e2dab655
commit
a7e05fb7f0
6 files changed
+539
-64
No files matched your search
@@ -1 +1,12 @@
|
||||
import '@testing-library/jest-dom/vitest'
|
||||
import { afterEach } from 'vitest'
|
||||
import { cleanup } from '@testing-library/react'
|
||||
|
||||
/**
|
||||
* `vitest.config.ts` setzt `globals` nicht, deshalb erkennt Testing Library kein
|
||||
* globales `afterEach` und registriert sein automatisches Cleanup nicht. Ohne
|
||||
* diese Zeile bleiben gerenderte Komponenten über Testgrenzen hinweg im
|
||||
* Dokument stehen, und `getByRole(...)` scheitert ab dem zweiten Test einer
|
||||
* Datei an «found multiple elements».
|
||||
*/
|
||||
afterEach(cleanup)
|
||||
@@ -0,0 +1,60 @@
|
||||
/**
|
||||
* Render-Harness für Property-On-Komponenten.
|
||||
*
|
||||
* Vor Property On gab es im Repo kein Muster für Komponententests —
|
||||
* `@testing-library/react` wurde ausschliesslich für `renderHook` verwendet.
|
||||
* Diese Datei stellt den fehlenden Kontext bereit: Router (die Komponenten
|
||||
* navigieren), MUI-Theme (sx-Werte greifen auf Theme-Tokens zu) und einen
|
||||
* frischen QueryClient je Test, damit sich Tests nicht über den Cache
|
||||
* gegenseitig beeinflussen.
|
||||
*/
|
||||
|
||||
import type { ReactElement, ReactNode } from 'react'
|
||||
import { render } from '@testing-library/react'
|
||||
import type { RenderOptions, RenderResult } from '@testing-library/react'
|
||||
import { MemoryRouter } from 'react-router'
|
||||
import { ThemeProvider } from '@mui/material/styles'
|
||||
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
|
||||
import { theme } from '../lib/theme'
|
||||
|
||||
export function createTestQueryClient(): QueryClient {
|
||||
return new QueryClient({
|
||||
defaultOptions: {
|
||||
queries: { retry: false, gcTime: 0, staleTime: 0 },
|
||||
mutations: { retry: false },
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
interface Options extends Omit<RenderOptions, 'wrapper'> {
|
||||
route?: string
|
||||
queryClient?: QueryClient
|
||||
}
|
||||
|
||||
export function renderWithProviders(
|
||||
ui: ReactElement,
|
||||
{ route = '/', queryClient = createTestQueryClient(), ...options }: Options = {},
|
||||
): RenderResult & { queryClient: QueryClient } {
|
||||
function Wrapper({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<ThemeProvider theme={theme}>
|
||||
<MemoryRouter initialEntries={[route]}>{children}</MemoryRouter>
|
||||
</ThemeProvider>
|
||||
</QueryClientProvider>
|
||||
)
|
||||
}
|
||||
|
||||
return { ...render(ui, { wrapper: Wrapper, ...options }), queryClient }
|
||||
}
|
||||
|
||||
/** Wrapper für `renderHook` — gleiche Provider, ohne Router-Overhead im Ergebnis. */
|
||||
export function hookWrapper(queryClient: QueryClient = createTestQueryClient()) {
|
||||
return function Wrapper({ children }: { children: ReactNode }) {
|
||||
return (
|
||||
<QueryClientProvider client={queryClient}>
|
||||
<MemoryRouter>{children}</MemoryRouter>
|
||||
</QueryClientProvider>
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user