Skip to content

Commit ad6c5b1

Browse files
AntoineThibimdjastrzebski
authored andcommitted
feat: implement toBeSelected
1 parent 8373d6a commit ad6c5b1

File tree

5 files changed

+109
-0
lines changed

5 files changed

+109
-0
lines changed
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import * as React from 'react';
2+
import { View } from 'react-native';
3+
import { render, screen } from '../..';
4+
import '../extend-expect';
5+
6+
test('.toBeSelected() basic case', () => {
7+
render(
8+
<View>
9+
<View testID="selected" accessibilityState={{ selected: true }} />
10+
<View testID="not-selected" accessibilityState={{ selected: false }} />
11+
<View testID="no-accessibilityState" />
12+
</View>
13+
);
14+
15+
expect(screen.getByTestId('selected')).toBeSelected();
16+
expect(screen.getByTestId('not-selected')).not.toBeSelected();
17+
expect(screen.getByTestId('no-accessibilityState')).not.toBeSelected();
18+
});
19+
20+
test('.toBeSelected() error messages', () => {
21+
render(
22+
<View>
23+
<View testID="selected" accessibilityState={{ selected: true }} />
24+
<View testID="not-selected" accessibilityState={{ selected: false }} />
25+
<View testID="no-accessibilityState" />
26+
</View>
27+
);
28+
29+
expect(() => expect(screen.getByTestId('not-selected')).toBeSelected())
30+
.toThrowErrorMatchingInlineSnapshot(`
31+
"expect(element).toBeSelected()
32+
33+
Expected the element to have accessibility state selected:
34+
35+
Received element is not selected:
36+
<View
37+
accessibilityState={
38+
{
39+
"selected": false,
40+
}
41+
}
42+
testID="not-selected"
43+
/>"
44+
`);
45+
expect(() => expect(screen.getByTestId('selected')).not.toBeSelected())
46+
.toThrowErrorMatchingInlineSnapshot(`
47+
"expect(element).not.toBeSelected()
48+
49+
Expected the element not to have accessibility state selected:
50+
51+
Received element is selected:
52+
<View
53+
accessibilityState={
54+
{
55+
"selected": true,
56+
}
57+
}
58+
testID="selected"
59+
/>"
60+
`);
61+
expect(() =>
62+
expect(screen.getByTestId('no-accessibilityState')).toBeSelected()
63+
).toThrowErrorMatchingInlineSnapshot(`
64+
"expect(element).toBeSelected()
65+
66+
Expected the element to have accessibility state selected:
67+
68+
Received element is not selected:
69+
<View
70+
testID="no-accessibilityState"
71+
/>"
72+
`);
73+
});

src/matchers/extend-expect.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface JestNativeMatchers<R> {
1111
toHaveDisplayValue(expectedValue: TextMatch, options?: TextMatchOptions): R;
1212
toHaveProp(name: string, expectedValue?: unknown): R;
1313
toHaveTextContent(expectedText: TextMatch, options?: TextMatchOptions): R;
14+
toBeSelected(): R;
1415
}
1516

1617
// Implicit Jest global `expect`.

src/matchers/extend-expect.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { toBeVisible } from './to-be-visible';
99
import { toHaveDisplayValue } from './to-have-display-value';
1010
import { toHaveProp } from './to-have-prop';
1111
import { toHaveTextContent } from './to-have-text-content';
12+
import { toBeSelected } from './to-be-selected';
1213

1314
expect.extend({
1415
toBeOnTheScreen,
@@ -21,4 +22,5 @@ expect.extend({
2122
toHaveDisplayValue,
2223
toHaveProp,
2324
toHaveTextContent,
25+
toBeSelected,
2426
});

src/matchers/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ export { toBeVisible } from './to-be-visible';
77
export { toHaveDisplayValue } from './to-have-display-value';
88
export { toHaveProp } from './to-have-prop';
99
export { toHaveTextContent } from './to-have-text-content';
10+
export { toBeSelected } from './to-be-selected';

src/matchers/to-be-selected.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { ReactTestInstance } from 'react-test-renderer';
2+
import { matcherHint } from 'jest-matcher-utils';
3+
import { getAccessibilityState } from '../helpers/accessiblity';
4+
import { checkHostElement, formatElement, formatMessage } from './utils';
5+
6+
export function toBeSelected(
7+
this: jest.MatcherContext,
8+
element: ReactTestInstance
9+
) {
10+
checkHostElement(element, toBeSelected, this);
11+
12+
return {
13+
pass: getAccessibilityState(element)?.selected === true,
14+
message: () => {
15+
const is = this.isNot ? 'is' : 'is not';
16+
const matcher = matcherHint(
17+
`${this.isNot ? '.not' : ''}.toBeSelected`,
18+
'element',
19+
''
20+
);
21+
return formatMessage(
22+
matcher,
23+
`Expected the element ${
24+
this.isNot ? 'not to' : 'to'
25+
} have accessibility state selected`,
26+
'',
27+
`Received element ${is} selected`,
28+
formatElement(element)
29+
);
30+
},
31+
};
32+
}

0 commit comments

Comments
 (0)