import { act, fireEvent, render, screen } from '@testing-library/react'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; // Mock next-intl vi.mock('next-intl', () => ({ useTranslations: () => (key: string) => { const map: Record = { 'note.defaultTitle': 'Notiz', 'note.autosaveError': 'Speichern fehlgeschlagen', }; return map[key] ?? key; }, })); // quick-260916-j4f: gehobener Themenzustand, damit die Variable trotz // Hoisting der Mocks und des statischen Imports weiter unten sicher // initialisiert ist (Muster changelog-page.test.tsx). const themeMock = vi.hoisted(() => ({ resolvedTheme: 'light' as 'light' | 'dark' })); vi.mock('next-themes', () => ({ useTheme: () => ({ resolvedTheme: themeMock.resolvedTheme }), })); // Mock @uiw/react-md-editor — provide a minimal textarea-based substitute. // Im Modus 'preview' wird stattdessen ein Vorschau-Div gerendert, das fuer // jede Aufgabenzeile ein Kaestchen enthaelt (quick-260916-iex) — nutzt die // echte `components.input`-Komponente aus `previewOptions`, wenn vorhanden, // damit auch NoteCheckbox im Klickpfad landet. const TASK_MOCK_RE = /^\s*(?:[-*+]|\d+[.)])\s+\[([ xX])\]\s+\S/; vi.mock('@uiw/react-md-editor', () => { const MDEditor = ({ value, onChange, preview, previewOptions, 'data-testid': testId, }: { value?: string; onChange?: (val?: string) => void; preview?: string; previewOptions?: { components?: { input?: React.ComponentType<{ checked?: boolean }> } }; 'data-testid'?: string; }) => { if (preview === 'preview') { const InputComponent = previewOptions?.components?.input; const lines = (value ?? '').split('\n'); return (
{lines.map((line, i) => { const match = line.match(TASK_MOCK_RE); if (!match) return null; const checked = match[1] !== ' '; return InputComponent ? ( ) : ( ); })}
); } return (