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 });