import { resolve } from "node:path"; import { describe, expect, it } from "vitest"; import { render, fireEvent } from "@testing-library/preact"; import { Avatar } from "./Avatar.js"; describe("Avatar", () => { // ── Image mode ── it("renders image when src is provided", () => { const { container } = render( , ); const img = container.querySelector("img"); expect(img).toBeTruthy(); expect(img?.getAttribute("src")).toBe("https://example.com/photo.jpg"); }); it("sets alt text on image", () => { const { container } = render( , ); const img = container.querySelector("img"); expect(img?.getAttribute("alt")).toBe("Jane Doe"); }); // ── Initials mode ── it("shows initials when no src is provided", () => { const { container } = render(); const initialsEl = container.querySelector(".strand-avatar__initials"); expect(initialsEl).toBeTruthy(); expect(initialsEl?.textContent).toBe("JD"); }); it("initials are uppercase", () => { const { container } = render(); const initialsEl = container.querySelector(".strand-avatar__initials"); expect(initialsEl?.textContent).toBe("AB"); }); it("truncates initials to 2 characters", () => { const { container } = render(); const initialsEl = container.querySelector(".strand-avatar__initials"); expect(initialsEl?.textContent).toBe("AB"); }); // ── Fallback ── it("falls back to initials on image error", () => { const { container } = render( , ); const img = container.querySelector("img"); expect(img).toBeTruthy(); fireEvent.error(img!); const initialsEl = container.querySelector(".strand-avatar__initials"); expect(initialsEl).toBeTruthy(); expect(initialsEl?.textContent).toBe("JD"); expect(container.querySelector("img")).toBeNull(); }); // ── Sizes ── // ── Shape ── // ── Custom className ── // ── Accessibility ── it("has role img and aria-label", () => { const { container } = render(); const el = container.firstElementChild; expect(el?.getAttribute("role")).toBe("img"); expect(el?.getAttribute("aria-label")).toBe("Jane Doe"); }); it("uses initials for aria-label when no alt", () => { const { container } = render(); const el = container.firstElementChild; expect(el?.getAttribute("aria-label")).toBe("JD"); }); }); import { snapshotFixtures } from "../../test/snapshot.js"; import { snapshotStylesheet } from "../../test/stylesheet.js"; import { fixtures } from "./Avatar.fixtures.js"; snapshotFixtures(Avatar, fixtures); snapshotStylesheet(resolve(__dirname, "./Avatar.css"));