Skip to content

Commit f3d3db7

Browse files
committed
test: automatically test if outputs are valid inputs
1 parent fd3ea6d commit f3d3db7

File tree

4 files changed

+26
-39
lines changed

4 files changed

+26
-39
lines changed

tests/rules/rule-tester.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,33 @@
1-
import { RuleTester } from "@typescript-eslint/rule-tester";
1+
import { RuleTester, RunTests } from "@typescript-eslint/rule-tester";
2+
import { RuleModule } from "@typescript-eslint/utils/ts-eslint";
23
import * as vitest from "vitest";
34

45
RuleTester.afterAll = vitest.afterAll;
56
RuleTester.it = vitest.it;
67
RuleTester.itOnly = vitest.it.only;
78
RuleTester.describe = vitest.describe;
89

9-
export const ruleTester = new RuleTester();
10+
/**
11+
* RuleTester extended to check if the output of invalid cases are valid inputs
12+
*/
13+
class InternalRuleTester extends RuleTester {
14+
override run<MessageIds extends string, Options extends readonly unknown[]>(
15+
ruleName: string,
16+
rule: RuleModule<MessageIds, Options>,
17+
test: RunTests<MessageIds, Options>,
18+
): void {
19+
super.run(ruleName, rule, {
20+
...test,
21+
valid: [
22+
...test.valid,
23+
...new Set(
24+
test.invalid
25+
.flatMap((test) => test.output)
26+
.filter((output) => output != undefined),
27+
),
28+
],
29+
});
30+
}
31+
}
32+
33+
export const ruleTester = new InternalRuleTester();

tests/rules/typed-input.test.ts

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,6 @@ ruleTester.run("typed-input", typedInputRule, {
1414
'db.prepare("SELECT * FROM 42")',
1515
// Identifier is allowed as a name
1616
'db.prepare<{id: unknown}>("SELECT * FROM users WHERE id = $id")',
17-
// Test that no errors are reported for the outputs from the invalid cases
18-
'db.prepare<[]>("SELECT * FROM users")',
19-
'db.prepare<[unknown]>("SELECT * FROM users WHERE id = ?")',
20-
'db.prepare<[unknown, unknown]>("SELECT * FROM users WHERE id = ? and name = ?")',
21-
'db.prepare<{"id": unknown}>("SELECT * FROM users WHERE id = $id")',
22-
'db.prepare<{"id": unknown, "name": unknown}>("SELECT * FROM users WHERE id = $id and name = @name")',
23-
'db.prepare<[unknown, {"id": unknown}]>("SELECT * FROM users WHERE id = $id and name = ?")',
24-
'db.prepare<{"id": unknown, "name": unknown}>("SELECT * FROM users WHERE id = :id and name = :name")',
25-
'db.prepare<[unknown, {"id": unknown, "name": unknown}]>("SELECT * FROM users WHERE id = :id or id = ? and name = :name")',
26-
'db.prepare<[unknown, {"id": unknown}]>("SELECT * FROM users WHERE id = :id or id = ?")',
27-
'db.prepare<{"userID": unknown}>("SELECT * FROM users WHERE id = :userID")',
28-
'db.prepare<[unknown, {"userID": unknown}]>("SELECT * FROM users WHERE id = :userID or name = ?")',
29-
'db.prepare<[unknown, {"userID": string}]>("SELECT * FROM users WHERE id = :userID or name = ?")',
30-
'db.prepare<{"userID": string}>("SELECT * FROM users WHERE id = :userID")',
31-
'db.prepare<[unknown]>(`SELECT * FROM users WHERE id IN (${foo.map(() => "?").join(",")})`)',
32-
'this.prepare<[unknown]>("SELECT * FROM users WHERE id = ?")',
33-
'super.prepare<[unknown]>("SELECT * FROM users WHERE id = ?")',
3417
],
3518
invalid: [
3619
// No parameters

tests/rules/typed-result.test.ts

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,10 @@ ruleTester.run("typed-result", rule, {
3131
"db.prepare(undefined)",
3232
"db.prepare(1n)",
3333
"db.prepare(foo)",
34-
// Valid query
35-
`db.prepare<[], {"id": number, "name": string}>("SELECT * FROM users")`,
3634
// Order of columns doesn't matter
3735
`db.prepare<[], {"name": string, "id": number}>("SELECT * FROM users")`,
3836
// Identifier as column names
3937
`db.prepare<[], {name: string, id: number}>("SELECT * FROM users")`,
40-
// Column with unknown type
41-
`db.prepare<[], {"random()": unknown}>("SELECT random();")`,
42-
// Column with Buffer type
43-
`db.prepare<[], {"data": Buffer}>("SELECT data FROM blobData")`,
4438
// Should ignore invalid queries
4539
`db.prepare("SELECT * FROM 42")`,
4640
// Should pass the correct name to getDatabase
@@ -51,18 +45,6 @@ ruleTester.run("typed-result", rule, {
5145
"db.prepare<[]>('DELETE FROM foo')",
5246
// Should allow the user to set another type for unknown
5347
`db.prepare<[], {"random()": (number | null)}>("SELECT random();")`,
54-
// Test that no errors are reported for the outputs from the invalid cases
55-
`db.prepare<[], {"id": number}>("SELECT id FROM users")`,
56-
'db.prepare<[], {"id": number}>(`SELECT id FROM users`)',
57-
`const query = 'SELECT id FROM users';db.prepare<[], {"id": number}>(query);`,
58-
`db.prepare<[], {"id": number | null}>("SELECT * FROM foo")`,
59-
`db.prepare<[], {"id": number | string | Buffer}>("SELECT id FROM test")`,
60-
`db.prepare<[], {"name": number | string | Buffer | null}>("SELECT name FROM test")`,
61-
`db.prepare<[]>("DELETE FROM foo")`,
62-
`db.prepare<[], {"random()": (foo | number), "id": number}>("SELECT random(), id FROM users")`,
63-
'db.prepare<[], {"name": string}>(`SELECT name FROM users WHERE id IN (${foo.map(() => "?").join(",")})`)',
64-
'this.prepare<[], {"name": string}>(`SELECT name FROM users`)',
65-
'super.prepare<[], {"name": string}>(`SELECT name FROM users`)',
6648
],
6749
invalid: [
6850
// Query as string Literal

tests/rules/valid-query.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ ruleTester.run("valid-query", rule, {
3232
"db_users.prepare(`SELECT * FROM users WHERE ${ids.map(() => 'NAME LIKE ? || \\'%\\'').join(' OR ')}`);",
3333
"const query = `SELECT * FROM users WHERE ${ids.map(() => 'NAME LIKE ? || \\'%\\'').join(' OR ')}`;db_users.prepare(query);",
3434
"db_users.prepare(`SELECT * FROM users WHERE id IN (${ids.map(() => '?').join()})`);",
35-
'this.prepare("SELECT * FROM foo")',
36-
'super.prepare("SELECT * FROM foo")',
3735
],
3836
invalid: [
3937
{

0 commit comments

Comments
 (0)