- Export form creation helpers for testing - Add unique ID generation for sliders, selects, and color pickers - Associate labels with inputs using `htmlFor` - Add unit tests to verify accessibility attributes
146 lines
6.0 KiB
TypeScript
146 lines
6.0 KiB
TypeScript
import { describe, it, expect, vi } from 'vitest';
|
|
import { createToggle, createSlider, createSelect, createColorPicker } from '../../src/sidebar/SidebarSettings';
|
|
|
|
describe('Sidebar Controls', () => {
|
|
describe('createToggle', () => {
|
|
it('should create an accessible toggle switch', () => {
|
|
const onChange = vi.fn();
|
|
const label = 'Test Toggle';
|
|
const toggleRow = createToggle(label, false, onChange);
|
|
|
|
const toggle = toggleRow.querySelector('.magnify-toggle') as HTMLElement;
|
|
const labelEl = toggleRow.querySelector('label') as HTMLElement;
|
|
|
|
// Check role
|
|
expect(toggle.getAttribute('role')).toBe('switch');
|
|
|
|
// Check checked state
|
|
expect(toggle.getAttribute('aria-checked')).toBe('false');
|
|
|
|
// Check tabindex
|
|
expect(toggle.tabIndex).toBe(0);
|
|
|
|
// Check label association
|
|
const toggleId = toggle.id;
|
|
const labelId = labelEl.id;
|
|
expect(toggleId).toBeTruthy();
|
|
expect(labelId).toBeTruthy();
|
|
expect(toggle.getAttribute('aria-labelledby')).toBe(labelId);
|
|
});
|
|
|
|
it('should toggle state on click', () => {
|
|
const onChange = vi.fn();
|
|
const toggleRow = createToggle('Test', false, onChange);
|
|
const toggle = toggleRow.querySelector('.magnify-toggle') as HTMLElement;
|
|
|
|
toggle.click();
|
|
|
|
expect(toggle.classList.contains('active')).toBe(true);
|
|
expect(toggle.getAttribute('aria-checked')).toBe('true');
|
|
expect(onChange).toHaveBeenCalledWith(true);
|
|
|
|
toggle.click();
|
|
|
|
expect(toggle.classList.contains('active')).toBe(false);
|
|
expect(toggle.getAttribute('aria-checked')).toBe('false');
|
|
expect(onChange).toHaveBeenCalledWith(false);
|
|
});
|
|
|
|
it('should toggle state when clicking label', () => {
|
|
const onChange = vi.fn();
|
|
const toggleRow = createToggle('Test', false, onChange);
|
|
const labelEl = toggleRow.querySelector('label') as HTMLElement;
|
|
const toggle = toggleRow.querySelector('.magnify-toggle') as HTMLElement;
|
|
|
|
labelEl.click();
|
|
|
|
expect(toggle.classList.contains('active')).toBe(true);
|
|
expect(toggle.getAttribute('aria-checked')).toBe('true');
|
|
expect(onChange).toHaveBeenCalledWith(true);
|
|
});
|
|
|
|
it('should toggle state and stop propagation on Enter key', () => {
|
|
const onChange = vi.fn();
|
|
const toggleRow = createToggle('Test', false, onChange);
|
|
const toggle = toggleRow.querySelector('.magnify-toggle') as HTMLElement;
|
|
|
|
// Create keyboard event with spies
|
|
const event = new KeyboardEvent('keydown', { key: 'Enter' });
|
|
const preventDefaultSpy = vi.spyOn(event, 'preventDefault');
|
|
const stopPropagationSpy = vi.spyOn(event, 'stopPropagation');
|
|
|
|
toggle.dispatchEvent(event);
|
|
|
|
expect(toggle.classList.contains('active')).toBe(true);
|
|
expect(toggle.getAttribute('aria-checked')).toBe('true');
|
|
expect(onChange).toHaveBeenCalledWith(true);
|
|
expect(preventDefaultSpy).toHaveBeenCalled();
|
|
expect(stopPropagationSpy).toHaveBeenCalled();
|
|
});
|
|
|
|
it('should toggle state and stop propagation on Space key', () => {
|
|
const onChange = vi.fn();
|
|
const toggleRow = createToggle('Test', false, onChange);
|
|
const toggle = toggleRow.querySelector('.magnify-toggle') as HTMLElement;
|
|
|
|
// Create keyboard event with spies
|
|
const event = new KeyboardEvent('keydown', { key: ' ' });
|
|
const preventDefaultSpy = vi.spyOn(event, 'preventDefault');
|
|
const stopPropagationSpy = vi.spyOn(event, 'stopPropagation');
|
|
|
|
toggle.dispatchEvent(event);
|
|
|
|
expect(toggle.classList.contains('active')).toBe(true);
|
|
expect(toggle.getAttribute('aria-checked')).toBe('true');
|
|
expect(onChange).toHaveBeenCalledWith(true);
|
|
expect(preventDefaultSpy).toHaveBeenCalled();
|
|
expect(stopPropagationSpy).toHaveBeenCalled();
|
|
});
|
|
});
|
|
|
|
describe('createSlider', () => {
|
|
it('should create an accessible slider', () => {
|
|
const onChange = vi.fn();
|
|
const sliderRow = createSlider('Test Slider', 50, 0, 100, 1, '%', onChange);
|
|
|
|
const labelEl = sliderRow.querySelector('label') as HTMLElement;
|
|
const input = sliderRow.querySelector('input[type="range"]') as HTMLInputElement;
|
|
|
|
expect(input).toBeTruthy();
|
|
expect(input.id).toBeTruthy();
|
|
expect(labelEl.getAttribute('for')).toBe(input.id);
|
|
expect(input.id).toMatch(/^magnify-slider-/);
|
|
});
|
|
});
|
|
|
|
describe('createSelect', () => {
|
|
it('should create an accessible select', () => {
|
|
const onChange = vi.fn();
|
|
const selectRow = createSelect('Test Select', 'Option 1', ['Option 1', 'Option 2'], onChange);
|
|
|
|
const labelEl = selectRow.querySelector('label') as HTMLElement;
|
|
const select = selectRow.querySelector('select') as HTMLSelectElement;
|
|
|
|
expect(select).toBeTruthy();
|
|
expect(select.id).toBeTruthy();
|
|
expect(labelEl.getAttribute('for')).toBe(select.id);
|
|
expect(select.id).toMatch(/^magnify-select-/);
|
|
});
|
|
});
|
|
|
|
describe('createColorPicker', () => {
|
|
it('should create an accessible color picker', () => {
|
|
const onChange = vi.fn();
|
|
const colorRow = createColorPicker('Test Color', '#000000', onChange);
|
|
|
|
const labelEl = colorRow.querySelector('label') as HTMLElement;
|
|
const input = colorRow.querySelector('input[type="color"]') as HTMLInputElement;
|
|
|
|
expect(input).toBeTruthy();
|
|
expect(input.id).toBeTruthy();
|
|
expect(labelEl.getAttribute('for')).toBe(input.id);
|
|
expect(input.id).toMatch(/^magnify-color-/);
|
|
});
|
|
});
|
|
});
|