import { fireEvent, render } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import { ZoomControls } from "../ZoomControls";
describe("ZoomControls component", () => {
const defaultProps = {
onZoomIn: vi.fn(),
onZoomOut: vi.fn(),
onReset: vi.fn(),
showResetButton: false,
zoom: 1,
minZoom: 1,
maxZoom: 5,
isVisible: true,
};
it("should render zoom in and zoom out buttons", () => {
const { getByLabelText } = render();
expect(getByLabelText("Zoom in")).toBeDefined();
expect(getByLabelText("Zoom out")).toBeDefined();
});
it("should call onZoomIn when + button is clicked", () => {
const onZoomIn = vi.fn();
const { getByLabelText } = render();
fireEvent.click(getByLabelText("Zoom in"));
expect(onZoomIn).toHaveBeenCalledTimes(1);
});
it("should call onZoomOut when - button is clicked", () => {
const onZoomOut = vi.fn();
const { getByLabelText } = render(
,
);
fireEvent.click(getByLabelText("Zoom out"));
expect(onZoomOut).toHaveBeenCalledTimes(1);
});
it("should disable zoom in button when at maxZoom", () => {
const onZoomIn = vi.fn();
const { getByLabelText } = render(
,
);
const zoomInButton = getByLabelText("Zoom in") as HTMLButtonElement;
expect(zoomInButton.disabled).toBe(true);
fireEvent.click(zoomInButton);
expect(onZoomIn).not.toHaveBeenCalled();
});
it("should disable zoom out button when at minZoom", () => {
const onZoomOut = vi.fn();
const { getByLabelText } = render(
,
);
const zoomOutButton = getByLabelText("Zoom out") as HTMLButtonElement;
expect(zoomOutButton.disabled).toBe(true);
fireEvent.click(zoomOutButton);
expect(onZoomOut).not.toHaveBeenCalled();
});
it("should hide reset button when showResetButton is false", () => {
const { getByLabelText } = render();
const resetButton = getByLabelText("Reset zoom");
const container = resetButton.parentElement as HTMLElement;
expect(container.style.opacity).toBe("0");
expect(container.style.pointerEvents).toBe("none");
});
it("should render reset button when showResetButton is true", () => {
const { getByLabelText } = render(
,
);
expect(getByLabelText("Reset zoom")).toBeDefined();
});
it("should call onReset when reset button is clicked", () => {
const onReset = vi.fn();
const { getByLabelText } = render(
,
);
fireEvent.click(getByLabelText("Reset zoom"));
expect(onReset).toHaveBeenCalledTimes(1);
});
it("should display reset icon in reset button", () => {
const { getByLabelText } = render(
,
);
const resetButton = getByLabelText("Reset zoom");
expect(resetButton.textContent).toContain("↺");
});
});