Skip to content

Commit 2b34806

Browse files
author
Bianca Del Carretto
committed
add role-helpers function to retrieve superclass from role (testing-library#448)
1 parent 373dbc4 commit 2b34806

File tree

2 files changed

+68
-2
lines changed

2 files changed

+68
-2
lines changed

src/__tests__/role-helpers.js

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
logRoles,
44
getImplicitAriaRoles,
55
isInaccessible,
6+
getRolesAndSuperClassByRoles,
67
} from '../role-helpers'
78
import {render} from './helpers/test-utils'
89

@@ -181,6 +182,48 @@ test.each([
181182
])('shouldExcludeFromA11yTree for %s returns %p', (html, expected) => {
182183
const {container} = render(html)
183184
container.firstChild.appendChild(document.createElement('button'))
184-
185185
expect(isInaccessible(container.querySelector('button'))).toBe(expected)
186186
})
187+
188+
test.each([
189+
['', []],
190+
['roletype', ['roletype']],
191+
['switch', ['roletype', 'widget', 'input', 'checkbox', 'switch']],
192+
['input', ['roletype', 'widget', 'input']],
193+
[
194+
'select',
195+
[
196+
'roletype',
197+
'widget',
198+
'composite',
199+
'structure',
200+
'section',
201+
'group',
202+
'select',
203+
],
204+
],
205+
[
206+
['switch', 'input'],
207+
['roletype', 'widget', 'input', 'checkbox', 'switch'],
208+
],
209+
[
210+
['switch', 'select'],
211+
[
212+
'roletype',
213+
'widget',
214+
'input',
215+
'checkbox',
216+
'composite',
217+
'structure',
218+
'section',
219+
'group',
220+
'switch',
221+
'select',
222+
],
223+
],
224+
])(
225+
'getSuperClassByRole returns expected roles as super class for given roles',
226+
(roles, expected) => {
227+
expect(getRolesAndSuperClassByRoles(roles).sort()).toEqual(expected.sort())
228+
},
229+
)

src/role-helpers.js

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {elementRoles} from 'aria-query'
1+
import {elementRoles, roles as rolesMap} from 'aria-query'
22
import {computeAccessibleName} from 'dom-accessibility-api'
33
import {prettyDOM} from './pretty-dom'
44

@@ -196,6 +196,28 @@ function computeAriaSelected(element) {
196196
return undefined
197197
}
198198

199+
function getRolesAndSuperClassByRoles(roles) {
200+
if (!roles || roles.length === 0) {
201+
return []
202+
}
203+
const rolesList = Array.isArray(roles) ? roles : [roles]
204+
const superClasses = rolesList.reduce(
205+
(acc, role) => {
206+
const roleDefinition = rolesMap.get(role)
207+
if (!roleDefinition) {
208+
return acc
209+
}
210+
const superClassesFlatten = roleDefinition.superClass.reduce(
211+
(superClassesList, superClass) => [...superClassesList, ...superClass],
212+
[],
213+
)
214+
return [...acc, ...superClassesFlatten]
215+
},
216+
[...rolesList],
217+
)
218+
return Array.from(new Set(superClasses))
219+
}
220+
199221
export {
200222
getRoles,
201223
logRoles,
@@ -204,4 +226,5 @@ export {
204226
prettyRoles,
205227
isInaccessible,
206228
computeAriaSelected,
229+
getRolesAndSuperClassByRoles,
207230
}

0 commit comments

Comments
 (0)