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:
1 parent
84fb37a98e
commit
aceb558564
4 files changed
+230
-3
No files matched your search
@@ -118,3 +118,55 @@ test('scripted api: Spur mit 12 Ereignissen (unsicherer und sicherer Link), Tage
|
||||
assert.deepEqual(await api.pult('offen'), { items: [] })
|
||||
assert.deepEqual(await api.botleads({}), { items: [], total: 0 })
|
||||
})
|
||||
|
||||
// ---- Endprüfung P2: Fetch-Weiche des Prüfstands (echter API-Client gegen die Skript-API, mit Ausfall-Schalter) ----
|
||||
|
||||
const { createScriptedFetch } = await loadModule('scripts/workers-harness/scripted-fetch.js')
|
||||
const { createWorkersApi } = await loadModule('src/lib/workersApi.js')
|
||||
|
||||
function wired(fault = null, extra = {}) {
|
||||
const control = { fault, calls: [], jwts: [] }
|
||||
const scripted = createScriptedApi({ now: () => 0 })
|
||||
const api = createWorkersApi({
|
||||
getJwt: async (o) => {
|
||||
control.jwts.push(o?.fresh === true)
|
||||
return 'harness-jwt'
|
||||
},
|
||||
fetchImpl: createScriptedFetch(scripted, control),
|
||||
...extra,
|
||||
})
|
||||
return { control, scripted, api }
|
||||
}
|
||||
|
||||
test('Fetch-Weiche gesund: der echte API-Client erreicht Zustand, Ereignisse, Spur, Pause und Einstellungen der Skript-API', async () => {
|
||||
const { control, scripted, api } = wired()
|
||||
assert.equal((await api.state()).workers.length, 19)
|
||||
assert.deepEqual(await api.events(null, 5), { events: [] })
|
||||
assert.equal((await api.trace('kim')).worker.name, 'Kim')
|
||||
assert.deepEqual(await api.pause(true), { paused: true })
|
||||
assert.equal((await api.state()).paused, true)
|
||||
assert.equal((await api.settings()).paused, true)
|
||||
await api.saveSettings({ sendingHalted: false })
|
||||
assert.deepEqual(scripted.saved, [{ sendingHalted: false }])
|
||||
await assert.rejects(api.trace('gibt-es-nicht'), { message: 'Diesen Hustler gibt es nicht.', status: 404 })
|
||||
assert.deepEqual(control.calls.map((c) => c.path).slice(0, 3), ['/state', '/events', '/worker/kim/trace'])
|
||||
assert.ok(control.calls.every((c) => c.jwt === 'harness-jwt'))
|
||||
})
|
||||
|
||||
test('Fetch-Weiche down: 503 ohne JSON ergibt die Dienst-Meldung, session: 401 ergibt die Anmelde-Meldung, danach nur ein createJWT je Sperre', async () => {
|
||||
const down = wired('down')
|
||||
await assert.rejects(down.api.state(), { message: 'Der Hustler-Dienst ist gerade nicht erreichbar.', status: 503 })
|
||||
const session = wired('session')
|
||||
for (let i = 0; i < 6; i += 1) await assert.rejects(session.api.events(null), { message: 'Anmeldung abgelaufen. Bitte neu anmelden.', status: 401 })
|
||||
assert.equal(session.control.jwts.filter(Boolean).length, 1)
|
||||
assert.equal(session.control.calls.length, 7) // 1 Versuch + 1 Wiederholung, dann je Aufruf eine Anfrage
|
||||
// Schalter zurück: der Dienst nimmt das JWT wieder an, ohne dass etwas neu erzeugt wird
|
||||
session.control.fault = null
|
||||
assert.equal((await session.api.state()).workers.length, 19)
|
||||
assert.equal(session.control.jwts.filter(Boolean).length, 1)
|
||||
})
|
||||
|
||||
test('Fetch-Weiche hang: die Antwort kommt nie, der API-Client gibt nach der Zeitgrenze auf', async () => {
|
||||
const { api } = wired('hang', { timeoutMs: 40 })
|
||||
await assert.rejects(api.state(), { message: 'Der Hustler-Dienst ist gerade nicht erreichbar.', status: 0 })
|
||||
})
|
||||
Reference in new issue
Block a user