diff --git a/frontend/__tests__/components/workspace-toggle.test.tsx b/frontend/__tests__/components/workspace-toggle.test.tsx new file mode 100644 index 000000000000..1dee5a80f4d7 --- /dev/null +++ b/frontend/__tests__/components/workspace-toggle.test.tsx @@ -0,0 +1,35 @@ +import { render, screen, fireEvent } from "@testing-library/react"; +import { describe, it, expect, vi } from "vitest"; +import { ToggleWorkspaceIconButton } from "#/components/shared/buttons/toggle-workspace-icon-button"; + +describe("Workspace Toggle", () => { + it("should render toggle button with correct icon and label", () => { + const onClickMock = vi.fn(); + + // Test initial state (workspace visible) + const { rerender } = render( + + ); + + const button = screen.getByTestId("toggle"); + expect(button).toBeInTheDocument(); + expect(button).toHaveAttribute("aria-label", "Close workspace"); + + // Test hidden state + rerender( + + ); + expect(button).toHaveAttribute("aria-label", "Open workspace"); + }); + + it("should call onClick handler when clicked", () => { + const onClickMock = vi.fn(); + render( + + ); + + const button = screen.getByTestId("toggle"); + fireEvent.click(button); + expect(onClickMock).toHaveBeenCalledTimes(1); + }); +}); diff --git a/frontend/src/components/shared/buttons/__tests__/toggle-workspace-icon-button.test.tsx b/frontend/src/components/shared/buttons/__tests__/toggle-workspace-icon-button.test.tsx new file mode 100644 index 000000000000..4fede299732d --- /dev/null +++ b/frontend/src/components/shared/buttons/__tests__/toggle-workspace-icon-button.test.tsx @@ -0,0 +1,46 @@ +import React from "react"; +import { render, screen } from "@testing-library/react"; +import { describe, it, expect, vi } from "vitest"; +import { ToggleWorkspaceIconButton } from "../toggle-workspace-icon-button"; + +describe("ToggleWorkspaceIconButton", () => { + it("renders with correct dimensions and styling", () => { + const mockOnClick = vi.fn(); + render( + , + ); + + const button = screen.getByTestId("toggle"); + expect(button).toBeInTheDocument(); + expect(button).toHaveClass("h-[100px] w-[20px]"); + expect(button).toHaveClass("bg-neutral-800"); + expect(button).toHaveClass("hover:bg-neutral-700"); + expect(button).toHaveClass("rounded-md"); + }); + + it("displays the correct icon based on isHidden prop", () => { + const mockOnClick = vi.fn(); + + const { rerender } = render( + , + ); + expect(screen.getByLabelText("Close workspace")).toBeInTheDocument(); + expect(screen.getByTestId("toggle")).toContainElement( + screen.getByTestId("arrow-forward-icon"), + ); + + rerender(); + expect(screen.getByLabelText("Open workspace")).toBeInTheDocument(); + expect(screen.getByTestId("toggle")).toContainElement( + screen.getByTestId("arrow-back-icon"), + ); + }); + + it("remains visible when workspace is collapsed", () => { + const mockOnClick = vi.fn(); + render(); + + const button = screen.getByTestId("toggle"); + expect(button).toBeVisible(); + }); +}); diff --git a/frontend/src/components/shared/buttons/icon-button.tsx b/frontend/src/components/shared/buttons/icon-button.tsx index 66c86e2a58e3..34291293abd7 100644 --- a/frontend/src/components/shared/buttons/icon-button.tsx +++ b/frontend/src/components/shared/buttons/icon-button.tsx @@ -1,11 +1,12 @@ import { Button } from "@nextui-org/react"; -import React, { MouseEventHandler, ReactElement } from "react"; +import React, { ReactElement } from "react"; export interface IconButtonProps { icon: ReactElement; - onClick: MouseEventHandler; + onClick: () => void; ariaLabel: string; testId?: string; + className?: string; } export function IconButton({ @@ -13,13 +14,14 @@ export function IconButton({ onClick, ariaLabel, testId = "", + className = "", }: IconButtonProps): React.ReactElement { return (