Skip to content

Commit 90d8070

Browse files
committed
feat(toHaveValue): Asserting aria-valuenow
Resolves testing-library#478
1 parent 47a667c commit 90d8070

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
@@ -196,18 +196,31 @@ function getInputValue(inputElement) {
196196
}
197197
}
198198

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

0 commit comments

Comments
 (0)