Skip to content

Commit 8da1da2

Browse files
Jack Popefacebook-github-bot
authored andcommitted
Add findAll base query method (facebook#42829)
Summary: Pull Request resolved: facebook#42829 This is the base query method that we can wrap to use specific matchers like `findByTestID` or `findByRole` Changelog: [internal] Reviewed By: noahlemen Differential Revision: D53359005 fbshipit-source-id: d1ac9c503b05d479567b6ced71d4517d5bc55b0b
1 parent bc3fe0d commit 8da1da2

File tree

2 files changed

+39
-4
lines changed

2 files changed

+39
-4
lines changed

packages/react-native-test-renderer/src/renderer/__tests__/render-test.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,19 @@ describe('render', () => {
4545
expect(result.toJSON()).toMatchSnapshot();
4646
});
4747
});
48+
49+
describe('findAll', () => {
50+
it('returns all nodes matching the predicate', () => {
51+
const result = ReactNativeTestRenderer.render(<TestComponent />);
52+
const textNode = result.findAll(node => {
53+
return node.props?.text === 'Hello';
54+
})[0];
55+
expect(textNode).not.toBeUndefined();
56+
57+
const viewNodes = result.findAll(node => {
58+
return node.viewName === 'RCTView';
59+
});
60+
expect(viewNodes.length).toBe(2);
61+
});
62+
});
4863
});

packages/react-native-test-renderer/src/renderer/index.js

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,10 @@ type FiberPartial = {
2525
};
2626

2727
type ReactNode = {
28-
children: $ReadOnlyArray<ReactNode>,
28+
children: ?Array<ReactNode>,
2929
props: {text?: string | null, ...},
3030
viewName: string,
3131
instanceHandle: FiberPartial,
32-
...
3332
};
3433

3534
type RenderedNodeJSON = {
@@ -41,12 +40,14 @@ type RenderedNodeJSON = {
4140
type RenderedJSON = RenderedNodeJSON | string;
4241

4342
type RenderResult = {
44-
toJSON: () => $ReadOnlyArray<RenderedJSON> | RenderedJSON | null,
43+
toJSON: () => Array<RenderedJSON> | RenderedJSON | null,
44+
findAll: (predicate: (ReactNode) => boolean) => Array<ReactNode>,
4545
};
4646

4747
function buildRenderResult(rootNode: ReactNode): RenderResult {
4848
return {
4949
toJSON: () => toJSON(rootNode),
50+
findAll: (predicate: ReactNode => boolean) => findAll(rootNode, predicate),
5051
};
5152
}
5253

@@ -61,7 +62,7 @@ export function render(element: Element<ElementType>): RenderResult {
6162
});
6263

6364
// $FlowFixMe
64-
const root: RootReactNode = manager.getRoot(containerTag);
65+
const root: [ReactNode] = manager.getRoot(containerTag);
6566

6667
if (root == null) {
6768
throw new Error('No root found for containerTag ' + containerTag);
@@ -94,3 +95,22 @@ function toJSON(node: ReactNode): RenderedJSON {
9495

9596
return json;
9697
}
98+
99+
function findAll(
100+
node: ReactNode,
101+
predicate: ReactNode => boolean,
102+
): Array<ReactNode> {
103+
const results = [];
104+
105+
if (predicate(node)) {
106+
results.push(node);
107+
}
108+
109+
if (node.children != null && node.children.length > 0) {
110+
for (const child of node.children) {
111+
results.push(...findAll(child, predicate));
112+
}
113+
}
114+
115+
return results;
116+
}

0 commit comments

Comments
 (0)