1import path from "node:path"
2import { expect, test } from "@playwright/test"
3
4import {
5 izinkanKamera,
6 jepret,
7 masukAmbilFoto,
8 masukHasil,
9 masukHias,
10 matikanGesture,
11 srcSlot,
12} from "./helpers"
13
14/* FR-14: sesi bertahan saat halaman dimuat ulang lewat IndexedDB. SessionSync
15 menyimpan dengan jeda 400 ms setelah perubahan terakhir, jadi uji ini
16 menunggu jeda itu sebelum memuat ulang. */
17
18const FIXTURE_DIR = path.join(process.cwd(), "tests", "e2e", "fixtures")
19const JEDA_SIMPAN_MS = 700
20
21test.beforeEach(async ({ page }) => {
22 await matikanGesture(page)
23})
24
25test("foto pulih setelah dimuat ulang", async ({ page }) => {
26 await masukAmbilFoto(page)
27 await izinkanKamera(page)
28 await jepret(page)
29 await jepret(page)
30 await expect(page.getByText("2/4")).toBeVisible()
31 await page.waitForTimeout(JEDA_SIMPAN_MS)
32
33 await page.reload()
34
35 await expect(page.getByText("2/4")).toBeVisible()
36 await expect(page.getByRole("button", { name: "Ulang foto 1" })).toBeVisible()
37 await expect.poll(() => srcSlot(page, 1)).not.toBeNull()
38 await expect.poll(() => srcSlot(page, 2)).not.toBeNull()
39})
40
41test("pilihan hias pulih setelah dimuat ulang", async ({ page }) => {
42 await masukHias(page)
43 await page.getByRole("button", { name: "Malam", exact: true }).click()
44 await page.waitForTimeout(JEDA_SIMPAN_MS)
45
46 await page.reload()
47
48 await expect(page.locator("canvas")).toBeVisible()
49 await expect(
50 page.getByRole("button", { name: "Malam", exact: true })
51 ).toHaveClass(/ring-selected/)
52})
53
54test("Mulai dari awal menghapus penyimpanan", async ({ page }) => {
55 await masukHasil(page)
56
57 await page.getByRole("button", { name: "Mulai dari awal" }).click()
58 await page.waitForURL("**/booth/layout")
59 await expect(page.getByText("Belum dipilih")).toBeVisible()
60
61 /* Muat ulang membuktikan rekaman lama tidak kembali. */
62 await page.goto("/booth/capture")
63 await page.waitForURL("**/booth/layout")
64 await page.reload()
65 await page.waitForURL("**/booth/layout")
66 await expect(page.getByText("Belum dipilih")).toBeVisible()
67})
68
69test("alur galeri dari Welcome tidak tertimpa rekaman lama", async ({ page }) => {
70 /* Sesi pertama tersimpan lewat kamera: satu foto. */
71 await masukAmbilFoto(page)
72 await izinkanKamera(page)
73 await jepret(page)
74 await page.waitForTimeout(JEDA_SIMPAN_MS)
75
76 /* Dari Welcome, empat foto galeri harus menggantikan rekaman itu utuh. */
77 await page.goto("/")
78 const chooser = page.waitForEvent("filechooser")
79 await page.getByRole("button", { name: "Pakai Foto Galeri" }).click()
80 await (await chooser).setFiles([
81 path.join(FIXTURE_DIR, "foto-1.png"),
82 path.join(FIXTURE_DIR, "foto-2.png"),
83 path.join(FIXTURE_DIR, "foto-3.png"),
84 path.join(FIXTURE_DIR, "foto-4.png"),
85 ])
86
87 await page.waitForURL("**/booth/customize")
88 await expect(page.getByText("4 foto siap", { exact: true })).toBeVisible()
89})
90