PluginProbe
xSpeed Cache: AI-Powered Performance Hub with MCP, Caching & CDN / 1.0.1
xSpeed Cache: AI-Powered Performance Hub with MCP, Caching & CDN v1.0.1
1.3.3 1.3.2 1.3.1 1.3.0 1.2.4 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 All 29 releases
xspeed / tests-js / components / Toggle.test.tsx

Toggle.test.tsx in xSpeed Cache: AI-Powered Performance Hub with MCP, Caching & CDN 1.0.1, at tests-js/components/Toggle.test.tsx

53 lines 1.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { describe, expect, it, vi } from 'vitest';
2 import { render, screen } from '@testing-library/react';
3 import userEvent from '@testing-library/user-event';
4 import { Toggle } from '../../src/components/Toggle';
5
6 describe('Toggle', () => {
7 it('renders as a switch with aria-checked reflecting the prop', () => {
8 render(<Toggle checked={true} onChange={() => {}} label="Enable Cache" />);
9 const sw = screen.getByRole('switch', { name: 'Enable Cache' });
10 expect(sw).toHaveAttribute('aria-checked', 'true');
11 });
12
13 it('starts unchecked and exposes aria-checked=false', () => {
14 render(<Toggle checked={false} onChange={() => {}} label="Off" />);
15 expect(screen.getByRole('switch')).toHaveAttribute('aria-checked', 'false');
16 });
17
18 it('invokes onChange with the negation of the current value on click', async () => {
19 const user = userEvent.setup();
20 const onChange = vi.fn();
21 render(<Toggle checked={false} onChange={onChange} label="Cache" />);
22
23 await user.click(screen.getByRole('switch'));
24
25 expect(onChange).toHaveBeenCalledOnce();
26 expect(onChange).toHaveBeenCalledWith(true);
27 });
28
29 it('still toggles when clicked from the on state', async () => {
30 const user = userEvent.setup();
31 const onChange = vi.fn();
32 render(<Toggle checked={true} onChange={onChange} label="Cache" />);
33
34 await user.click(screen.getByRole('switch'));
35
36 expect(onChange).toHaveBeenCalledWith(false);
37 });
38
39 it('uses the larger track when size is "lg"', () => {
40 render(<Toggle checked={false} onChange={() => {}} size="lg" />);
41 const sw = screen.getByRole('switch');
42 expect(sw.className).toMatch(/w-11/);
43 expect(sw.className).toMatch(/h-6/);
44 });
45
46 it('uses the default track when size is "md"', () => {
47 render(<Toggle checked={false} onChange={() => {}} size="md" />);
48 const sw = screen.getByRole('switch');
49 expect(sw.className).toMatch(/w-9/);
50 expect(sw.className).toMatch(/h-5/);
51 });
52 });
53