Skip to content

Commit 68e7201

Browse files
committed
fix: toBeDisabled now also evaluates disabled prop when element is Text
1 parent cc1e249 commit 68e7201

File tree

2 files changed

+74
-5
lines changed

2 files changed

+74
-5
lines changed

src/helpers/__tests__/accessiblity.test.tsx

Lines changed: 69 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,67 @@ 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="disabled" aria-disabled />
417+
<View testID="not-disabled" />
418+
<View testID="disabled-by-state" accessibilityState={{ disabled: true }} />
419+
<View testID="not-disabled-by-state" accessibilityState={{ disabled: false }} />
420+
</View>,
421+
);
422+
423+
expect(computeAriaDisabled(screen.getByTestId('disabled'))).toBe(true);
424+
expect(computeAriaDisabled(screen.getByTestId('not-disabled'))).toBe(false);
425+
expect(computeAriaDisabled(screen.getByTestId('disabled-by-state'))).toBe(true);
426+
expect(computeAriaDisabled(screen.getByTestId('not-disabled-by-state'))).toBe(false);
427+
});
428+
429+
test('supports TextInput', () => {
430+
render(
431+
<View>
432+
<TextInput testID="disabled" editable={false} />
433+
<TextInput testID="not-disabled" editable />
434+
</View>,
435+
);
436+
437+
expect(computeAriaDisabled(screen.getByTestId('disabled'))).toBe(true);
438+
expect(computeAriaDisabled(screen.getByTestId('not-disabled'))).toBe(false);
439+
});
440+
441+
test('supports Button', () => {
442+
render(
443+
<View>
444+
<Pressable testID="disabled" disabled>
445+
<Text>Disabled Button</Text>
446+
</Pressable>
447+
<Pressable testID="not-disabled">
448+
<Text>Enabled Button</Text>
449+
</Pressable>
450+
</View>,
451+
);
452+
453+
expect(computeAriaDisabled(screen.getByTestId('disabled'))).toBe(true);
454+
expect(computeAriaDisabled(screen.getByTestId('not-disabled'))).toBe(false);
455+
});
456+
457+
test('supports Text', () => {
458+
render(
459+
<View>
460+
<Text testID="disabled" disabled>
461+
Disabled Text
462+
</Text>
463+
<Text testID="aria-disabled" aria-disabled>
464+
Disabled Text
465+
</Text>
466+
<Text testID="not-disabled">Enabled Text</Text>
467+
</View>,
468+
);
469+
470+
expect(computeAriaDisabled(screen.getByTestId('disabled'))).toBe(true);
471+
expect(computeAriaDisabled(screen.getByTestId('aria-disabled'))).toBe(true);
472+
expect(computeAriaDisabled(screen.getByTestId('not-disabled'))).toBe(false);
473+
});
474+
});

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)