1import { existsSync } from "node:fs"
2import path from "node:path"
3import { describe, expect, it } from "vitest"
4
5import {
6 DEFAULT_EFFECT_ID,
7 DEFAULT_FRAME_ID,
8} from "@/features/editor/defaults"
9import { EFFECTS, FRAMES, STICKERS } from "@/features/editor/presets"
10
11/* M4: kontrak data hias strip (FR-09). Penamaan berkas ekspor diuji terpisah
12 di tests/export-filename.test.ts. */
13
14describe("preset hias", () => {
15 it("menyediakan minimal 6 frame dengan id unik", () => {
16 expect(FRAMES.length).toBeGreaterThanOrEqual(6)
17 expect(new Set(FRAMES.map((frame) => frame.id)).size).toBe(FRAMES.length)
18 expect(FRAMES.some((frame) => frame.id === DEFAULT_FRAME_ID)).toBe(true)
19 })
20
21 it("menyediakan satu efek per jenis filter plus Asli", () => {
22 const kinds = EFFECTS.map((effect) => effect.params.kind)
23 expect(new Set(kinds).size).toBe(kinds.length)
24 expect(kinds).toContain("none")
25 expect(EFFECTS.length).toBeGreaterThanOrEqual(7)
26 expect(EFFECTS.some((effect) => effect.id === DEFAULT_EFFECT_ID)).toBe(true)
27
28 /* Swatch efek memakai `cssPreview`. Yang tidak punya padanan filter CSS
29 adalah Asli (tanpa filter) dan Piksel (digambar sebagai pola blok). */
30 for (const effect of EFFECTS) {
31 const noCssPreview =
32 effect.params.kind === "none" || effect.params.kind === "pixelate"
33 if (noCssPreview) {
34 expect(effect.cssPreview).toBe("")
35 } else {
36 expect(effect.cssPreview.length).toBeGreaterThan(0)
37 }
38 }
39 })
40
41 it("menyediakan 12 stiker dengan berkas yang benar-benar ada", () => {
42 expect(STICKERS).toHaveLength(12)
43 expect(new Set(STICKERS.map((sticker) => sticker.id)).size).toBe(12)
44
45 for (const sticker of STICKERS) {
46 expect(existsSync(path.join("public", "stickers", sticker.file))).toBe(true)
47 expect(sticker.label.length).toBeGreaterThan(0)
48 }
49 })
50})
51