Files
cobble/src/utils/parse-install-icon.test.ts
T
tbenandClaude Opus 5.5 e462806438 Let each install pick its app icon
Settings > General gets an App icon (super admin): one of the seven
stones, or an uploaded image with the picked stone as a top-left corner
mark (inside a round launcher's crop, clear of the browser's badge),
previewed in both launcher crops before saving.

Uploads are decoded and cropped to a stored square (no SVG); the set is
drawn into DATA_DIR/install-icon/<version>/ and served publicly and
immutable. The manifest, head icon links and push notifications point at
it; the ember stone keeps the stock icons. The generator shares the icon
renderer.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-25 10:38:25 +01:00

28 lines
1.1 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import { PwaDefaultInstallIcon } from "@/src/data/pwa-data";
import parseInstallIcon from "./parse-install-icon";
describe("parseInstallIcon", () => {
test("falls back to the stock icon when nothing or junk is saved", () => {
expect(parseInstallIcon({})).toEqual(PwaDefaultInstallIcon);
expect(parseInstallIcon({ saved: "not json" })).toEqual(PwaDefaultInstallIcon);
expect(parseInstallIcon({ saved: "[1]" })).toEqual(PwaDefaultInstallIcon);
});
test("reads a saved icon", () => {
expect(
parseInstallIcon({
saved: JSON.stringify({ mode: "image", stone: "cobalt", mark: false, version: "0123456789ab" }),
}),
).toEqual({ mode: "image", stone: "cobalt", mark: false, version: "0123456789ab" });
});
test("drops unknown values field by field", () => {
expect(
parseInstallIcon({
saved: JSON.stringify({ mode: "video", stone: "plaid", mark: "yes", version: "../etc" }),
}),
).toEqual(PwaDefaultInstallIcon);
});
});