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); });