/** * BaseWidget Component Tests * Following TDD - write tests first! */ import { describe, it, expect, vi } from "vitest"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { BaseWidget } from "../BaseWidget"; describe("BaseWidget", (): void => { const mockOnEdit = vi.fn(); const mockOnRemove = vi.fn(); it("should render children content", (): void => { render(
Widget Content
); expect(screen.getByText("Widget Content")).toBeInTheDocument(); }); it("should render title", (): void => { render(
Content
); expect(screen.getByText("My Custom Widget")).toBeInTheDocument(); }); it("should call onEdit when edit button clicked", async (): Promise => { const user = userEvent.setup(); render(
Content
); const editButton = screen.getByRole("button", { name: /edit/i }); await user.click(editButton); expect(mockOnEdit).toHaveBeenCalledTimes(1); }); it("should call onRemove when remove button clicked", async (): Promise => { const user = userEvent.setup(); render(
Content
); const removeButton = screen.getByRole("button", { name: /remove/i }); await user.click(removeButton); expect(mockOnRemove).toHaveBeenCalledTimes(1); }); it("should not show control buttons when handlers not provided", (): void => { render(
Content
); expect(screen.queryByRole("button", { name: /edit/i })).not.toBeInTheDocument(); expect(screen.queryByRole("button", { name: /remove/i })).not.toBeInTheDocument(); }); it("should render with description when provided", (): void => { render(
Content
); expect(screen.getByText("This is a test description")).toBeInTheDocument(); }); it("should apply custom className", (): void => { const { container } = render(
Content
); expect(container.querySelector(".custom-class")).toBeInTheDocument(); }); it("should render loading state", (): void => { render(
Content
); expect(screen.getByText(/loading/i)).toBeInTheDocument(); }); it("should render error state", (): void => { render(
Content
); expect(screen.getByText("Something went wrong")).toBeInTheDocument(); }); });