Spaces:
Paused
Paused
| /** | |
| * Layout Component Tests | |
| */ | |
| import { describe, it, expect, vi, beforeEach } from "vitest"; | |
| // Mock the contexts module | |
| vi.mock("@/contexts", () => ({ | |
| useTheme: vi.fn(), | |
| })); | |
| // Import after mock | |
| import { useTheme } from "@/contexts"; | |
| describe("Layout Logic", () => { | |
| beforeEach(() => { | |
| vi.clearAllMocks(); | |
| }); | |
| describe("Theme Context", () => { | |
| it("provides dark theme", () => { | |
| vi.mocked(useTheme).mockReturnValue({ | |
| theme: "dark", | |
| toggleTheme: vi.fn(), | |
| }); | |
| const { theme } = useTheme(); | |
| expect(theme).toBe("dark"); | |
| }); | |
| it("provides light theme", () => { | |
| vi.mocked(useTheme).mockReturnValue({ | |
| theme: "light", | |
| toggleTheme: vi.fn(), | |
| }); | |
| const { theme } = useTheme(); | |
| expect(theme).toBe("light"); | |
| }); | |
| it("toggleTheme is callable", () => { | |
| const mockToggle = vi.fn(); | |
| vi.mocked(useTheme).mockReturnValue({ | |
| theme: "dark", | |
| toggleTheme: mockToggle, | |
| }); | |
| const { toggleTheme } = useTheme(); | |
| toggleTheme(); | |
| expect(mockToggle).toHaveBeenCalled(); | |
| }); | |
| }); | |
| describe("Sidebar State Management", () => { | |
| it("initializes left sidebar as open", () => { | |
| const leftSidebarOpen = true; | |
| expect(leftSidebarOpen).toBe(true); | |
| }); | |
| it("toggles left sidebar closed", () => { | |
| let leftSidebarOpen = true; | |
| leftSidebarOpen = !leftSidebarOpen; | |
| expect(leftSidebarOpen).toBe(false); | |
| }); | |
| it("toggles left sidebar open", () => { | |
| let leftSidebarOpen = false; | |
| leftSidebarOpen = !leftSidebarOpen; | |
| expect(leftSidebarOpen).toBe(true); | |
| }); | |
| it("initializes right sidebar as open", () => { | |
| const rightSidebarOpen = true; | |
| expect(rightSidebarOpen).toBe(true); | |
| }); | |
| it("toggles right sidebar independently", () => { | |
| const leftSidebarOpen = true; | |
| let rightSidebarOpen = true; | |
| rightSidebarOpen = !rightSidebarOpen; | |
| expect(leftSidebarOpen).toBe(true); | |
| expect(rightSidebarOpen).toBe(false); | |
| }); | |
| }); | |
| describe("Main View State", () => { | |
| it("initializes with chat view", () => { | |
| const mainView: "chat" | "settings" = "chat"; | |
| expect(mainView).toBe("chat"); | |
| }); | |
| it("switches to settings view", () => { | |
| let mainView: "chat" | "settings" = "chat"; | |
| mainView = "settings"; | |
| expect(mainView).toBe("settings"); | |
| }); | |
| it("switches back to chat view", () => { | |
| let mainView: "chat" | "settings" = "settings"; | |
| mainView = "chat"; | |
| expect(mainView).toBe("chat"); | |
| }); | |
| }); | |
| describe("Conditional Rendering Logic", () => { | |
| it("shows left sidebar only in chat view", () => { | |
| const mainView: string = "chat"; | |
| const showLeftSidebar = mainView === "chat"; | |
| expect(showLeftSidebar).toBe(true); | |
| }); | |
| it("hides left sidebar in settings view", () => { | |
| const mainView: string = "settings"; | |
| const showLeftSidebar = mainView === "chat"; | |
| expect(showLeftSidebar).toBe(false); | |
| }); | |
| it("shows right sidebar only in chat view", () => { | |
| const mainView: string = "chat"; | |
| const showRightSidebar = mainView === "chat"; | |
| expect(showRightSidebar).toBe(true); | |
| }); | |
| it("hides toggle buttons in settings view", () => { | |
| const mainView: string = "settings"; | |
| const showToggleButtons = mainView === "chat"; | |
| expect(showToggleButtons).toBe(false); | |
| }); | |
| }); | |
| describe("Aria Labels", () => { | |
| it("generates left sidebar toggle label when open", () => { | |
| const leftSidebarOpen = true; | |
| const label = leftSidebarOpen ? "隐藏设置面板" : "显示设置面板"; | |
| expect(label).toBe("隐藏设置面板"); | |
| }); | |
| it("generates left sidebar toggle label when closed", () => { | |
| const leftSidebarOpen = false; | |
| const label = leftSidebarOpen ? "隐藏设置面板" : "显示设置面板"; | |
| expect(label).toBe("显示设置面板"); | |
| }); | |
| it("generates right sidebar toggle label when open", () => { | |
| const rightSidebarOpen = true; | |
| const label = rightSidebarOpen ? "隐藏日志面板" : "显示日志面板"; | |
| expect(label).toBe("隐藏日志面板"); | |
| }); | |
| it("generates theme toggle label for dark mode", () => { | |
| const theme: string = "dark"; | |
| const label = theme === "dark" ? "切换到亮色模式" : "切换到暗色模式"; | |
| expect(label).toBe("切换到亮色模式"); | |
| }); | |
| it("generates theme toggle label for light mode", () => { | |
| const theme: string = "light"; | |
| const label = theme === "dark" ? "切换到亮色模式" : "切换到暗色模式"; | |
| expect(label).toBe("切换到暗色模式"); | |
| }); | |
| }); | |
| describe("CSS Class Logic", () => { | |
| it("applies collapsed class when sidebar is closed", () => { | |
| const leftSidebarOpen = false; | |
| const className = !leftSidebarOpen ? "collapsed" : ""; | |
| expect(className).toBe("collapsed"); | |
| }); | |
| it("does not apply collapsed class when sidebar is open", () => { | |
| const leftSidebarOpen = true; | |
| const className = !leftSidebarOpen ? "collapsed" : ""; | |
| expect(className).toBe(""); | |
| }); | |
| it("applies active class to current view tab", () => { | |
| const mainView: string = "chat"; | |
| const chatTabActive = mainView === "chat" ? "active" : ""; | |
| const settingsTabActive = mainView === "settings" ? "active" : ""; | |
| expect(chatTabActive).toBe("active"); | |
| expect(settingsTabActive).toBe(""); | |
| }); | |
| }); | |
| }); | |