import { createRawSnippet } from "svelte"; import { describe, expect, it } from "vitest"; import ChatMessage from "../src/composites/ChatMessage.svelte"; import { chatMessage } from "../src/composites/chat-message.variants"; import SocialSurfacesConsumer from "./fixtures/SocialSurfacesConsumer.svelte"; import { expectLayoutReadiness } from "./layout-readiness"; import { classes, classesOf, render, rendered } from "./mount"; const body = createRawSnippet(() => ({ render: () => '
Deployment is ready. Open it
', })); const actions = createRawSnippet(() => ({ render: () => '', })); describe("ChatMessage", () => { it("composes canonical media and avatar around caller-owned message content", () => { const message = rendered(render(ChatMessage, { author: "Ada Lovelace", avatarFallback: "AL", datetime: "2026-08-08T19:00:00Z", time: "19:00", children: body, actions, })); expect(message.tagName).toBe("ARTICLE"); expect(message.getAttribute("aria-label")).toBe("Message from Ada Lovelace"); expect(message.querySelector("[data-media-object]")).not.toBeNull(); expect(message.querySelector("[data-avatar]")?.getAttribute("aria-label")).toBe("Ada Lovelace"); expect(message.querySelector("time")?.dateTime).toBe("2026-08-08T19:00:00Z"); expect(message.querySelector("[data-chat-message-body]")?.textContent).toContain("Deployment is ready."); }); it("leaves message destinations and actions in native keyboard order", () => { const message = rendered(render(ChatMessage, { author: "Ada Lovelace", avatarFallback: "AL", datetime: "2026-08-08T19:00:00Z", time: "19:00", children: body, actions, })); const controls = [...message.querySelectorAll