diff --git a/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.test.tsx b/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.test.tsx index 317de8d..d0953aa 100644 --- a/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.test.tsx +++ b/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.test.tsx @@ -7,6 +7,8 @@ vi.mock('next-intl', () => ({ const translations: Record = { 'card.unknownValue': 'unbekannt', 'card.lastPolledLabel': 'Letzte Abfrage', + 'card.notPolledYet': 'Noch keine Abfrage gelaufen. Klicken Sie oben auf „{refreshLabel}“.', + 'card.refresh': 'Jetzt aktualisieren', 'card.lastOkLabel': 'Letzte erfolgreiche Messung', 'card.pve.nodeCount': 'Knoten', 'card.pve.guests': '{running} laufend / {stopped} gestoppt', @@ -252,4 +254,45 @@ describe('ServerCard', () => { expect(screen.getByText(/Letzte Abfrage/)).toBeInTheDocument(); }); + + it('Nachbesserung Befund 2: ein frisch angelegter, noch nie abgefragter Server zeigt den ruhigen Hinweis statt "Ein unerwarteter Fehler ist aufgetreten"', async () => { + const { ServerCard } = await import('./ServerCard'); + // Zustand direkt nach `createServer`: leere Zwischenlagerzeile, noch nie abgefragt. + const server = makeServer({ + status: { + id: 's1', + serverId: 'srv-1', + lastPolledAt: null, + lastOkAt: null, + reachable: false, + errorKind: null, + errorDetail: null, + rawSample: null, + updatedAt: '2026-09-23T10:00:00.000Z', + metrics: null, + }, + }); + + render(); + + expect( + screen.getByText('Noch keine Abfrage gelaufen. Klicken Sie oben auf „Jetzt aktualisieren“.'), + ).toBeInTheDocument(); + // Ohne die Korrektur erschiene hier faelschlich die Sammelmeldung — roter Test. + expect(screen.queryByText('Unerwarteter Fehler.')).not.toBeInTheDocument(); + }); + + it('Nachbesserung Befund 3: die Adresse bleibt unveraendert dargestellt, nur das Produktkuerzel ist grossgeschrieben', async () => { + const { ServerCard } = await import('./ServerCard'); + const server = makeServer({ baseUrl: 'https://172.21.0.1:8006' }); + + render(); + + const line = screen.getByText(/172\.21\.0\.1:8006/); + expect(line).toHaveTextContent('pve — https://172.21.0.1:8006'); + const productSpan = line.querySelector('span'); + expect(productSpan).not.toBeNull(); + expect(productSpan).toHaveClass('uppercase'); + expect(line).not.toHaveClass('uppercase'); + }); }); diff --git a/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.tsx b/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.tsx index ba6e403..5084238 100644 --- a/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.tsx +++ b/apps/web/src/app/(portal)/modules/proxmox/components/ServerCard.tsx @@ -162,8 +162,9 @@ export function ServerCard({ server }: ServerCardProps) {
{server.name}
-
- {server.productType} — {server.baseUrl} + {/* Nachbesserung Befund 3: `uppercase` gilt nur dem Produktkuerzel, nicht der Adresse. */} +
+ {server.productType} — {server.baseUrl}
@@ -172,7 +173,20 @@ export function ServerCard({ server }: ServerCardProps) { {t('card.lastPolledLabel')}: {formatTimestamp(status?.lastPolledAt ?? null, unknown)}
- {status && !status.reachable && ( + {/* + Nachbesserung Befund 2: ein Server, der noch nie abgefragt wurde + (`lastPolledAt === null`), zeigt einen ruhigen Hinweis statt der + Fehlermeldung — die leere Zwischenlagerzeile aus `createServer` hat + `reachable: false` und `errorKind: null`, was sonst faelschlich als + "unbekannter Fehler" erschien. + */} + {status && !status.lastPolledAt && ( +

+ {t('card.notPolledYet', { refreshLabel: t('card.refresh') })} +

+ )} + + {status?.lastPolledAt && !status.reachable && (

{errorMessage(t, status.errorKind)} diff --git a/apps/web/src/messages/de.json b/apps/web/src/messages/de.json index 86bb4d0..6dd0303 100644 --- a/apps/web/src/messages/de.json +++ b/apps/web/src/messages/de.json @@ -712,6 +712,7 @@ "card": { "unknownValue": "unbekannt", "lastPolledLabel": "Letzte Abfrage", + "notPolledYet": "Noch keine Abfrage gelaufen. Klicken Sie oben auf „{refreshLabel}“.", "lastOkLabel": "Letzte erfolgreiche Messung", "refresh": "Jetzt aktualisieren", "refreshing": "Wird aktualisiert...", diff --git a/apps/web/src/messages/en.json b/apps/web/src/messages/en.json index c6b936b..1f67f97 100644 --- a/apps/web/src/messages/en.json +++ b/apps/web/src/messages/en.json @@ -712,6 +712,7 @@ "card": { "unknownValue": "unknown", "lastPolledLabel": "Last poll", + "notPolledYet": "No poll has run yet. Click \"{refreshLabel}\" above.", "lastOkLabel": "Last successful measurement", "refresh": "Refresh now", "refreshing": "Refreshing...",