Skip to content

Commit 621b8da

Browse files
committed
chore: rewrite implementation to return early when linting over unwanted LoCs
Signed-off-by: hainenber <[email protected]>
1 parent 9ce0a40 commit 621b8da

File tree

2 files changed

+65
-37
lines changed

2 files changed

+65
-37
lines changed

src/rules/__tests__/valid-mocked-module-path.test.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import dedent from 'dedent';
12
import rule from '../valid-mocked-module-path';
23
import { FlatCompatRuleTester as RuleTester, espreeParser } from './test-utils';
34

@@ -11,13 +12,26 @@ const ruleTester = new RuleTester({
1112
ruleTester.run('valid-mocked-module-path', rule, {
1213
valid: [
1314
{ filename: __filename, code: 'jest.mock("./fixtures/module")' },
15+
{ filename: __filename, code: 'jest.mock("./fixtures/module", () => {})' },
16+
{ filename: __filename, code: 'jest.mock()' },
17+
{
18+
filename: __filename,
19+
code: 'jest.doMock("./fixtures/module", () => {})',
20+
},
21+
{
22+
filename: __filename,
23+
code: dedent`
24+
describe("foo", () => {});
25+
`,
26+
},
1427
{ filename: __filename, code: 'jest.doMock("./fixtures/module")' },
1528
{ filename: __filename, code: 'jest.mock("./fixtures/module/foo.ts")' },
1629
{ filename: __filename, code: 'jest.doMock("./fixtures/module/foo.ts")' },
1730
{ filename: __filename, code: 'jest.mock("./fixtures/module/foo.js")' },
1831
{ filename: __filename, code: 'jest.doMock("./fixtures/module/foo.js")' },
19-
'jest.mock("dedent")',
20-
'jest.doMock("dedent")',
32+
'jest.mock("eslint")',
33+
'jest.doMock("eslint")',
34+
'jest.mock("child_process")',
2135
],
2236
invalid: [
2337
{

src/rules/valid-mocked-module-path.ts

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -34,50 +34,64 @@ export default createRule({
3434
const { property } = callee;
3535

3636
if (
37-
node.arguments.length >= 1 &&
38-
isTypeOfJestFnCall(node, context, ['jest']) &&
39-
isSupportedAccessor(property) &&
40-
['mock', 'doMock'].includes(getAccessorValue(property))
37+
!node.arguments.length ||
38+
!isTypeOfJestFnCall(node, context, ['jest']) ||
39+
!(
40+
isSupportedAccessor(property) &&
41+
['mock', 'doMock'].includes(getAccessorValue(property))
42+
)
4143
) {
42-
const [nameNode] = node.arguments;
43-
const moduleName = findModuleName(nameNode);
44+
return;
45+
}
4446

45-
try {
46-
if (moduleName) {
47-
if (moduleName.value.startsWith('.')) {
48-
const resolvedModulePath = path.resolve(
49-
path.dirname(context.filename),
50-
moduleName.value,
51-
);
47+
const [nameNode] = node.arguments;
48+
const moduleName = findModuleName(nameNode);
49+
50+
/* istanbul ignore if */
51+
if (!moduleName) {
52+
throw new Error(
53+
'Cannot parse mocked module name from `jest.mock` - - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`',
54+
);
55+
}
5256

53-
const hasPossiblyModulePaths = ['', '.js', '.ts']
54-
.map(ext => `${resolvedModulePath}${ext}`)
55-
.some(modPath => {
56-
try {
57-
statSync(modPath);
57+
try {
58+
if (moduleName.value.startsWith('.')) {
59+
const resolvedModulePath = path.resolve(
60+
path.dirname(context.filename),
61+
moduleName.value,
62+
);
5863

59-
return true;
60-
} catch {
61-
return false;
62-
}
63-
});
64+
const hasPossiblyModulePaths = ['', '.js', '.ts']
65+
.map(ext => `${resolvedModulePath}${ext}`)
66+
.some(modPath => {
67+
try {
68+
statSync(modPath);
6469

65-
if (!hasPossiblyModulePaths) {
66-
throw { code: 'MODULE_NOT_FOUND' };
70+
return true;
71+
} catch {
72+
return false;
6773
}
68-
} else {
69-
require.resolve(moduleName.value);
70-
}
71-
}
72-
} catch (err: any) {
73-
if (err?.code === 'MODULE_NOT_FOUND' || err?.code === 'ENOENT') {
74-
context.report({
75-
messageId: 'invalidMockModulePath',
76-
data: { moduleName: moduleName?.raw ?? './module-name' },
77-
node,
7874
});
75+
76+
if (!hasPossiblyModulePaths) {
77+
throw { code: 'MODULE_NOT_FOUND' };
7978
}
79+
} else {
80+
require.resolve(moduleName.value);
8081
}
82+
} catch (err: any) {
83+
// Skip over any unexpected issues when attempt to verify mocked module path.
84+
// The list of possible errors is non-exhaustive.
85+
/* istanbul ignore if */
86+
if (!['MODULE_NOT_FOUND', 'ENOENT'].includes(err.code)) {
87+
return;
88+
}
89+
90+
context.report({
91+
messageId: 'invalidMockModulePath',
92+
data: { moduleName: moduleName.raw },
93+
node,
94+
});
8195
}
8296
},
8397
};

0 commit comments

Comments
 (0)