* feat: rewrite image picker * style: auto-fix lint and format * fix: address image picker review * fix: preserve unicode icon searches * test: stabilize custom widget login * fix: suggest image searches only on create
51 lines
1.8 KiB
TypeScript
51 lines
1.8 KiB
TypeScript
import { describe, expect, test } from "vitest";
|
|
|
|
import type { IconGroup } from "./icon-picker.utils";
|
|
import { arrangeIconPickerSections, isDirectImageUrl, isImageSource, isSvgImage } from "./icon-picker.utils";
|
|
|
|
const groups = [
|
|
{
|
|
id: "remote",
|
|
slug: "dashboard-icons",
|
|
icons: [
|
|
{ id: "long", name: "home-assistant-alt.svg", url: "https://cdn.example.com/home-assistant-alt.svg" },
|
|
{ id: "raster", name: "Home Assistant.png", url: "https://cdn.example.com/home-assistant.png" },
|
|
{ id: "svg", name: "home-assistant.svg", url: "https://cdn.example.com/home-assistant.svg?v=1" },
|
|
],
|
|
},
|
|
{
|
|
id: "local",
|
|
slug: "local",
|
|
icons: [{ id: "local", name: "Home Assistant.png", url: "/api/user-medias/home-assistant" }],
|
|
},
|
|
] as IconGroup[];
|
|
|
|
describe("icon picker utilities", () => {
|
|
test("arranges local images before remote SVG and raster images", () => {
|
|
const result = arrangeIconPickerSections(groups, "home assistant");
|
|
|
|
expect(result.local.map((icon) => icon.id)).toEqual(["local"]);
|
|
expect(result.svg.map((icon) => icon.id)).toEqual(["svg", "long"]);
|
|
expect(result.other.map((icon) => icon.id)).toEqual(["raster"]);
|
|
});
|
|
|
|
test.each([
|
|
["https://example.com/icon.png", true],
|
|
["http://localhost:3000/icon", true],
|
|
["ftp://example.com/icon.png", false],
|
|
["javascript:alert(1)", false],
|
|
["example.com/icon.png", false],
|
|
])("validates direct image URLs", (value, expected) => {
|
|
expect(isDirectImageUrl(value)).toBe(expected);
|
|
});
|
|
|
|
test("accepts internal image paths without treating search text as a source", () => {
|
|
expect(isImageSource("/api/user-medias/123")).toBe(true);
|
|
expect(isImageSource("shopify")).toBe(false);
|
|
});
|
|
|
|
test("recognizes SVG URLs with query strings case-insensitively", () => {
|
|
expect(isSvgImage("https://example.com/ICON.SVG?raw=1")).toBe(true);
|
|
});
|
|
});
|