Skip to content

Commit e098dd6

Browse files
authored
Merge pull request #1475 from cisagov/filter_drawer_CRASM-3504
Filter Drawer Components and Context Unit Tests CRASM-3504
2 parents 93f018e + e60ca6f commit e098dd6

File tree

4 files changed

+843
-0
lines changed

4 files changed

+843
-0
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
// FilterDrawerToggle.spec.tsx
2+
import React from 'react';
3+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
4+
import { render, screen, cleanup } from '@testing-library/react';
5+
import userEvent from '@testing-library/user-event';
6+
import '@testing-library/jest-dom';
7+
8+
import FilterDrawerToggle from '@components/FilterDrawer/FilterDrawerToggle';
9+
10+
// ----------------------
11+
// Mock
12+
// ----------------------
13+
const mockSetIsFilterDrawerOpen = vi.fn();
14+
let mockIsFilterDrawerOpenValue = false;
15+
16+
vi.mock('context/FilterDrawerContext', () => ({
17+
useFilterDrawerContext: () => ({
18+
isFilterDrawerOpen: mockIsFilterDrawerOpenValue,
19+
setIsFilterDrawerOpen: mockSetIsFilterDrawerOpen
20+
})
21+
}));
22+
23+
vi.mock('@mui/material/AppBar', () => ({
24+
default: ({ children }: { children: React.ReactNode }) => (
25+
<div data-testid="appbar">{children}</div>
26+
)
27+
}));
28+
29+
vi.mock('@mui/material/Toolbar', () => ({
30+
default: ({ children }: { children: React.ReactNode }) => (
31+
<div data-testid="toolbar">{children}</div>
32+
)
33+
}));
34+
35+
vi.mock('@mui/material/Button', () => ({
36+
default: ({
37+
children,
38+
onClick,
39+
'aria-label': ariaLabel
40+
}: {
41+
children: React.ReactNode;
42+
onClick?: () => void;
43+
'aria-label'?: string;
44+
}) => (
45+
<button type="button" aria-label={ariaLabel} onClick={onClick}>
46+
{children}
47+
</button>
48+
)
49+
}));
50+
51+
vi.mock('@mui/icons-material/FilterAlt', () => ({
52+
default: () => <span aria-hidden="true">FilterIcon</span>
53+
}));
54+
55+
// ----------------------
56+
// Tests
57+
// ----------------------
58+
59+
describe('FilterDrawerToggle', () => {
60+
beforeEach(() => {
61+
mockIsFilterDrawerOpenValue = false;
62+
vi.clearAllMocks();
63+
});
64+
65+
afterEach(() => {
66+
cleanup();
67+
});
68+
69+
/** Renders the toggle button with the expected accessible label. */
70+
it('renders a button with correct accessible name', () => {
71+
render(<FilterDrawerToggle />);
72+
73+
expect(
74+
screen.getByRole('button', { name: 'Toggle Filter Drawer' })
75+
).toBeInTheDocument();
76+
});
77+
78+
/** Clicking the button calls the context setter to open the drawer. */
79+
it('clicking the button toggles drawer open state via context setter', async () => {
80+
const user = userEvent.setup();
81+
render(<FilterDrawerToggle />);
82+
83+
await user.click(
84+
screen.getByRole('button', { name: 'Toggle Filter Drawer' })
85+
);
86+
87+
expect(mockSetIsFilterDrawerOpen).toHaveBeenCalledWith(true);
88+
});
89+
90+
/** Allows keyboard activation with Enter and Space. */
91+
it('supports keyboard activation using Enter and Space', async () => {
92+
const user = userEvent.setup();
93+
render(<FilterDrawerToggle />);
94+
95+
const toggleButton = screen.getByRole('button', {
96+
name: 'Toggle Filter Drawer'
97+
});
98+
99+
toggleButton.focus();
100+
expect(toggleButton).toHaveFocus();
101+
102+
await user.keyboard('{Enter}');
103+
expect(mockSetIsFilterDrawerOpen).toHaveBeenCalledWith(true);
104+
105+
mockSetIsFilterDrawerOpen.mockClear();
106+
107+
await user.keyboard(' ');
108+
expect(mockSetIsFilterDrawerOpen).toHaveBeenCalledWith(true);
109+
});
110+
});

0 commit comments

Comments
 (0)