Skip to content

Commit ef2274a

Browse files
authored
feat(prefer-import-in-mock): support doMock (#875)
1 parent e3aab3c commit ef2274a

File tree

3 files changed

+87
-4
lines changed

3 files changed

+87
-4
lines changed

docs/rules/prefer-import-in-mock.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,22 @@
88

99
<!-- end auto-generated rule header -->
1010

11-
This rule enforces using a dynamic import() in vi.mock(), which improves type information and IntelliSense for the mocked module.
11+
This rule enforces using a dynamic `import()` in `vi.mock()` and `vi.doMock()`, which improves type information and IntelliSense for the mocked module.
1212

1313
### Rule details
1414

15-
The following pattern is considered a warning:
15+
The following patterns are considered a warning:
1616

1717
```js
1818
vi.mock('./path/to/module')
19+
vi.doMock('./path/to/module')
1920
```
2021

21-
The following pattern is not considered a warning:
22+
The following patterns are not considered a warning:
2223

2324
```js
2425
vi.mock(import('./path/to/module'))
26+
vi.doMock(import('./path/to/module'))
2527
```
2628

2729
### Options

src/rules/prefer-import-in-mock.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { parseVitestFnCall } from '../utils/parse-vitest-fn-call'
44

55
const RULE_NAME = 'prefer-import-in-mock'
66

7+
const MOCK_METHODS = new Set(['mock', 'doMock'])
8+
79
type MESSAGE_ID = 'preferImport'
810
type Options = [
911
Partial<{
@@ -54,7 +56,7 @@ export default createEslintRule<Options, MESSAGE_ID>({
5456

5557
if (
5658
property.type != AST_NODE_TYPES.Identifier ||
57-
property.name != 'mock'
59+
!MOCK_METHODS.has(property.name)
5860
) {
5961
return
6062
}

tests/prefer-import-in-mock.test.ts

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ describe(rule.name, () => {
88
'vi.mock(import("node:fs/promises"))',
99
'vi.mock(import("./foo.js"), () => ({ Foo: vi.fn() }))',
1010
'vi.mock(import("./foo.js"), { spy: true });',
11+
'vi.doMock(import("foo"))',
12+
'vi.doMock(import("node:fs/promises"))',
13+
'vi.doMock(import("./foo.js"), () => ({ Foo: vi.fn() }))',
1114
],
1215
invalid: [
1316
{
@@ -53,6 +56,49 @@ describe(rule.name, () => {
5356
`,
5457
errors: [{ messageId: 'preferImport', column: 9, line: 3 }],
5558
},
59+
{
60+
options: [
61+
{
62+
fixable: false,
63+
},
64+
],
65+
code: `vi.doMock('foo', () => {})`,
66+
errors: [
67+
{
68+
messageId: 'preferImport',
69+
},
70+
],
71+
},
72+
{
73+
options: [
74+
{
75+
fixable: false,
76+
},
77+
],
78+
code: 'vi.doMock("node:fs/promises")',
79+
errors: [{ messageId: 'preferImport', column: 1, line: 1 }],
80+
},
81+
{
82+
options: [
83+
{
84+
fixable: false,
85+
},
86+
],
87+
code: 'vi.doMock("./foo.js", () => ({ Foo: vi.fn() }))',
88+
errors: [{ messageId: 'preferImport', column: 1, line: 1 }],
89+
},
90+
{
91+
options: [
92+
{
93+
fixable: false,
94+
},
95+
],
96+
code: `
97+
import { vi as renamedVi } from 'vitest';
98+
renamedVi.doMock('./foo.js', () => ({ Foo: vi.fn() }))
99+
`,
100+
errors: [{ messageId: 'preferImport', column: 9, line: 3 }],
101+
},
56102
],
57103
})
58104

@@ -62,6 +108,9 @@ describe(rule.name, () => {
62108
'vi.mock(import("node:fs/promises"))',
63109
'vi.mock(import("./foo.js"), () => ({ Foo: vi.fn() }))',
64110
'vi.mock(import("./foo.js"), { spy: true });',
111+
'vi.doMock(import("foo"))',
112+
'vi.doMock(import("node:fs/promises"))',
113+
'vi.doMock(import("./foo.js"), () => ({ Foo: vi.fn() }))',
65114
],
66115
invalid: [
67116
{
@@ -94,6 +143,36 @@ describe(rule.name, () => {
94143
renamedVi.mock(import('./foo.js'), () => ({ Foo: vi.fn() }))
95144
`,
96145
},
146+
{
147+
code: `vi.doMock('foo', () => {})`,
148+
errors: [
149+
{
150+
messageId: 'preferImport',
151+
},
152+
],
153+
output: `vi.doMock(import('foo'), () => {})`,
154+
},
155+
{
156+
code: 'vi.doMock("node:fs/promises")',
157+
errors: [{ messageId: 'preferImport', column: 1, line: 1 }],
158+
output: "vi.doMock(import('node:fs/promises'))",
159+
},
160+
{
161+
code: 'vi.doMock("./foo.js", () => ({ Foo: vi.fn() }))',
162+
errors: [{ messageId: 'preferImport', column: 1, line: 1 }],
163+
output: "vi.doMock(import('./foo.js'), () => ({ Foo: vi.fn() }))",
164+
},
165+
{
166+
code: `
167+
import { vi as renamedVi } from 'vitest';
168+
renamedVi.doMock('./foo.js', () => ({ Foo: vi.fn() }))
169+
`,
170+
errors: [{ messageId: 'preferImport', column: 9, line: 3 }],
171+
output: `
172+
import { vi as renamedVi } from 'vitest';
173+
renamedVi.doMock(import('./foo.js'), () => ({ Foo: vi.fn() }))
174+
`,
175+
},
97176
],
98177
})
99178
})

0 commit comments

Comments
 (0)