Skip to content

Commit 9426f6c

Browse files
committed
tests
1 parent 7eb175b commit 9426f6c

1 file changed

Lines changed: 82 additions & 0 deletions

File tree

test/unit/widgets/modals.test.ts

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { silenceDebugMessages } from '../helpers/debugger'
2+
import { createListModal } from '../../../src/widgets/modals'
3+
4+
silenceDebugMessages()
5+
6+
describe('modals', () => {
7+
afterEach(() => {
8+
jest.useRealTimers()
9+
document.body.innerHTML = ''
10+
})
11+
12+
it('creates a dialog modal with default accessibility attributes', () => {
13+
const modal = createListModal(document, [], {})
14+
15+
expect(modal).toBeInstanceOf(HTMLDivElement)
16+
expect(modal.getAttribute('role')).toEqual('dialog')
17+
expect(modal.getAttribute('aria-modal')).toEqual('false')
18+
expect(modal.getAttribute('aria-label')).toEqual('List dialog')
19+
expect(modal.getAttribute('tabindex')).toEqual('-1')
20+
})
21+
22+
it('renders list items with links and custom aria label', () => {
23+
const modal = createListModal(
24+
document,
25+
[{ label: 'Solid', link: 'https://solidproject.org/' }],
26+
{ ariaLabel: 'Resource links', withGreyedBackground: true }
27+
)
28+
29+
const list = modal.querySelector('ul') as HTMLUListElement
30+
const anchor = modal.querySelector('a') as HTMLAnchorElement
31+
32+
expect(list.getAttribute('role')).toEqual('list')
33+
expect(anchor.textContent).toEqual('Solid')
34+
expect(anchor.href).toEqual('https://solidproject.org/')
35+
expect(modal.getAttribute('aria-label')).toEqual('Resource links')
36+
expect(modal.getAttribute('aria-modal')).toEqual('true')
37+
})
38+
39+
it('uses an accessible close button', () => {
40+
const modal = createListModal(document, [], {})
41+
const closeButton = modal.querySelector('button') as HTMLButtonElement
42+
43+
expect(closeButton).toBeInstanceOf(HTMLButtonElement)
44+
expect(closeButton.getAttribute('type')).toEqual('button')
45+
expect(closeButton.getAttribute('aria-label')).toEqual('Close modal')
46+
})
47+
48+
it('closes on close button click and restores focus to trigger element', () => {
49+
jest.useFakeTimers()
50+
51+
const trigger = document.createElement('button')
52+
document.body.appendChild(trigger)
53+
trigger.focus()
54+
55+
const modal = createListModal(document, [], {})
56+
document.body.appendChild(modal)
57+
58+
jest.runAllTimers()
59+
60+
const closeButton = modal.querySelector('button') as HTMLButtonElement
61+
modal.style.display = 'block'
62+
closeButton.click()
63+
64+
expect(modal.style.display).toEqual('none')
65+
expect(document.activeElement).toBe(trigger)
66+
})
67+
68+
it('closes on Escape and restores focus to trigger element', () => {
69+
const trigger = document.createElement('button')
70+
document.body.appendChild(trigger)
71+
trigger.focus()
72+
73+
const modal = createListModal(document, [], {})
74+
document.body.appendChild(modal)
75+
modal.style.display = 'block'
76+
77+
modal.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }))
78+
79+
expect(modal.style.display).toEqual('none')
80+
expect(document.activeElement).toBe(trigger)
81+
})
82+
})

0 commit comments

Comments
 (0)