Skip to content

Commit 6495c63

Browse files
committed
Fix buggy implementation
1 parent 9a8b641 commit 6495c63

File tree

2 files changed

+70
-4
lines changed

2 files changed

+70
-4
lines changed

src/queries/__tests__/role.test.tsx

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,17 @@ describe('supports accessibility states', () => {
234234

235235
expect(getByRole('button', { disabled: false })).toBeTruthy();
236236
});
237+
238+
test('does not return disabled elements when querying for non disabled', () => {
239+
const { queryByRole } = render(
240+
<TouchableOpacity
241+
accessibilityRole="button"
242+
accessibilityState={{ disabled: true }}
243+
></TouchableOpacity>
244+
);
245+
246+
expect(queryByRole('button', { disabled: false })).toBe(null);
247+
});
237248
});
238249

239250
describe('selected', () => {
@@ -287,6 +298,17 @@ describe('supports accessibility states', () => {
287298

288299
expect(getByRole('tab', { selected: false })).toBeTruthy();
289300
});
301+
302+
test('does not return selected elements when querying for non selected', () => {
303+
const { queryByRole } = render(
304+
<TouchableOpacity
305+
accessibilityRole="tab"
306+
accessibilityState={{ selected: true }}
307+
></TouchableOpacity>
308+
);
309+
310+
expect(queryByRole('tab', { selected: false })).toBe(null);
311+
});
290312
});
291313

292314
describe('checked', () => {
@@ -312,6 +334,17 @@ describe('supports accessibility states', () => {
312334
expect(getByRole('checkbox', { checked: 'mixed' })).toBeTruthy();
313335
});
314336

337+
it('does not return mixed checkboxes when querying for checked: true', () => {
338+
const { queryByRole } = render(
339+
<TouchableOpacity
340+
accessibilityRole="checkbox"
341+
accessibilityState={{ checked: 'mixed' }}
342+
/>
343+
);
344+
345+
expect(queryByRole('checkbox', { checked: false })).toBe(null);
346+
});
347+
315348
test('returns the correct element when only one matches all the requirements', () => {
316349
const { getByRole } = render(
317350
<>
@@ -351,6 +384,17 @@ describe('supports accessibility states', () => {
351384

352385
expect(getByRole('checkbox', { checked: false })).toBeTruthy();
353386
});
387+
388+
test('does not return checked elements when querying for non checked', () => {
389+
const { queryByRole } = render(
390+
<TouchableOpacity
391+
accessibilityRole="checkbox"
392+
accessibilityState={{ checked: true }}
393+
></TouchableOpacity>
394+
);
395+
396+
expect(queryByRole('checkbox', { checked: false })).toBe(null);
397+
});
354398
});
355399

356400
describe('busy', () => {
@@ -404,6 +448,17 @@ describe('supports accessibility states', () => {
404448

405449
expect(getByRole('button', { busy: false })).toBeTruthy();
406450
});
451+
452+
test('does not return busy elements when querying for non busy', () => {
453+
const { queryByRole } = render(
454+
<TouchableOpacity
455+
accessibilityRole="button"
456+
accessibilityState={{ selected: true }}
457+
></TouchableOpacity>
458+
);
459+
460+
expect(queryByRole('button', { selected: false })).toBe(null);
461+
});
407462
});
408463

409464
describe('expanded', () => {
@@ -457,6 +512,17 @@ describe('supports accessibility states', () => {
457512

458513
expect(getByRole('button', { expanded: false })).toBeTruthy();
459514
});
515+
516+
test('does not return expanded elements when querying for non expanded', () => {
517+
const { queryByRole } = render(
518+
<TouchableOpacity
519+
accessibilityRole="button"
520+
accessibilityState={{ expanded: true }}
521+
></TouchableOpacity>
522+
);
523+
524+
expect(queryByRole('button', { expanded: false })).toBe(null);
525+
});
460526
});
461527

462528
test('matches an element combining all the options', () => {

src/queries/role.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,11 @@ const queryAllByRole = (
5757
return accessibilityStates.every((accessibilityState) => {
5858
const queriedState = options?.[accessibilityState];
5959

60-
// test for true instead of `undefined`, because `{disabled: false} should match
61-
// a button without a disable state`
62-
if (queriedState === true) {
60+
if (typeof queriedState !== 'undefined') {
6361
return (
64-
queriedState === node.props.accessibilityState?.[accessibilityState]
62+
queriedState ===
63+
// default to false because disabled:undefined is equivalent to disabled:false
64+
(node.props.accessibilityState?.[accessibilityState] ?? false)
6565
);
6666
} else {
6767
return true;

0 commit comments

Comments
 (0)