Add quick-win tests for components and hooks

Adds tests for DifficultyIndicator, Toast, RollModeMenu, OverflowMenu,
useTheme, and useRulesEdition. Covers rendering, user interactions,
auto-dismiss timers, external store sync, and localStorage persistence.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Lukas
2026-03-28 19:28:58 +01:00
parent d8c8a0c44d
commit a77db0eeee
7 changed files with 385 additions and 6 deletions

View File

@@ -0,0 +1,68 @@
// @vitest-environment jsdom
import { cleanup, render, screen } from "@testing-library/react";
import { userEvent } from "@testing-library/user-event";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { Toast } from "../toast.js";
afterEach(cleanup);
describe("Toast", () => {
it("renders message text", () => {
render(<Toast message="Hello" onDismiss={() => {}} />);
expect(screen.getByText("Hello")).toBeDefined();
});
it("renders progress bar when progress is provided", () => {
render(<Toast message="Loading" progress={0.5} onDismiss={() => {}} />);
const bar = document.body.querySelector("[style*='width']") as HTMLElement;
expect(bar).not.toBeNull();
expect(bar.style.width).toBe("50%");
});
it("does not render progress bar when progress is omitted", () => {
render(<Toast message="Done" onDismiss={() => {}} />);
const bar = document.body.querySelector("[style*='width']");
expect(bar).toBeNull();
});
it("calls onDismiss when close button is clicked", async () => {
const onDismiss = vi.fn();
render(<Toast message="Hi" onDismiss={onDismiss} />);
const toast = screen.getByText("Hi").closest("div");
const button = toast?.querySelector("button");
expect(button).not.toBeNull();
await userEvent.click(button as HTMLElement);
expect(onDismiss).toHaveBeenCalledOnce();
});
describe("auto-dismiss", () => {
beforeEach(() => {
vi.useFakeTimers();
});
afterEach(() => {
vi.useRealTimers();
});
it("auto-dismisses after specified timeout", () => {
const onDismiss = vi.fn();
render(
<Toast message="Auto" onDismiss={onDismiss} autoDismissMs={3000} />,
);
expect(onDismiss).not.toHaveBeenCalled();
vi.advanceTimersByTime(3000);
expect(onDismiss).toHaveBeenCalledOnce();
});
it("does not auto-dismiss when autoDismissMs is omitted", () => {
const onDismiss = vi.fn();
render(<Toast message="Stay" onDismiss={onDismiss} />);
vi.advanceTimersByTime(10000);
expect(onDismiss).not.toHaveBeenCalled();
});
});
});