Läuft komplett gegen gemockten Backend (e2e/mockApi.ts, page.route) - kein echtes Backend/DB nötig, playwright.config.ts startet npm run dev automatisch. Deckt Login-Erfolg/-Fehler, 409-Objektsperre mit Übernahme, hochzählende Fortschrittsanzeige und Offline-Queue-Verhalten (kein Request während offline, Sync bei Reconnect) ab. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
66 lines
2.1 KiB
TypeScript
66 lines
2.1 KiB
TypeScript
import { expect, test } from "@playwright/test";
|
|
|
|
import {
|
|
login,
|
|
mockKontrolleStart,
|
|
mockKontrollGrundgeruest,
|
|
mockLogin,
|
|
TEST_KONTROLLE,
|
|
TEST_OBJEKT,
|
|
TEST_POSITION,
|
|
} from "./mockApi";
|
|
|
|
test("Eingabe bleibt offline in der Warteschlange und wird bei Reconnect übertragen", async ({
|
|
page,
|
|
context,
|
|
}) => {
|
|
await mockLogin(page);
|
|
await mockKontrollGrundgeruest(page);
|
|
await mockKontrolleStart(page);
|
|
|
|
// context.setOffline() emuliert navigator.onLine/online-/offline-Events, ein
|
|
// per page.route gemocktes route.fulfill() würde das NICHT-Netzwerk-Verhalten
|
|
// (ERR_INTERNET_DISCONNECTED) ohne dieses manuelle Flag nicht nachbilden - hier
|
|
// bewusst per Hand simuliert, damit der Test die Queue-Logik echt prüft.
|
|
let offline = false;
|
|
let puts = 0;
|
|
await page.route(`**/api/v1/kontrollen/${TEST_KONTROLLE.id}/positionen/${TEST_POSITION.material_id}`, (route) => {
|
|
if (offline) {
|
|
route.abort("internetdisconnected");
|
|
return;
|
|
}
|
|
puts += 1;
|
|
route.fulfill({
|
|
json: {
|
|
id: "kp-1",
|
|
kontrolle_id: TEST_KONTROLLE.id,
|
|
material_id: TEST_POSITION.material_id,
|
|
sollmenge_snapshot: TEST_POSITION.sollmenge_effektiv,
|
|
istmenge_erfasst: TEST_POSITION.sollmenge_effektiv,
|
|
abweichung: false,
|
|
fehlbestand_id: null,
|
|
},
|
|
});
|
|
});
|
|
|
|
await login(page);
|
|
await page.goto(`/objekte/${TEST_OBJEKT.id}/kontrolle`);
|
|
await expect(page.getByText("0 von 1 Positionen bestätigt")).toBeVisible();
|
|
|
|
// Karte 17: navigator.onLine=false + offline-Event, IndexedDB-Queue bleibt
|
|
// trotzdem befüllbar - Eingabe darf hier NICHT verloren gehen.
|
|
offline = true;
|
|
await context.setOffline(true);
|
|
await expect(page.getByText(/Kein Netz/)).toBeVisible();
|
|
|
|
await page.getByRole("button", { name: "Passt" }).click();
|
|
await expect(page.getByText("nicht gespeichert")).toBeVisible();
|
|
expect(puts).toBe(0); // während offline darf kein Request erfolgreich rausgehen
|
|
|
|
offline = false;
|
|
await context.setOffline(false);
|
|
|
|
await expect(page.getByText("1 von 1 Positionen bestätigt")).toBeVisible({ timeout: 10000 });
|
|
expect(puts).toBeGreaterThan(0);
|
|
});
|