diff --git a/apps/web/src/components/bug-report/bug-report-button.test.tsx b/apps/web/src/components/bug-report/bug-report-button.test.tsx index 8e85627..f7282e6 100644 --- a/apps/web/src/components/bug-report/bug-report-button.test.tsx +++ b/apps/web/src/components/bug-report/bug-report-button.test.tsx @@ -91,6 +91,27 @@ beforeEach(() => { vi.stubGlobal('fetch', mockFetch); }); +/** + * Groesse von `document.body` vortaeuschen. WICHTIG: `Object.defineProperty` + * legt eine eigene Eigenschaft auf dem Element an, die den Getter von + * `Element.prototype` verdeckt — `document.body` ueberlebt `cleanup()` und + * damit die ganze Datei. Ohne Ruecknahme saehen alle folgenden Tests 3200x1000. + * Deshalb merken und in `afterEach` wieder loeschen. + */ +let bodyGroesseVorgetaeuscht = false; +function stubBodyGroesse(scrollWidth: number, scrollHeight: number) { + Object.defineProperty(document.body, 'scrollWidth', { value: scrollWidth, configurable: true }); + Object.defineProperty(document.body, 'scrollHeight', { value: scrollHeight, configurable: true }); + bodyGroesseVorgetaeuscht = true; +} + +function restoreBodyGroesse() { + if (!bodyGroesseVorgetaeuscht) return; + Reflect.deleteProperty(document.body, 'scrollWidth'); + Reflect.deleteProperty(document.body, 'scrollHeight'); + bodyGroesseVorgetaeuscht = false; +} + function clearDesktopCookies() { document.cookie = 'tessera_desktop=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/'; document.cookie = 'tessera_desktop_client=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/'; @@ -100,15 +121,21 @@ afterEach(() => { cleanup(); clearErrorBuffer(); clearDesktopCookies(); + restoreBodyGroesse(); vi.unstubAllGlobals(); }); describe('BugReportButton (quick-260914-m97)', () => { it('Test 1: Bild VOR dem Dialog — toPng laeuft ohne offenen Dialog, mit document.body, pixelRatio 1, skipFonts, 1600-px-Kante; danach Dialog mit Vorschau, Haekchen an, Textfeld leer', async () => { - Object.defineProperty(document.body, 'scrollWidth', { value: 3200, configurable: true }); - Object.defineProperty(document.body, 'scrollHeight', { value: 1000, configurable: true }); + stubBodyGroesse(3200, 1000); + // Kein `expect` INNERHALB der Attrappe: ein Fehler daraus landet mitten im + // `await` der Komponente und wird von `captureScreenshot` verschluckt + // (`catch` liefert `null`) — der Test waere dann an ganz anderer Stelle + // mit irrefuehrender Meldung durchgefallen. Also nur festhalten, unten + // pruefen (quick-260921-ldf). + let dialogWaehrendDerAufnahme: unknown = 'toPng wurde nicht aufgerufen'; mockToPng.mockImplementation(async () => { - expect(screen.queryByRole('dialog')).toBeNull(); + dialogWaehrendDerAufnahme = screen.queryByRole('dialog'); return DATA_URL; }); const user = userEvent.setup(); @@ -117,6 +144,7 @@ describe('BugReportButton (quick-260914-m97)', () => { const dialog = await openDialog(user); expect(mockToPng).toHaveBeenCalledTimes(1); + expect(dialogWaehrendDerAufnahme).toBeNull(); const [node, opts] = mockToPng.mock.calls[0] as [unknown, Record]; expect(node).toBe(document.body); expect(opts).toMatchObject({ pixelRatio: 1, skipFonts: true, canvasWidth: 1600, canvasHeight: 500 });