Skip to content

Commit b9fef59

Browse files
authoredNov 21, 2023
feat(prefer-presence-queries): support react-native matcher toBeOnTheScreen (#844)
Update `testing-library/prefer-presence-queries` rule to support custom react-native matcher `toBeOnTheScreen`s Signed-off-by: Davyd NRB <4661784+retyui@users.noreply.github.com>
1 parent 9709343 commit b9fef59

File tree

2 files changed

+232
-1
lines changed

2 files changed

+232
-1
lines changed
 

‎lib/utils/index.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,12 @@ const ALL_RETURNING_NODES = [
110110
...METHODS_RETURNING_NODES,
111111
];
112112

113-
const PRESENCE_MATCHERS = ['toBeInTheDocument', 'toBeTruthy', 'toBeDefined'];
113+
const PRESENCE_MATCHERS = [
114+
'toBeOnTheScreen',
115+
'toBeInTheDocument',
116+
'toBeTruthy',
117+
'toBeDefined',
118+
];
114119
const ABSENCE_MATCHERS = ['toBeNull', 'toBeFalsy'];
115120

116121
export {

‎tests/lib/rules/prefer-presence-queries.test.ts

+226
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,11 @@ ruleTester.run(RULE_NAME, rule, {
138138
matcher: '.toBeInTheDocument()',
139139
assertionType: 'presence',
140140
}),
141+
...getValidAssertions({
142+
query: queryName,
143+
matcher: '.toBeOnTheScreen()',
144+
assertionType: 'presence',
145+
}),
141146
...getValidAssertions({
142147
query: queryName,
143148
matcher: '.toBeTruthy()',
@@ -191,6 +196,12 @@ ruleTester.run(RULE_NAME, rule, {
191196
shouldUseScreen: true,
192197
assertionType: 'presence',
193198
}),
199+
...getValidAssertions({
200+
query: queryName,
201+
matcher: '.toBeOnTheScreen()',
202+
shouldUseScreen: true,
203+
assertionType: 'presence',
204+
}),
194205
...getValidAssertions({
195206
query: queryName,
196207
matcher: '.toBeTruthy()',
@@ -251,6 +262,11 @@ ruleTester.run(RULE_NAME, rule, {
251262
matcher: '.toBeInTheDocument()',
252263
assertionType: 'presence',
253264
}),
265+
...getValidAssertions({
266+
query: queryName,
267+
matcher: '.toBeOnTheScreen()',
268+
assertionType: 'presence',
269+
}),
254270
...getValidAssertions({
255271
query: queryName,
256272
matcher: '.toBeTruthy()',
@@ -304,6 +320,12 @@ ruleTester.run(RULE_NAME, rule, {
304320
shouldUseScreen: true,
305321
assertionType: 'presence',
306322
}),
323+
...getValidAssertions({
324+
query: queryName,
325+
matcher: '.toBeOnTheScreen()',
326+
shouldUseScreen: true,
327+
assertionType: 'presence',
328+
}),
307329
...getValidAssertions({
308330
query: queryName,
309331
matcher: '.toBeTruthy()',
@@ -374,6 +396,11 @@ ruleTester.run(RULE_NAME, rule, {
374396
matcher: '.not.toBeInTheDocument()',
375397
assertionType: 'absence',
376398
}),
399+
...getValidAssertions({
400+
query: queryName,
401+
matcher: '.not.toBeOnTheScreen()',
402+
assertionType: 'absence',
403+
}),
377404
...getValidAssertions({
378405
query: queryName,
379406
matcher: '.not.toBeTruthy()',
@@ -419,6 +446,12 @@ ruleTester.run(RULE_NAME, rule, {
419446
shouldUseScreen: true,
420447
assertionType: 'absence',
421448
}),
449+
...getValidAssertions({
450+
query: queryName,
451+
matcher: '.not.toBeOnTheScreen()',
452+
shouldUseScreen: true,
453+
assertionType: 'absence',
454+
}),
422455
...getValidAssertions({
423456
query: queryName,
424457
matcher: '.not.toBeTruthy()',
@@ -465,6 +498,11 @@ ruleTester.run(RULE_NAME, rule, {
465498
matcher: '.not.toBeInTheDocument()',
466499
assertionType: 'absence',
467500
}),
501+
...getValidAssertions({
502+
query: queryName,
503+
matcher: '.not.toBeOnTheScreen()',
504+
assertionType: 'absence',
505+
}),
468506
...getValidAssertions({
469507
query: queryName,
470508
matcher: '.not.toBeTruthy()',
@@ -510,6 +548,12 @@ ruleTester.run(RULE_NAME, rule, {
510548
shouldUseScreen: true,
511549
assertionType: 'absence',
512550
}),
551+
...getValidAssertions({
552+
query: queryName,
553+
matcher: '.not.toBeOnTheScreen()',
554+
shouldUseScreen: true,
555+
assertionType: 'absence',
556+
}),
513557
...getValidAssertions({
514558
query: queryName,
515559
matcher: '.not.toBeTruthy()',
@@ -557,6 +601,11 @@ ruleTester.run(RULE_NAME, rule, {
557601
matcher: '.not.toBeInTheDocument',
558602
assertionType: 'absence',
559603
}),
604+
getDisabledValidAssertion({
605+
query: queryName,
606+
matcher: '.not.toBeOnTheScreen',
607+
assertionType: 'absence',
608+
}),
560609
getDisabledValidAssertion({
561610
query: queryName,
562611
matcher: '.not.toBeTruthy()',
@@ -592,6 +641,12 @@ ruleTester.run(RULE_NAME, rule, {
592641
shouldUseScreen: true,
593642
assertionType: 'absence',
594643
}),
644+
getDisabledValidAssertion({
645+
query: queryName,
646+
matcher: '.not.toBeOnTheScreen',
647+
shouldUseScreen: true,
648+
assertionType: 'absence',
649+
}),
595650
getDisabledValidAssertion({
596651
query: queryName,
597652
matcher: '.not.toBeTruthy()',
@@ -626,6 +681,11 @@ ruleTester.run(RULE_NAME, rule, {
626681
matcher: '.not.toBeInTheDocument',
627682
assertionType: 'absence',
628683
}),
684+
getDisabledValidAssertion({
685+
query: queryName,
686+
matcher: '.not.toBeOnTheScreen',
687+
assertionType: 'absence',
688+
}),
629689
getDisabledValidAssertion({
630690
query: queryName,
631691
matcher: '.not.toBeTruthy()',
@@ -661,6 +721,12 @@ ruleTester.run(RULE_NAME, rule, {
661721
shouldUseScreen: true,
662722
assertionType: 'absence',
663723
}),
724+
getDisabledValidAssertion({
725+
query: queryName,
726+
matcher: '.not.toBeOnTheScreen',
727+
shouldUseScreen: true,
728+
assertionType: 'absence',
729+
}),
664730
getDisabledValidAssertion({
665731
query: queryName,
666732
matcher: '.not.toBeTruthy()',
@@ -695,6 +761,11 @@ ruleTester.run(RULE_NAME, rule, {
695761
matcher: '.toBeInTheDocument()',
696762
assertionType: 'presence',
697763
}),
764+
getDisabledValidAssertion({
765+
query: queryName,
766+
matcher: '.toBeOnTheScreen()',
767+
assertionType: 'presence',
768+
}),
698769
getDisabledValidAssertion({
699770
query: queryName,
700771
matcher: '.not.toBeFalsy()',
@@ -730,6 +801,12 @@ ruleTester.run(RULE_NAME, rule, {
730801
shouldUseScreen: true,
731802
assertionType: 'presence',
732803
}),
804+
getDisabledValidAssertion({
805+
query: queryName,
806+
matcher: '.toBeOnTheScreen()',
807+
shouldUseScreen: true,
808+
assertionType: 'presence',
809+
}),
733810
getDisabledValidAssertion({
734811
query: queryName,
735812
matcher: '.not.toBeFalsy()',
@@ -764,6 +841,11 @@ ruleTester.run(RULE_NAME, rule, {
764841
matcher: '.toBeInTheDocument()',
765842
assertionType: 'presence',
766843
}),
844+
getDisabledValidAssertion({
845+
query: queryName,
846+
matcher: '.toBeOnTheScreen()',
847+
assertionType: 'presence',
848+
}),
767849
getDisabledValidAssertion({
768850
query: queryName,
769851
matcher: '.not.toBeFalsy()',
@@ -799,6 +881,12 @@ ruleTester.run(RULE_NAME, rule, {
799881
shouldUseScreen: true,
800882
assertionType: 'presence',
801883
}),
884+
getDisabledValidAssertion({
885+
query: queryName,
886+
matcher: '.toBeOnTheScreen()',
887+
shouldUseScreen: true,
888+
assertionType: 'presence',
889+
}),
802890
getDisabledValidAssertion({
803891
query: queryName,
804892
matcher: '.not.toBeFalsy()',
@@ -867,6 +955,12 @@ ruleTester.run(RULE_NAME, rule, {
867955
messageId: 'wrongAbsenceQuery',
868956
assertionType: 'absence',
869957
}),
958+
...getInvalidAssertions({
959+
query: queryName,
960+
matcher: '.not.toBeOnTheScreen()',
961+
messageId: 'wrongAbsenceQuery',
962+
assertionType: 'absence',
963+
}),
870964
...getInvalidAssertions({
871965
query: queryName,
872966
matcher: '.not.toBeTruthy()',
@@ -907,6 +1001,13 @@ ruleTester.run(RULE_NAME, rule, {
9071001
shouldUseScreen: true,
9081002
assertionType: 'absence',
9091003
}),
1004+
...getInvalidAssertions({
1005+
query: queryName,
1006+
matcher: '.not.toBeOnTheScreen()',
1007+
messageId: 'wrongAbsenceQuery',
1008+
shouldUseScreen: true,
1009+
assertionType: 'absence',
1010+
}),
9101011
...getInvalidAssertions({
9111012
query: queryName,
9121013
matcher: '.not.toBeTruthy()',
@@ -946,6 +1047,12 @@ ruleTester.run(RULE_NAME, rule, {
9461047
messageId: 'wrongAbsenceQuery',
9471048
assertionType: 'absence',
9481049
}),
1050+
...getInvalidAssertions({
1051+
query: queryName,
1052+
matcher: '.not.toBeOnTheScreen()',
1053+
messageId: 'wrongAbsenceQuery',
1054+
assertionType: 'absence',
1055+
}),
9491056
...getInvalidAssertions({
9501057
query: queryName,
9511058
matcher: '.not.toBeTruthy()',
@@ -986,6 +1093,13 @@ ruleTester.run(RULE_NAME, rule, {
9861093
shouldUseScreen: true,
9871094
assertionType: 'absence',
9881095
}),
1096+
...getInvalidAssertions({
1097+
query: queryName,
1098+
matcher: '.not.toBeOnTheScreen()',
1099+
messageId: 'wrongAbsenceQuery',
1100+
shouldUseScreen: true,
1101+
assertionType: 'absence',
1102+
}),
9891103
...getInvalidAssertions({
9901104
query: queryName,
9911105
matcher: '.not.toBeTruthy()',
@@ -1025,6 +1139,12 @@ ruleTester.run(RULE_NAME, rule, {
10251139
messageId: 'wrongPresenceQuery',
10261140
assertionType: 'presence',
10271141
}),
1142+
...getInvalidAssertions({
1143+
query: queryName,
1144+
matcher: '.toBeOnTheScreen()',
1145+
messageId: 'wrongPresenceQuery',
1146+
assertionType: 'presence',
1147+
}),
10281148
...getInvalidAssertions({
10291149
query: queryName,
10301150
matcher: '.not.toBeFalsy()',
@@ -1065,6 +1185,13 @@ ruleTester.run(RULE_NAME, rule, {
10651185
shouldUseScreen: true,
10661186
assertionType: 'presence',
10671187
}),
1188+
...getInvalidAssertions({
1189+
query: queryName,
1190+
matcher: '.toBeOnTheScreen()',
1191+
messageId: 'wrongPresenceQuery',
1192+
shouldUseScreen: true,
1193+
assertionType: 'presence',
1194+
}),
10681195
...getInvalidAssertions({
10691196
query: queryName,
10701197
matcher: '.not.toBeFalsy()',
@@ -1104,6 +1231,12 @@ ruleTester.run(RULE_NAME, rule, {
11041231
messageId: 'wrongPresenceQuery',
11051232
assertionType: 'presence',
11061233
}),
1234+
...getInvalidAssertions({
1235+
query: queryName,
1236+
matcher: '.toBeOnTheScreen()',
1237+
messageId: 'wrongPresenceQuery',
1238+
assertionType: 'presence',
1239+
}),
11071240
...getInvalidAssertions({
11081241
query: queryName,
11091242
matcher: '.not.toBeFalsy()',
@@ -1144,6 +1277,13 @@ ruleTester.run(RULE_NAME, rule, {
11441277
shouldUseScreen: true,
11451278
assertionType: 'presence',
11461279
}),
1280+
...getInvalidAssertions({
1281+
query: queryName,
1282+
matcher: '.toBeOnTheScreen()',
1283+
messageId: 'wrongPresenceQuery',
1284+
shouldUseScreen: true,
1285+
assertionType: 'presence',
1286+
}),
11471287
...getInvalidAssertions({
11481288
query: queryName,
11491289
matcher: '.not.toBeFalsy()',
@@ -1165,21 +1305,43 @@ ruleTester.run(RULE_NAME, rule, {
11651305
code: 'expect(screen.getAllByText("button")[1]).not.toBeInTheDocument()',
11661306
errors: [{ messageId: 'wrongAbsenceQuery', line: 1, column: 15 }],
11671307
},
1308+
{
1309+
code: 'expect(screen.getAllByText("button")[1]).not.toBeOnTheScreen()',
1310+
errors: [{ messageId: 'wrongAbsenceQuery', line: 1, column: 15 }],
1311+
},
11681312
{
11691313
code: 'expect(screen.queryAllByText("button")[1]).toBeInTheDocument()',
11701314
errors: [{ messageId: 'wrongPresenceQuery', line: 1, column: 15 }],
11711315
},
1316+
{
1317+
code: 'expect(screen.queryAllByText("button")[1]).toBeOnTheScreen()',
1318+
errors: [{ messageId: 'wrongPresenceQuery', line: 1, column: 15 }],
1319+
},
11721320
{
11731321
code: `
11741322
// case: asserting presence incorrectly with custom queryBy* query
11751323
expect(queryByCustomQuery("button")).toBeInTheDocument()
1324+
`,
1325+
errors: [{ messageId: 'wrongPresenceQuery', line: 3, column: 16 }],
1326+
},
1327+
{
1328+
code: `
1329+
// case: asserting presence incorrectly with custom queryBy* query
1330+
expect(queryByCustomQuery("button")).toBeOnTheScreen()
11761331
`,
11771332
errors: [{ messageId: 'wrongPresenceQuery', line: 3, column: 16 }],
11781333
},
11791334
{
11801335
code: `
11811336
// case: asserting absence incorrectly with custom getBy* query
11821337
expect(getByCustomQuery("button")).not.toBeInTheDocument()
1338+
`,
1339+
errors: [{ messageId: 'wrongAbsenceQuery', line: 3, column: 16 }],
1340+
},
1341+
{
1342+
code: `
1343+
// case: asserting absence incorrectly with custom getBy* query
1344+
expect(getByCustomQuery("button")).not.toBeOnTheScreen()
11831345
`,
11841346
errors: [{ messageId: 'wrongAbsenceQuery', line: 3, column: 16 }],
11851347
},
@@ -1191,6 +1353,17 @@ ruleTester.run(RULE_NAME, rule, {
11911353
// case: asserting presence incorrectly importing custom module
11921354
import 'test-utils'
11931355
expect(queryByRole("button")).toBeInTheDocument()
1356+
`,
1357+
errors: [{ line: 4, column: 14, messageId: 'wrongPresenceQuery' }],
1358+
},
1359+
{
1360+
settings: {
1361+
'testing-library/utils-module': 'test-utils',
1362+
},
1363+
code: `
1364+
// case: asserting presence incorrectly importing custom module
1365+
import 'test-utils'
1366+
expect(queryByRole("button")).toBeOnTheScreen()
11941367
`,
11951368
errors: [{ line: 4, column: 14, messageId: 'wrongPresenceQuery' }],
11961369
},
@@ -1202,6 +1375,17 @@ ruleTester.run(RULE_NAME, rule, {
12021375
// case: asserting absence incorrectly importing custom module
12031376
import 'test-utils'
12041377
expect(getByRole("button")).not.toBeInTheDocument()
1378+
`,
1379+
errors: [{ line: 4, column: 14, messageId: 'wrongAbsenceQuery' }],
1380+
},
1381+
{
1382+
settings: {
1383+
'testing-library/utils-module': 'test-utils',
1384+
},
1385+
code: `
1386+
// case: asserting absence incorrectly importing custom module
1387+
import 'test-utils'
1388+
expect(getByRole("button")).not.toBeOnTheScreen()
12051389
`,
12061390
errors: [{ line: 4, column: 14, messageId: 'wrongAbsenceQuery' }],
12071391
},
@@ -1247,5 +1431,47 @@ ruleTester.run(RULE_NAME, rule, {
12471431
{ line: 3, column: 48, messageId: 'wrongPresenceQuery' },
12481432
],
12491433
},
1434+
{
1435+
code: `
1436+
// case: asserting within check does still work with improper outer clause
1437+
expect(within(screen.getByRole("button")).getByText("Hello")).not.toBeOnTheScreen()`,
1438+
errors: [{ line: 3, column: 46, messageId: 'wrongAbsenceQuery' }],
1439+
},
1440+
{
1441+
code: `
1442+
// case: asserting within check does still work with improper outer clause
1443+
expect(within(screen.getByRole("button")).queryByText("Hello")).toBeOnTheScreen()`,
1444+
errors: [{ line: 3, column: 46, messageId: 'wrongPresenceQuery' }],
1445+
},
1446+
{
1447+
code: `
1448+
// case: asserting within check does still work with improper outer clause and improper inner clause
1449+
expect(within(screen.queryByRole("button")).getByText("Hello")).not.toBeOnTheScreen()`,
1450+
errors: [
1451+
{ line: 3, column: 25, messageId: 'wrongPresenceQuery' },
1452+
{ line: 3, column: 48, messageId: 'wrongAbsenceQuery' },
1453+
],
1454+
},
1455+
{
1456+
code: `
1457+
// case: asserting within check does still work with proper outer clause and improper inner clause
1458+
expect(within(screen.queryByRole("button")).queryByText("Hello")).not.toBeOnTheScreen()`,
1459+
errors: [{ line: 3, column: 25, messageId: 'wrongPresenceQuery' }],
1460+
},
1461+
{
1462+
code: `
1463+
// case: asserting within check does still work with proper outer clause and improper inner clause
1464+
expect(within(screen.queryByRole("button")).getByText("Hello")).toBeOnTheScreen()`,
1465+
errors: [{ line: 3, column: 25, messageId: 'wrongPresenceQuery' }],
1466+
},
1467+
{
1468+
code: `
1469+
// case: asserting within check does still work with improper outer clause and improper inner clause
1470+
expect(within(screen.queryByRole("button")).queryByText("Hello")).toBeOnTheScreen()`,
1471+
errors: [
1472+
{ line: 3, column: 25, messageId: 'wrongPresenceQuery' },
1473+
{ line: 3, column: 48, messageId: 'wrongPresenceQuery' },
1474+
],
1475+
},
12501476
],
12511477
});

0 commit comments

Comments
 (0)
Please sign in to comment.