Skip to content

Commit 5407f70

Browse files
fix: toBeDisabled now also evaluates disabled prop when element is Text (#1802)
Co-authored-by: Maciej Jastrzębski <[email protected]>
1 parent 2a764c7 commit 5407f70

File tree

2 files changed

+78
-5
lines changed

2 files changed

+78
-5
lines changed

src/helpers/__tests__/accessiblity.test.tsx

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from 'react';
22
import { Pressable, Switch, Text, TextInput, TouchableOpacity, View } from 'react-native';
33

44
import { isHiddenFromAccessibility, isInaccessible, render, screen } from '../..';
5-
import { computeAriaLabel, isAccessibilityElement } from '../accessibility';
5+
import { computeAriaDisabled, computeAriaLabel, isAccessibilityElement } from '../accessibility';
66

77
describe('isHiddenFromAccessibility', () => {
88
test('returns false for accessible elements', () => {
@@ -278,11 +278,11 @@ describe('isHiddenFromAccessibility', () => {
278278
test('has isInaccessible alias', () => {
279279
expect(isInaccessible).toBe(isHiddenFromAccessibility);
280280
});
281-
});
282281

283-
test('is not triggered for element with "aria-modal" prop', () => {
284-
render(<View aria-modal testID="subject" />);
285-
expect(isHiddenFromAccessibility(screen.getByTestId('subject'))).toBe(false);
282+
test('is not triggered for element with "aria-modal" prop', () => {
283+
render(<View aria-modal testID="subject" />);
284+
expect(isHiddenFromAccessibility(screen.getByTestId('subject'))).toBe(false);
285+
});
286286
});
287287

288288
describe('isAccessibilityElement', () => {
@@ -408,3 +408,71 @@ describe('computeAriaLabel', () => {
408408
expect(computeAriaLabel(screen.getByTestId('subject'))).toEqual('External Label');
409409
});
410410
});
411+
412+
describe('computeAriaDisabled', () => {
413+
test('supports basic usage', () => {
414+
render(
415+
<View>
416+
<View testID="default" />
417+
<View testID="disabled" aria-disabled />
418+
<View testID="disabled-false" aria-disabled={false} />
419+
<View testID="disabled-by-state" accessibilityState={{ disabled: true }} />
420+
<View testID="disabled-false-by-state" accessibilityState={{ disabled: false }} />
421+
</View>,
422+
);
423+
424+
expect(computeAriaDisabled(screen.getByTestId('default'))).toBe(false);
425+
expect(computeAriaDisabled(screen.getByTestId('disabled'))).toBe(true);
426+
expect(computeAriaDisabled(screen.getByTestId('disabled-false'))).toBe(false);
427+
expect(computeAriaDisabled(screen.getByTestId('disabled-by-state'))).toBe(true);
428+
expect(computeAriaDisabled(screen.getByTestId('disabled-false-by-state'))).toBe(false);
429+
});
430+
431+
test('supports TextInput', () => {
432+
render(
433+
<View>
434+
<TextInput testID="default" />
435+
<TextInput testID="editable" editable />
436+
<TextInput testID="editable-false" editable={false} />
437+
</View>,
438+
);
439+
440+
expect(computeAriaDisabled(screen.getByTestId('default'))).toBe(false);
441+
expect(computeAriaDisabled(screen.getByTestId('editable'))).toBe(false);
442+
expect(computeAriaDisabled(screen.getByTestId('editable-false'))).toBe(true);
443+
});
444+
445+
test('supports Button', () => {
446+
render(
447+
<View>
448+
<Pressable testID="default" role="button">
449+
<Text>Default Button</Text>
450+
</Pressable>
451+
<Pressable testID="disabled" role="button" disabled>
452+
<Text>Disabled Button</Text>
453+
</Pressable>
454+
<Pressable testID="disabled-false" role="button" disabled={false}>
455+
<Text>Disabled False Button</Text>
456+
</Pressable>
457+
</View>,
458+
);
459+
460+
expect(computeAriaDisabled(screen.getByTestId('default'))).toBe(false);
461+
expect(computeAriaDisabled(screen.getByTestId('disabled'))).toBe(true);
462+
expect(computeAriaDisabled(screen.getByTestId('disabled-false'))).toBe(false);
463+
});
464+
465+
test('supports Text', () => {
466+
render(
467+
<View>
468+
<Text>Default Text</Text>
469+
<Text disabled>Disabled Text</Text>
470+
<Text aria-disabled>ARIA Disabled Text</Text>
471+
</View>,
472+
);
473+
474+
expect(computeAriaDisabled(screen.getByText('Default Text'))).toBe(false);
475+
expect(computeAriaDisabled(screen.getByText('Disabled Text'))).toBe(true);
476+
expect(computeAriaDisabled(screen.getByText('ARIA Disabled Text'))).toBe(true);
477+
});
478+
});

src/helpers/accessibility.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,11 @@ export function computeAriaDisabled(element: ReactTestInstance): boolean {
209209
}
210210

211211
const { props } = element;
212+
213+
if (isHostText(element) && props.disabled) {
214+
return true;
215+
}
216+
212217
return props['aria-disabled'] ?? props.accessibilityState?.disabled ?? false;
213218
}
214219

0 commit comments

Comments
 (0)