From 5e5752dcd50cbdcd08c0a422ee3cebfb1e82db8b Mon Sep 17 00:00:00 2001 From: Schalli Date: Fri, 9 Oct 2026 21:14:56 +0200 Subject: [PATCH] test(domains): Live-Bestaetigung im Test robust oeffnen Im CI blieb der Bestaetigungsdialog nach dem ersten Klick vereinzelt aus (Laeufe 513, 514, 518), lokal auch unter Last nie nachstellbar. Der Test wartet jetzt auf die geladenen Einstellungen und wiederholt den Klick, bis der Dialog steht; ein zweiter Klick speichert nichts. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../modules/domains/domains-page.test.tsx | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/apps/web/src/app/(portal)/modules/domains/domains-page.test.tsx b/apps/web/src/app/(portal)/modules/domains/domains-page.test.tsx index ee857a3..54e5a0b 100644 --- a/apps/web/src/app/(portal)/modules/domains/domains-page.test.tsx +++ b/apps/web/src/app/(portal)/modules/domains/domains-page.test.tsx @@ -173,6 +173,22 @@ function contactList(): DomainsContactList { }; } +/** + * Klickt „Live-System“, bis der Bestaetigungsdialog steht. Ein erneuter Klick oeffnet nur + * denselben Dialog und speichert nichts (siehe Kommentar im Test „Wechsel auf Live“). + */ +async function openLiveDialog(): Promise { + return waitFor( + () => { + if (!screen.queryByRole('alertdialog')) { + fireEvent.click(screen.getByRole('radio', { name: /Live-System \(kostenpflichtig\)/ })); + } + return screen.getByRole('alertdialog'); + }, + { timeout: 5000, interval: 100 }, + ); +} + /** Oeffnet den Reiter Einstellungen (Standardreiter ist Domains). */ async function renderSettings() { render(); @@ -275,10 +291,12 @@ describe('Einstellungen', () => { it('Wechsel auf Live verlangt Bestaetigung; erst die bestaetigte Speicherung sendet confirmLive', async () => { mockSaveSettings.mockResolvedValue(settings({ environment: 'LIVE' })); await renderSettings(); - const liveRadio = await screen.findByRole('radio', { name: /Live-System \(kostenpflichtig\)/ }); - fireEvent.click(liveRadio); - - const dialog = await screen.findByRole('alertdialog'); + // Im CI blieb der Dialog nach dem ersten Klick vereinzelt aus (Laeufe 513, 514, 518 am + // 09.10.2026), lokal nie nachstellbar, auch nicht unter Last. Darum: erst warten, bis die + // Einstellungen geladen sind, und den Klick wiederholen, bis der Dialog steht. Ein erneuter + // Klick auf „Live“ oeffnet nur wieder denselben Dialog und speichert nichts. + await screen.findByPlaceholderText('Gespeichert – leer lassen, um es beizubehalten'); + const dialog = await openLiveDialog(); expect(within(dialog).getByText(/kosten Geld/)).toBeTruthy(); expect(mockSaveSettings).not.toHaveBeenCalled(); @@ -291,11 +309,8 @@ describe('Einstellungen', () => { .checked, ).toBe(true); - fireEvent.click(screen.getByRole('radio', { name: /Live-System \(kostenpflichtig\)/ })); fireEvent.click( - within(await screen.findByRole('alertdialog')).getByRole('button', { - name: 'Live-System verwenden', - }), + within(await openLiveDialog()).getByRole('button', { name: 'Live-System verwenden' }), ); await waitFor(() => expect(mockSaveSettings).toHaveBeenCalledTimes(1)); expect(mockSaveSettings).toHaveBeenCalledWith({ environment: 'LIVE', confirmLive: true });