Skip to content

Commit 4329c70

Browse files
committed
fix the tests + use VisuallyHidden component to insert accessible text
1 parent 39cbe2d commit 4329c70

File tree

3 files changed

+35
-8
lines changed

3 files changed

+35
-8
lines changed

src/components/Spinner.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import { useConfig } from '../hooks/useConfig.js'
22
import { cn } from '../lib/utils.js'
33
import styles from '../styles/Spinner.module.css'
4+
import VisuallyHidden from './VisuallyHidden.js'
45

5-
export default function Spinner() {
6+
export default function Spinner({ text }: {text?: string}) {
67
const { customClass } = useConfig()
7-
return <div className={cn(styles.spinner, customClass?.spinner)}></div>
8+
const spinnerText = text ?? 'Loading...'
9+
return <div
10+
className={cn(styles.spinner, customClass?.spinner)}
11+
role='status'
12+
aria-live='polite'
13+
><VisuallyHidden>{spinnerText}</VisuallyHidden></div>
814
}

test/components/Folder.test.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ describe('Folder Component', () => {
5858
const source = getHyperparamSource('', { endpoint })
5959
assert(source?.kind === 'directory')
6060

61-
const { container } = await act(() => render(<Folder source={source} />))
62-
expect(container.querySelector('.spinner')).toBeTruthy()
61+
const { getByText } = await act(() => render(<Folder source={source} />))
62+
const spinner = getByText('Loading...')
63+
expect(spinner).toBeDefined()
6364
})
6465

6566
it('handles file listing errors', async () => {

test/components/Spinner.test.tsx

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,32 @@
11
import { render } from '@testing-library/react'
22
import React from 'react'
33
import { describe, expect, it } from 'vitest'
4-
import { Spinner } from '../../src/index.js'
4+
import { ConfigProvider, Spinner } from '../../src/index.js'
55

66
describe('Spinner Component', () => {
77
it('renders with base and additional class names', () => {
8-
const { container } = render(<Spinner className="extra" />)
9-
expect(container.firstElementChild?.classList).toContain('spinner')
10-
expect(container.firstElementChild?.classList).toContain('extra')
8+
const { container } = render(
9+
<ConfigProvider value={{ customClass: { spinner: 'extra' } }}>
10+
<Spinner/>
11+
</ConfigProvider>
12+
)
13+
const classNames = [...container.firstElementChild?.classList.values() ?? []]
14+
// Vite generates class names for CSS modules that look like _spinner_c053a8
15+
expect(classNames.some(className => className.startsWith('_spinner_'))).toBe(true)
16+
expect(classNames).toContain('extra')
17+
})
18+
it('is accessible as a role=status element', () => {
19+
const { container } = render( <Spinner/> )
20+
expect(container.firstElementChild?.getAttribute('role')).toBe('status')
21+
expect(container.firstElementChild?.getAttribute('aria-live')).toBe('polite')
22+
})
23+
it('contains an accessible text for screen readers', () => {
24+
const { getByText } = render( <Spinner/> )
25+
expect(getByText('Loading...')).toBeDefined()
26+
})
27+
it('let pass a custom accessible text for screen readers', () => {
28+
const text = 'Fetching data'
29+
const { getByText } = render( <Spinner text={text}/> )
30+
expect(getByText(text)).toBeDefined()
1131
})
1232
})

0 commit comments

Comments
 (0)