switch.client.spec.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // @vitest-environment jsdom
  2. import { cleanup, fireEvent, render, screen } from '@testing-library/react'
  3. import { afterEach, describe, expect, it, vi } from 'vitest'
  4. import { Switch } from '@deepseek-ai/dsh-client-ui-primitives'
  5. afterEach(cleanup)
  6. describe('Switch', () => {
  7. it('exposes its state and its caller-owned name to assistive technology', () => {
  8. render(<Switch checked label="Subagent model selection" onChange={() => {}} />)
  9. const control = screen.getByRole('switch', { name: 'Subagent model selection' })
  10. expect(control.getAttribute('aria-checked')).toBe('true')
  11. })
  12. it('reports the state the click asks for, not the state it has', () => {
  13. const onChange = vi.fn()
  14. const { rerender } = render(<Switch checked={false} label="Toggle" onChange={onChange} />)
  15. fireEvent.click(screen.getByRole('switch'))
  16. expect(onChange).toHaveBeenCalledWith(true)
  17. onChange.mockClear()
  18. rerender(<Switch checked label="Toggle" onChange={onChange} />)
  19. fireEvent.click(screen.getByRole('switch'))
  20. expect(onChange).toHaveBeenCalledWith(false)
  21. })
  22. it('stays silent while disabled', () => {
  23. const onChange = vi.fn()
  24. render(<Switch checked={false} disabled label="Toggle" onChange={onChange} />)
  25. const control = screen.getByRole('switch')
  26. expect((control as HTMLButtonElement).disabled).toBe(true)
  27. fireEvent.click(control)
  28. expect(onChange).not.toHaveBeenCalled()
  29. })
  30. it('carries a lock reason as the hover title when the owner names one', () => {
  31. render(<Switch checked={false} disabled label="Toggle" title="Managed by policy" onChange={() => {}} />)
  32. expect(screen.getByRole('switch').getAttribute('title')).toBe('Managed by policy')
  33. })
  34. it('never submits a surrounding form', () => {
  35. const onSubmit = vi.fn((event: { preventDefault: () => void }) => { event.preventDefault() })
  36. render(<form onSubmit={onSubmit}><Switch checked={false} label="Toggle" onChange={() => {}} /></form>)
  37. fireEvent.click(screen.getByRole('switch'))
  38. expect(onSubmit).not.toHaveBeenCalled()
  39. })
  40. it('keeps a caller class alongside its own so a render site can place it', () => {
  41. render(<Switch checked={false} className="placed" label="Toggle" onChange={() => {}} />)
  42. const control = screen.getByRole('switch')
  43. expect(control.classList.contains('placed')).toBe(true)
  44. expect(control.classList.length).toBeGreaterThan(1)
  45. })
  46. })