Skip to content

Commit 21527d5

Browse files
committed
fix: *ByA11yState default value false value for busy, disabled & selected state
1 parent 7ae763f commit 21527d5

File tree

2 files changed

+158
-8
lines changed

2 files changed

+158
-8
lines changed

src/queries/__tests__/a11yState.test.tsx

Lines changed: 139 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as React from 'react';
2-
import { TouchableOpacity, Text } from 'react-native';
2+
import { View, Text, Pressable, TouchableOpacity } from 'react-native';
33
import { render } from '../..';
44

55
const TEXT_LABEL = 'cool text';
@@ -96,3 +96,141 @@ test('getAllByA11yState, queryAllByA11yState, findAllByA11yState', async () => {
9696
2
9797
);
9898
});
99+
100+
describe('checked state matching', () => {
101+
it('handles true', () => {
102+
const view = render(<View accessibilityState={{ checked: true }} />);
103+
104+
expect(view.getByA11yState({ checked: true })).toBeTruthy();
105+
expect(view.queryByA11yState({ checked: 'mixed' })).toBeFalsy();
106+
expect(view.queryByA11yState({ checked: false })).toBeFalsy();
107+
});
108+
109+
it('handles mixed', () => {
110+
const view = render(<View accessibilityState={{ checked: 'mixed' }} />);
111+
112+
expect(view.getByA11yState({ checked: 'mixed' })).toBeTruthy();
113+
expect(view.queryByA11yState({ checked: true })).toBeFalsy();
114+
expect(view.queryByA11yState({ checked: false })).toBeFalsy();
115+
});
116+
117+
it('handles false', () => {
118+
const view = render(<View accessibilityState={{ checked: false }} />);
119+
120+
expect(view.getByA11yState({ checked: false })).toBeTruthy();
121+
expect(view.queryByA11yState({ checked: true })).toBeFalsy();
122+
expect(view.queryByA11yState({ checked: 'mixed' })).toBeFalsy();
123+
});
124+
125+
it('handles default', () => {
126+
const view = render(<View accessibilityState={{}} />);
127+
128+
expect(view.queryByA11yState({ checked: false })).toBeFalsy();
129+
expect(view.queryByA11yState({ checked: true })).toBeFalsy();
130+
expect(view.queryByA11yState({ checked: 'mixed' })).toBeFalsy();
131+
});
132+
});
133+
134+
describe('expanded state matching', () => {
135+
it('handles true', () => {
136+
const view = render(<View accessibilityState={{ expanded: true }} />);
137+
138+
expect(view.getByA11yState({ expanded: true })).toBeTruthy();
139+
expect(view.queryByA11yState({ expanded: false })).toBeFalsy();
140+
});
141+
142+
it('handles false', () => {
143+
const view = render(<View accessibilityState={{ expanded: false }} />);
144+
145+
expect(view.getByA11yState({ expanded: false })).toBeTruthy();
146+
expect(view.queryByA11yState({ expanded: true })).toBeFalsy();
147+
});
148+
149+
it('handles default', () => {
150+
const view = render(<View accessibilityState={{}} />);
151+
152+
expect(view.queryByA11yState({ expanded: false })).toBeFalsy();
153+
expect(view.queryByA11yState({ expanded: true })).toBeFalsy();
154+
});
155+
});
156+
157+
describe('disabled state matching', () => {
158+
it('handles true', () => {
159+
const view = render(<View accessibilityState={{ disabled: true }} />);
160+
161+
expect(view.getByA11yState({ disabled: true })).toBeTruthy();
162+
expect(view.queryByA11yState({ disabled: false })).toBeFalsy();
163+
});
164+
165+
it('handles false', () => {
166+
const view = render(<View accessibilityState={{ disabled: false }} />);
167+
168+
expect(view.getByA11yState({ disabled: false })).toBeTruthy();
169+
expect(view.queryByA11yState({ disabled: true })).toBeFalsy();
170+
});
171+
172+
it('handles default', () => {
173+
const view = render(<View accessibilityState={{}} />);
174+
175+
expect(view.getByA11yState({ disabled: false })).toBeTruthy();
176+
expect(view.queryByA11yState({ disabled: true })).toBeFalsy();
177+
});
178+
});
179+
180+
describe('busy state matching', () => {
181+
it('handles true', () => {
182+
const view = render(<View accessibilityState={{ busy: true }} />);
183+
184+
expect(view.getByA11yState({ busy: true })).toBeTruthy();
185+
expect(view.queryByA11yState({ busy: false })).toBeFalsy();
186+
});
187+
188+
it('handles false', () => {
189+
const view = render(<View accessibilityState={{ busy: false }} />);
190+
191+
expect(view.getByA11yState({ busy: false })).toBeTruthy();
192+
expect(view.queryByA11yState({ busy: true })).toBeFalsy();
193+
});
194+
195+
it('handles default', () => {
196+
const view = render(<View accessibilityState={{}} />);
197+
198+
expect(view.getByA11yState({ busy: false })).toBeTruthy();
199+
expect(view.queryByA11yState({ busy: true })).toBeFalsy();
200+
});
201+
});
202+
203+
describe('selected state matching', () => {
204+
it('handles true', () => {
205+
const view = render(<View accessibilityState={{ selected: true }} />);
206+
207+
expect(view.getByA11yState({ selected: true })).toBeTruthy();
208+
expect(view.queryByA11yState({ selected: false })).toBeFalsy();
209+
});
210+
211+
it('handles false', () => {
212+
const view = render(<View accessibilityState={{ selected: false }} />);
213+
214+
expect(view.getByA11yState({ selected: false })).toBeTruthy();
215+
expect(view.queryByA11yState({ selected: true })).toBeFalsy();
216+
});
217+
218+
it('handles default', () => {
219+
const view = render(<View accessibilityState={{}} />);
220+
221+
expect(view.getByA11yState({ selected: false })).toBeTruthy();
222+
expect(view.queryByA11yState({ selected: true })).toBeFalsy();
223+
});
224+
});
225+
226+
test('*ByA11yState on Pressable with "disabled" prop', () => {
227+
const view = render(<Pressable disabled />);
228+
expect(view.getByA11yState({ disabled: true })).toBeTruthy();
229+
expect(view.queryByA11yState({ disabled: false })).toBeFalsy();
230+
});
231+
232+
test('*ByA11yState on TouchableOpacity with "disabled" prop', () => {
233+
const view = render(<TouchableOpacity disabled />);
234+
expect(view.getByA11yState({ disabled: true })).toBeTruthy();
235+
expect(view.queryByA11yState({ disabled: false })).toBeFalsy();
236+
});

src/queries/a11yState.ts

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import type { ReactTestInstance } from 'react-test-renderer';
22
import type { AccessibilityState } from 'react-native';
3-
import { matchObjectProp } from '../helpers/matchers/matchObjectProp';
43
import { makeQueries } from './makeQueries';
54
import type {
65
FindAllByQuery,
@@ -11,15 +10,28 @@ import type {
1110
QueryByQuery,
1211
} from './makeQueries';
1312

13+
function matchState(value: unknown, matcher: unknown) {
14+
return matcher === undefined || value === matcher;
15+
}
16+
1417
const queryAllByA11yState = (
1518
instance: ReactTestInstance
16-
): ((state: AccessibilityState) => Array<ReactTestInstance>) =>
17-
function queryAllByA11yStateFn(state) {
18-
return instance.findAll(
19-
(node) =>
19+
): ((matcher: AccessibilityState) => Array<ReactTestInstance>) =>
20+
function queryAllByA11yStateFn(matcher) {
21+
return instance.findAll((node) => {
22+
const stateProp = node.props.accessibilityState;
23+
24+
// busy, disabled & selected states default to false,
25+
// while checked & expended states treat false and default as sepatate values
26+
return (
2027
typeof node.type === 'string' &&
21-
matchObjectProp(node.props.accessibilityState, state)
22-
);
28+
matchState(stateProp?.busy ?? false, matcher.busy) &&
29+
matchState(stateProp?.disabled ?? false, matcher.disabled) &&
30+
matchState(stateProp?.selected ?? false, matcher.selected) &&
31+
matchState(stateProp?.checked, matcher.checked) &&
32+
matchState(stateProp?.expanded, matcher.expanded)
33+
);
34+
});
2335
};
2436

2537
const getMultipleError = (state: AccessibilityState) =>

0 commit comments

Comments
 (0)