test(260924-m4n): flackernden Marktplatz-Test entschaerfen, act-Warnungen der Proxmox-Kachel weg

- tenant-selector: Komponenten statisch statt im Test dynamisch importiert
  (Laden zaehlte in die 5-s-Frist des ersten Tests), SUPER_ADMIN/ADMIN in
  zwei it aufgetrennt
- marketplace/marketplace-filters: gleiche Umstellung; userEvent an die
  falsche Uhr gekoppelt statt auf shouldAdvanceTime zu warten
- proxmox-widget: Rendern wartet das erste Laden in act() ab (81 Warnungen weg)
- Todo 2026-09-23 nach completed/

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-24 16:02:45 +02:00
parent dd09c08311
commit b10734f382
5 changed files with 73 additions and 59 deletions
@@ -12,6 +12,9 @@ import type { ReactElement } from 'react';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import type { ProxmoxMetrics, ProxmoxServer } from '@/lib/proxmox-api';
import de from '@/messages/de.json';
// Statisch importiert (vi.mock wird darueber gehoben) — das Laden faellt in die
// Sammelphase, nicht in die Frist des ersten Tests (quick-260924-m4n).
import { ProxmoxWidget } from './proxmox-widget';
// Echter next-intl-Provider mit den deutschen Texten (Muster
// proxmox-page-roles.test.tsx) — die Kachel braucht ICU-Plural und useLocale.
@@ -119,17 +122,27 @@ function makeServer(
};
}
/**
* Rendert die Kachel und wartet INNERHALB von act() das Ende des ersten
* Ladens ab (aufgeloestes listServers-Versprechen -> setServers/setLoadFailed/
* setNow). Ohne das liefen diese Zustandsaenderungen nach dem Rendern ins Leere
* und React meldete je Test drei „not wrapped in act(...)“-Warnungen
* (quick-260924-m4n).
*/
async function renderWidget(
props: { config?: Record<string, unknown>; isEditMode?: boolean } = {},
) {
const { ProxmoxWidget } = await import('./proxmox-widget');
return render(
<ProxmoxWidget
instanceId="w-1"
config={props.config ?? {}}
isEditMode={props.isEditMode ?? false}
/>,
);
let result!: ReturnType<typeof render>;
await act(async () => {
result = render(
<ProxmoxWidget
instanceId="w-1"
config={props.config ?? {}}
isEditMode={props.isEditMode ?? false}
/>,
);
});
return result;
}
beforeEach(() => {
@@ -617,13 +630,15 @@ describe('ProxmoxWidget: Bearbeitungsmodus mit Titel und Serverauswahl (quick-26
it('Verlassen des Bearbeitungsmodus schliesst die Auswahl', async () => {
mockListServers.mockResolvedValue([makeServer('ok')]);
const { ProxmoxWidget } = await import('./proxmox-widget');
const ui = (isEditMode: boolean) => (
<NextIntlClientProvider locale="de" messages={de} timeZone="Europe/Berlin">
<ProxmoxWidget instanceId="w-1" config={{}} isEditMode={isEditMode} />
</NextIntlClientProvider>
);
const { rerender } = rtlRender(ui(true));
let rerender!: ReturnType<typeof rtlRender>['rerender'];
await act(async () => {
({ rerender } = rtlRender(ui(true)));
});
await screen.findByTestId('proxmox-summary');
fireEvent.click(screen.getByRole('button', { name: 'Server auswählen' }));