import { renderToStaticMarkup } from "react-dom/server"; import { describe, expect, it } from "vitest"; import { Alert } from "@/components/ds/ui/alert"; import { Button } from "@/components/ds/ui/button"; import { Checkbox } from "@/components/ds/ui/checkbox"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ds/ui/dropdown-menu"; import { Input } from "@/components/ds/ui/input"; import { Label } from "@/components/ds/ui/label"; import { Select, SelectTrigger, SelectValue } from "@/components/ds/ui/select"; import { Separator } from "@/components/ds/ui/separator"; import { Tabs, TabsContent, TabsList, TabsTrigger, } from "@/components/ds/ui/tabs"; describe("DS UI a11y contracts", () => { it("keeps label and input programmatically associated", () => { const html = renderToStaticMarkup(
, ); expect(html).toContain('for="email"'); expect(html).toContain('id="email"'); expect(html).toContain('aria-invalid="true"'); }); it("uses alert role for alert component", () => { const html = renderToStaticMarkup(Failure); expect(html).toContain('role="alert"'); }); it("keeps disabled semantics on button", () => { const html = renderToStaticMarkup(); expect(html).toContain("disabled"); }); it("keeps checkbox accessible naming hook", () => { const html = renderToStaticMarkup( , ); expect(html).toContain('aria-label="Accept terms"'); expect(html).toContain('data-slot="checkbox"'); }); it("renders tablist and tab roles", () => { const html = renderToStaticMarkup( Details Activity Body , ); expect(html).toContain('role="tablist"'); expect(html).toContain('role="tab"'); expect(html).toContain("aria-controls"); }); it("keeps select trigger labelling hooks", () => { const html = renderToStaticMarkup( , ); expect(html).toContain('aria-label="Currency"'); expect(html).toContain('data-slot="select-trigger"'); }); it("keeps dropdown trigger semantics", () => { const html = renderToStaticMarkup( Action , ); expect(html).toContain('data-slot="dropdown-menu-trigger"'); expect(html).toContain("Menu"); }); it("keeps separator role when decorative is false", () => { const html = renderToStaticMarkup(); expect(html).toContain('role="separator"'); }); });