Files
kandev/apps/web/lib/preview-inspect-bridge.test.ts
T

75 lines
2.5 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { formatAnnotations, type Annotation } from "./preview-inspect-bridge";
const pin: Annotation = {
id: "a-1",
number: 1,
kind: "pin",
pagePath: "/products",
comment: "Make this primary color",
element: {
tag: "button",
id: "submit",
role: "button",
ariaLabel: "Submit form",
text: "Submit",
selector: "div#root > button#submit",
},
};
const area: Annotation = {
id: "a-2",
number: 2,
kind: "area",
pagePath: "/products",
comment: "Add a New badge to featured items",
rect: { x: 40, y: 200, w: 320, h: 180 },
elements: [
{ tag: "div", classes: "product-card featured", selector: "div.product-card" },
{ tag: "h2", classes: "title", text: "Item", selector: "h2.title" },
],
};
describe("formatAnnotations", () => {
it("returns empty string when no annotations", () => {
expect(formatAnnotations([])).toBe("");
});
it("renders a single pin with element details and comment", () => {
const out = formatAnnotations([pin]);
expect(out).toContain("Preview annotations on `/products`");
expect(out).toContain("1. [Pin] `button#submit`");
expect(out).toContain('role="button"');
expect(out).toContain('"Submit form"');
expect(out).toContain("Comment: Make this primary color");
expect(out).toContain("Selector: `div#root > button#submit`");
});
it("renders an area with bounding rect and contained elements", () => {
const out = formatAnnotations([area]);
expect(out).toContain("2. [Area 320x180 at (40,200)]");
expect(out).toContain("Contains: `div.product-card`, `h2.title`");
expect(out).toContain("Comment: Add a New badge to featured items");
});
it("renders multiple annotations in order under a single header", () => {
const out = formatAnnotations([pin, area]);
const headerCount = (out.match(/Preview annotations on/g) || []).length;
expect(headerCount).toBe(1);
expect(out.indexOf("1. [Pin]")).toBeLessThan(out.indexOf("2. [Area"));
});
it("omits comment line when comment is empty", () => {
const noComment: Annotation = { ...pin, comment: "" };
const out = formatAnnotations([noComment]);
expect(out).not.toContain("Comment:");
});
it("groups annotations by pagePath when they differ", () => {
const other: Annotation = { ...pin, id: "a-3", number: 3, pagePath: "/about" };
const out = formatAnnotations([pin, other]);
expect(out).toContain("Preview annotations on `/products`");
expect(out).toContain("Preview annotations on `/about`");
});
});