Workers P2: Prüfstand um Ausfall-Szenario erweitert (503, 401-Folge, hängende Verbindung, versteckter Tab)

Endprüfung P2. Die Zustände des Boards bei Ausfall des Dienstes und der Wechsel zwischen sichtbarem und verstecktem Tab
waren nur über Quelltext-Muster geprüft. Der Prüfstand (?fault=none|down|session|hang) schaltet jetzt den echten
API-Client hinter eine Fetch-Weiche (scripted-fetch.js, mit Node-Tests). Szenario F in shot.cjs prüft im Browser:
Hinweis mit „Neu laden“ bei 503 beim Öffnen und Rückkehr, Warnzeile „Verbindung gestört“ im Betrieb, versteckter Tab
(keine Abrufe, keine Bilder, beim Zurückkehren sofort beides), dauerhaftes 401 (höchstens ein frisches JWT, Meldung
„Anmeldung abgelaufen“, Erholung ohne neues Anmelden) und eine Antwort, die nie kommt (Zeitgrenze). Das Handy-Szenario
prüft zusätzlich Auswahl aus der Liste (Karte im Fenster, Fokus) und Fokus nach „Karte schließen“.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-18 05:41:03 +00:00
1 parent 84fb37a98e
commit aceb558564
4 files changed
+230 -3

No files matched your search

+20 -2
View File
@@ -1,6 +1,9 @@
// Einstiegspunkt des Prüfstands: das Hochhaus-Board der Hustler-Seite mit der Skript-API, ohne Anmeldung und ohne Appwrite.
// Drumherum steht dieselbe Hülle wie in der App (Menüleiste links, Seitenrand), damit die Bühne genauso breit wird wie im echten Betrieb.
// ?halted=1 startet mit gesetzter Bounce-Notbremse (H4). window.__wk gibt es nur hier: die Bühne und die Skript-API für shot.cjs.
// ?fault=none|down|session|hang schaltet zwischen Board und Skript-API den echten API-Client (createWorkersApi) mit einer Fetch-Weiche
// (scripted-fetch.js): window.__wk.control.fault lässt sich zur Laufzeit auf null | 'down' | 'session' | 'hang' setzen (Ausfall-Szenario).
// Ohne den Parameter bekommt das Board die Skript-API direkt (Szenarien A bis E).
import { StrictMode, createRef } from 'react'
import { createRoot } from 'react-dom/client'
import { MemoryRouter } from 'react-router-dom'
@@ -8,12 +11,27 @@ import '../../src/styles/global.css'
import '../../src/styles/workers.css'
import PageHeader from '../../src/components/ui/PageHeader'
import WorkersBoard from '../../src/components/workers/WorkersBoard'
import { createWorkersApi } from '../../src/lib/workersApi.js'
import { createScriptedApi } from './scripted-api.js'
import { createScriptedFetch } from './scripted-fetch.js'
const params = new URLSearchParams(window.location.search)
const scripted = createScriptedApi({ now: () => performance.now(), base: Date.now(), halted: params.get('halted') === '1' })
const stage = createRef()
window.__wk = { stage, api: scripted }
const fault = params.get('fault')
const control = { fault: fault && fault !== 'none' ? fault : null, calls: [], jwts: [] }
// Zeitgrenze im Prüfstand kurz (1,5 s statt 20 s), damit der Ausfall „Antwort kommt nie“ in Sekunden sichtbar wird
const api = fault === null
? scripted
: createWorkersApi({
getJwt: async (options) => {
control.jwts.push(Boolean(options && options.fresh))
return 'harness-jwt'
},
fetchImpl: createScriptedFetch(scripted, control),
timeoutMs: 1500,
})
window.__wk = { stage, api: scripted, control }
createRoot(document.getElementById('root')).render(
<StrictMode>
@@ -24,7 +42,7 @@ createRoot(document.getElementById('root')).render(
<main id="inhalt">
<div className="page wk-page">
<PageHeader title="Hustler" subtitle="Die Nachtschicht deiner Claude-Armee" />
<WorkersBoard api={scripted} isAdmin stageRef={stage} />
<WorkersBoard api={api} isAdmin stageRef={stage} />
</div>
</main>
</div>