Skip to content

Commit 6cd8734

Browse files
anishamaldemdjastrzebski
authored andcommitted
feat: toHaveAccessibleName matcher
1 parent 4445c33 commit 6cd8734

File tree

3 files changed

+35
-43
lines changed

3 files changed

+35
-43
lines changed

src/helpers/accessiblity.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import {
44
StyleSheet,
55
} from 'react-native';
66
import { ReactTestInstance } from 'react-test-renderer';
7-
import { getHostSiblings } from './component-tree';
7+
import { getTextContent } from './text-content';
8+
import { getHostSiblings, getUnsafeRootElement } from './component-tree';
89
import { getHostComponentNames } from './host-component-names';
910

1011
type IsInaccessibleOptions = {
@@ -233,3 +234,23 @@ export function isElementSelected(
233234
const { accessibilityState, 'aria-selected': ariaSelected } = element.props;
234235
return ariaSelected ?? accessibilityState?.selected ?? false;
235236
}
237+
238+
export function getAccessibleName(
239+
element: ReactTestInstance
240+
): string | undefined {
241+
const labelTextFromLabel = getAccessibilityLabel(element);
242+
const labelTextFromLabelledBy = getAccessibilityLabelledBy(element);
243+
const rootElement = getUnsafeRootElement(element);
244+
245+
const labelledByElement = labelTextFromLabelledBy
246+
? rootElement?.findByProps({
247+
nativeID: labelTextFromLabelledBy,
248+
})
249+
: undefined;
250+
251+
const nameFromLabel = labelTextFromLabelledBy
252+
? labelledByElement && getTextContent(labelledByElement)
253+
: labelTextFromLabel;
254+
255+
return nameFromLabel || getTextContent(element) || undefined;
256+
}

src/helpers/matchers/accessibilityName.ts

Lines changed: 0 additions & 18 deletions
This file was deleted.

src/matchers/to-have-accessible-name.tsx

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,22 @@
11
import type { ReactTestInstance } from 'react-test-renderer';
22
import { matcherHint } from 'jest-matcher-utils';
3-
import { matchAccessibleName } from '../helpers/matchers/accessibilityName';
4-
import {
5-
getAccessibilityLabel,
6-
getAccessibilityLabelledBy,
7-
} from '../helpers/accessiblity';
8-
import { TextMatch, TextMatchOptions } from '../matches';
9-
import { getTextContent } from '../helpers/text-content';
10-
import { getUnsafeRootElement } from '../helpers/component-tree';
3+
import { TextMatch, TextMatchOptions, matches } from '../matches';
4+
import { getAccessibleName } from '../helpers/accessiblity';
115
import { checkHostElement, formatMessage } from './utils';
126

13-
export function getAccessibleName(
14-
element: ReactTestInstance
15-
): string | undefined {
16-
const labelTextFromLabel = getAccessibilityLabel(element);
17-
const labelTextFromLabelledBy = getAccessibilityLabelledBy(element);
18-
const rootElement = getUnsafeRootElement(element);
19-
20-
const labelledByElement = labelTextFromLabelledBy
21-
? rootElement?.findByProps({
22-
nativeID: labelTextFromLabelledBy,
23-
})
24-
: undefined;
7+
export function matchAccessibleName(
8+
node: ReactTestInstance,
9+
expectedName?: TextMatch,
10+
normalizer?: TextMatchOptions['normalizer'],
11+
exact?: TextMatchOptions['exact']
12+
): boolean {
13+
const accessibleName = getAccessibleName(node);
2514

26-
const nameFromLabel = labelTextFromLabelledBy
27-
? labelledByElement && getTextContent(labelledByElement)
28-
: labelTextFromLabel;
15+
if (expectedName) {
16+
return matches(expectedName, accessibleName, normalizer, exact);
17+
}
2918

30-
return nameFromLabel || getTextContent(element) || undefined;
19+
return !!accessibleName;
3120
}
3221

3322
export function toHaveAccessibleName(

0 commit comments

Comments
 (0)