Skip to content

Commit 21fb204

Browse files
committed
feat(toHaveValue): Asserting aria-valuenow
Resolves testing-library#478
1 parent 948d90f commit 21fb204

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

src/__tests__/to-have-value.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,4 +203,14 @@ Received:
203203
<red> foo</>
204204
`)
205205
})
206+
207+
test('handles value of aria-valuenow', () => {
208+
const valueToCheck = 70
209+
const {queryByTestId} = render(`
210+
<div role="meter" aria-valuemin="0" aria-valuemax="100" aria-valuenow="${valueToCheck}" data-testid="meter"></div>
211+
`)
212+
213+
expect(queryByTestId('meter')).toHaveValue(valueToCheck)
214+
expect(queryByTestId('meter')).not.toHaveValue(valueToCheck + 1)
215+
})
206216
})

src/utils.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,18 +197,31 @@ function getInputValue(inputElement) {
197197
}
198198
}
199199

200+
const rolesSupportingValues = ['meter', 'progressbar', 'slider', 'spinbutton']
201+
function getAccessibleValue(element) {
202+
if (!rolesSupportingValues.includes(element.getAttribute('role'))) {
203+
return
204+
}
205+
// We want same behavior as accessing the `value` property
206+
// eslint-disable-next-line consistent-return
207+
return Number(element.getAttribute('aria-valuenow'))
208+
}
209+
200210
function getSingleElementValue(element) {
201211
/* istanbul ignore if */
202212
if (!element) {
203213
return undefined
204214
}
215+
205216
switch (element.tagName.toLowerCase()) {
206217
case 'input':
207218
return getInputValue(element)
208219
case 'select':
209220
return getSelectValue(element)
210-
default:
211-
return element.value
221+
default: {
222+
const accessibleValue = getAccessibleValue(element)
223+
return element.value ?? accessibleValue
224+
}
212225
}
213226
}
214227

0 commit comments

Comments
 (0)