Skip to content

Commit 3cff745

Browse files
committed
test(a11y): add keyboard interaction tests for sidebar, fullscreen, and chat controls
Signed-off-by: adarshh <adarsh347k@gmail.com>
1 parent 3cfbb7e commit 3cff745

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
import { render, screen, fireEvent } from "@testing-library/react";
2+
import "@testing-library/jest-dom";
3+
import PlaygroundSidebar from "../../components/PlaygroundSidebar";
4+
import FullScreenModal from "../../components/FullScreenModal";
5+
import { vi } from "vitest";
6+
7+
// Mock the store
8+
const mockSetEditorsVisible = vi.fn();
9+
const mockSetPreviewVisible = vi.fn();
10+
const mockSetProblemPanelVisible = vi.fn();
11+
const mockSetAIChatOpen = vi.fn();
12+
const mockSetSettingsOpen = vi.fn();
13+
14+
vi.mock("../../store/store", () => ({
15+
default: () => ({
16+
isEditorsVisible: true,
17+
isPreviewVisible: true,
18+
isProblemPanelVisible: false,
19+
isAIChatOpen: false,
20+
setEditorsVisible: mockSetEditorsVisible,
21+
setPreviewVisible: mockSetPreviewVisible,
22+
setProblemPanelVisible: mockSetProblemPanelVisible,
23+
setAIChatOpen: mockSetAIChatOpen,
24+
setSettingsOpen: mockSetSettingsOpen,
25+
generateShareableLink: vi.fn(() => "https://example.com"),
26+
textColor: "#000000",
27+
backgroundColor: "#ffffff",
28+
}),
29+
}));
30+
31+
vi.mock("../../components/Tour", () => ({
32+
default: { start: vi.fn() },
33+
}));
34+
35+
vi.mock("../../components/FullScreenModal", () => ({
36+
default: () => <div data-testid="fullscreen-modal">FullScreen</div>,
37+
}));
38+
39+
vi.mock("../../components/SettingsModal", () => ({
40+
default: () => <div data-testid="settings-modal">Settings</div>,
41+
}));
42+
43+
describe("Keyboard Accessibility", () => {
44+
beforeEach(() => {
45+
vi.clearAllMocks();
46+
});
47+
48+
describe("PlaygroundSidebar - Top Nav", () => {
49+
it("activates Editor button on Enter key", () => {
50+
render(<PlaygroundSidebar />);
51+
const editorButton = screen.getByRole("button", { name: /Editor/i });
52+
fireEvent.keyDown(editorButton, { key: "Enter" });
53+
expect(mockSetEditorsVisible).toHaveBeenCalled();
54+
});
55+
56+
it("activates Editor button on Space key", () => {
57+
render(<PlaygroundSidebar />);
58+
const editorButton = screen.getByRole("button", { name: /Editor/i });
59+
fireEvent.keyDown(editorButton, { key: " " });
60+
expect(mockSetEditorsVisible).toHaveBeenCalled();
61+
});
62+
63+
it("does not activate Editor button on other keys", () => {
64+
render(<PlaygroundSidebar />);
65+
const editorButton = screen.getByRole("button", { name: /Editor/i });
66+
fireEvent.keyDown(editorButton, { key: "Tab" });
67+
expect(mockSetEditorsVisible).not.toHaveBeenCalled();
68+
});
69+
70+
it("activates Preview button on Enter key", () => {
71+
render(<PlaygroundSidebar />);
72+
const previewButton = screen.getByRole("button", { name: /Preview/i });
73+
fireEvent.keyDown(previewButton, { key: "Enter" });
74+
expect(mockSetPreviewVisible).toHaveBeenCalled();
75+
});
76+
77+
it("activates Problems button on Space key", () => {
78+
render(<PlaygroundSidebar />);
79+
const problemsButton = screen.getByRole("button", { name: /Problems/i });
80+
fireEvent.keyDown(problemsButton, { key: " " });
81+
expect(mockSetProblemPanelVisible).toHaveBeenCalled();
82+
});
83+
84+
it("activates AI Assistant button on Enter key", () => {
85+
render(<PlaygroundSidebar />);
86+
const aiButton = screen.getByRole("button", { name: /AI Assistant/i });
87+
fireEvent.keyDown(aiButton, { key: "Enter" });
88+
expect(mockSetAIChatOpen).toHaveBeenCalled();
89+
});
90+
});
91+
92+
describe("PlaygroundSidebar - Bottom Nav", () => {
93+
it("activates Share button on Enter key", () => {
94+
render(<PlaygroundSidebar />);
95+
const shareButton = screen.getByRole("button", { name: /Share/i });
96+
fireEvent.keyDown(shareButton, { key: "Enter" });
97+
// Share calls handleShare which is async, just verify no error
98+
expect(shareButton).toBeInTheDocument();
99+
});
100+
101+
it("activates Settings button on Space key", () => {
102+
render(<PlaygroundSidebar />);
103+
const settingsButton = screen.getByRole("button", { name: /Settings/i });
104+
fireEvent.keyDown(settingsButton, { key: " " });
105+
expect(mockSetSettingsOpen).toHaveBeenCalledWith(true);
106+
});
107+
108+
it("activates Start Tour button on Enter key", () => {
109+
render(<PlaygroundSidebar />);
110+
const tourButton = screen.getByRole("button", { name: /Start Tour/i });
111+
fireEvent.keyDown(tourButton, { key: "Enter" });
112+
expect(tourButton).toBeInTheDocument();
113+
});
114+
});
115+
116+
describe("PlaygroundSidebar - focusability", () => {
117+
it("all nav items have tabIndex=0 for keyboard focus", () => {
118+
render(<PlaygroundSidebar />);
119+
const buttons = screen.getAllByRole("button");
120+
buttons.forEach((button) => {
121+
expect(button).toHaveAttribute("tabindex", "0");
122+
});
123+
});
124+
});
125+
});

0 commit comments

Comments
 (0)