// @vitest-environment jsdom import { fireEvent, render, screen, waitFor } from "@testing-library/react"; import { useContext } from "react"; import { describe, expect, it } from "vitest"; import { ColorContext, ColorProvider } from "./color"; function Reader() { const { color, setColor } = useContext(ColorContext); return (
{color}
); } describe("utils/contexts/color", () => { it("initializes from localStorage and writes theme class + storage on updates", async () => { localStorage.setItem("theme-color", "blue"); document.documentElement.className = ""; render( , ); expect(screen.getByTestId("value")).toHaveTextContent("blue"); await waitFor(() => expect(document.documentElement.classList.contains("theme-blue")).toBe(true)); fireEvent.click(screen.getByRole("button", { name: "red" })); await waitFor(() => expect(document.documentElement.classList.contains("theme-red")).toBe(true)); expect(localStorage.getItem("theme-color")).toBe("red"); }); it("defaults to slate when localStorage is empty", async () => { localStorage.removeItem("theme-color"); document.documentElement.className = ""; render( , ); expect(screen.getByTestId("value")).toHaveTextContent("slate"); await waitFor(() => expect(document.documentElement.classList.contains("theme-slate")).toBe(true)); }); });