IKHSAN
EN Read in EnglishID

snapme

Publik
Branch
master
Commit terakhir
130fdb828 Oktober 2026

share.spec.ts

Buka raw
import { expect, test } from "@playwright/test"

import {
  canvasChecksum,
  masukHias,
  masukHiasDenganQr,
  matikanGesture,
} from "./helpers"

/* M6 (SH-04 sampai SH-06): link strip dan QR. Server tidak lagi menyimpan
   apa pun (backend Cloudflare dibongkar), jadi spek ini memeriksa sakelar QR,
   kartu bagikan, jalur "belum tersedia" dari rute yang selalu 503, dan
   halaman strip yang selalu 404. */

/* Konvensi yang sama dengan spek lain (lihat helpers.ts): Gesture Snap
   dimatikan lewat localStorage. Di Chromium headless tanpa GPU, inferensi
   MediaPipe menahan main thread beberapa ratus milidetik per bingkai, dan alur
   kamera empat foto di berkas ini bisa melewati batas 30 detik uji saat mesin
   sedang sibuk. Perilaku gesture sendiri diuji `gesture.spec.ts`. */
test.beforeEach(async ({ page }) => {
  await matikanGesture(page)
})

test.describe("QR di strip", () => {
  test("sakelar QR menyalakan kotak QR di kanvas dan pemberitahuan izin", async ({
    page,
  }) => {
    await masukHias(page)
    const sebelum = await canvasChecksum(page)

    const sakelar = page.getByRole("switch", { name: "QR di strip" })
    await expect(sakelar).not.toBeChecked()
    await sakelar.click()
    await expect(sakelar).toBeChecked()
    await expect(
      page.getByText("Kamu akan dimintai izin unggah saat mengunduh.")
    ).toBeVisible()
    /* Kanvas digambar ulang setelah state berubah, jadi kotak QR-nya ditunggu
       (M9: penggambaran ulang tidak sinkron dengan klik di server produksi). */
    await expect.poll(() => canvasChecksum(page)).not.toBe(sebelum)

    /* Ledakan kartu mengikuti teks acuan customize.html. */
    await expect(
      page.getByText(
        "QR membuka halaman strip. Fotomu diunggah ke link pribadi dan terhapus otomatis setelah 7 hari."
      )
    ).toBeVisible()

    await sakelar.click()
    await expect(
      page.getByText("Kamu akan dimintai izin unggah saat mengunduh.")
    ).toHaveCount(0)
  })

  test("persetujuan unggah muncul dan server tanpa env menjawab belum tersedia", async ({
    page,
  }) => {
    await masukHiasDenganQr(page)
    await page.getByRole("link", { name: "Selesai & Unduh" }).click()
    await page.waitForURL("**/booth/result")
    await expect(page.getByAltText("Pratinjau strip")).toBeVisible()

    await expect(page.getByText("Semua diproses di perangkat ini")).toBeVisible()
    await page.getByRole("button", { name: "Buat Link dan Unggah" }).click()

    /* SE-02: apa yang diunggah, siapa yang bisa melihat, kapan terhapus. */
    const dialog = page.getByRole("dialog")
    await expect(
      dialog.getByText("Unggah strip?", { exact: true })
    ).toBeVisible()
    await expect(
      dialog.getByText(/Siapa pun yang punya link bisa melihatnya sampai 7 hari/)
    ).toBeVisible()

    await page
      .getByRole("dialog")
      .getByRole("button", { name: "Buat Link dan Unggah" })
      .click()
    await expect(page.getByText("Pembuatan link belum tersedia.")).toBeVisible()
    /* Gagal berarti belum ada yang terunggah, jadi tawaran unggah tetap ada. */
    await expect(
      page.getByRole("button", { name: "Buat Link dan Unggah" })
    ).toBeVisible()
  })

  test("halaman strip yang tidak ada menjawab 404 dan tidak diindeks", async ({
    page,
  }) => {
    const response = await page.goto("/s/tidakada1234")
    expect(response?.status()).toBe(404)
    await expect(page.getByText("Halaman tidak ditemukan.")).toBeVisible()
    await expect(
      page.getByRole("link", { name: "Mulai Foto" })
    ).toBeVisible()
  })
})
byte
3.555
baris
97
Jenis
ts
Commit terakhir
28 Oktober 2026