/**
* 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();
});
});