Skip to content

Commit b5e58e6

Browse files
committed
chore(no-deprecated-functions): cache jest version
1 parent 91ba077 commit b5e58e6

File tree

2 files changed

+157
-113
lines changed

2 files changed

+157
-113
lines changed

Diff for: src/rules/__tests__/no-deprecated-functions.test.ts

+147-112
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import * as os from 'os';
33
import * as path from 'path';
44
import { JSONSchemaForNPMPackageJsonFiles } from '@schemastore/package';
55
import { TSESLint } from '@typescript-eslint/experimental-utils';
6-
import rule, { JestVersion } from '../no-deprecated-functions';
6+
import rule, {
7+
JestVersion,
8+
_clearCachedJestVersion,
9+
} from '../no-deprecated-functions';
710

811
const ruleTester = new TSESLint.RuleTester();
912

@@ -89,142 +92,174 @@ const generateInvalidCases = (
8992
];
9093
};
9194

92-
// a few sanity checks before doing our massive loop
93-
ruleTester.run('no-deprecated-functions', rule, {
94-
valid: [
95-
'jest',
96-
'require("fs")',
97-
...generateValidCases(14, 'jest.resetModuleRegistry'),
98-
...generateValidCases(17, 'require.requireActual'),
99-
...generateValidCases(25, 'jest.genMockFromModule'),
100-
],
101-
invalid: [
102-
...generateInvalidCases(
103-
21,
104-
'jest.resetModuleRegistry',
105-
'jest.resetModules',
106-
),
107-
...generateInvalidCases(24, 'jest.addMatchers', 'expect.extend'),
108-
...generateInvalidCases(
109-
26,
110-
'jest.genMockFromModule',
111-
'jest.createMockFromModule',
112-
),
113-
],
114-
});
95+
describe('the jest version cache', () => {
96+
beforeEach(async () => process.chdir(await setupFakeProjectDirectory(17)));
11597

116-
describe.each<JestVersion>([
117-
14,
118-
15,
119-
16,
120-
17,
121-
18,
122-
19,
123-
20,
124-
21,
125-
22,
126-
23,
127-
24,
128-
25,
129-
26,
130-
27,
131-
])('when using jest version %i', jestVersion => {
132-
beforeEach(async () =>
133-
process.chdir(await setupFakeProjectDirectory(jestVersion)),
134-
);
98+
// change the jest version *after* each test case
99+
afterEach(async () => {
100+
const jestPackageJson: JSONSchemaForNPMPackageJsonFiles = {
101+
name: 'jest',
102+
version: '24.0.0',
103+
};
104+
105+
const tempDir = process.cwd();
135106

136-
const allowedFunctions: string[] = [];
137-
const deprecations = ([
138-
[15, 'jest.resetModuleRegistry', 'jest.resetModules'],
139-
[17, 'jest.addMatchers', 'expect.extend'],
140-
[21, 'require.requireMock', 'jest.requireMock'],
141-
[21, 'require.requireActual', 'jest.requireActual'],
142-
[22, 'jest.runTimersToTime', 'jest.advanceTimersByTime'],
143-
[26, 'jest.genMockFromModule', 'jest.createMockFromModule'],
144-
] as const).filter(deprecation => {
145-
if (deprecation[0] > jestVersion) {
146-
allowedFunctions.push(deprecation[1]);
147-
148-
return false;
149-
}
150-
151-
return true;
107+
await fs.writeFileSync(
108+
path.join(tempDir, 'node_modules', 'jest', 'package.json'),
109+
JSON.stringify(jestPackageJson),
110+
);
152111
});
153112

154-
ruleTester.run('explict jest version', rule, {
113+
ruleTester.run('no-deprecated-functions', rule, {
155114
valid: [
156-
'jest',
157-
'require("fs")',
158-
...allowedFunctions
159-
.map(func => generateValidCases(jestVersion, func))
160-
.reduce((acc, arr) => acc.concat(arr), []),
115+
'require("fs")', // this will cause jest version to be read & cached
116+
'jest.requireActual()', // deprecated after jest 17
161117
],
162-
invalid: deprecations
163-
.map(([, deprecation, replacement]) =>
164-
generateInvalidCases(jestVersion, deprecation, replacement),
165-
)
166-
.reduce((acc, arr) => acc.concat(arr), []),
118+
invalid: [],
167119
});
120+
});
121+
122+
// contains the cache-clearing beforeEach so we can test the cache too
123+
describe('the rule', () => {
124+
beforeEach(() => _clearCachedJestVersion());
168125

169-
ruleTester.run('detected jest version', rule, {
126+
// a few sanity checks before doing our massive loop
127+
ruleTester.run('no-deprecated-functions', rule, {
170128
valid: [
171129
'jest',
172130
'require("fs")',
173-
...allowedFunctions
174-
.map(func => generateValidCases(undefined, func))
175-
.reduce((acc, arr) => acc.concat(arr), []),
131+
...generateValidCases(14, 'jest.resetModuleRegistry'),
132+
...generateValidCases(17, 'require.requireActual'),
133+
...generateValidCases(25, 'jest.genMockFromModule'),
134+
],
135+
invalid: [
136+
...generateInvalidCases(
137+
21,
138+
'jest.resetModuleRegistry',
139+
'jest.resetModules',
140+
),
141+
...generateInvalidCases(24, 'jest.addMatchers', 'expect.extend'),
142+
...generateInvalidCases(
143+
26,
144+
'jest.genMockFromModule',
145+
'jest.createMockFromModule',
146+
),
176147
],
177-
invalid: deprecations
178-
.map(([, deprecation, replacement]) =>
179-
generateInvalidCases(undefined, deprecation, replacement),
180-
)
181-
.reduce((acc, arr) => acc.concat(arr), []),
182148
});
183-
});
184149

185-
describe('when no jest version is provided', () => {
186-
describe('when the jest package.json is missing the version property', () => {
187-
beforeEach(async () => {
188-
const tempDir = await setupFakeProjectDirectory(1);
150+
describe.each<JestVersion>([
151+
14,
152+
15,
153+
16,
154+
17,
155+
18,
156+
19,
157+
20,
158+
21,
159+
22,
160+
23,
161+
24,
162+
25,
163+
26,
164+
27,
165+
])('when using jest version %i', jestVersion => {
166+
beforeEach(async () =>
167+
process.chdir(await setupFakeProjectDirectory(jestVersion)),
168+
);
189169

190-
await fs.writeFileSync(
191-
path.join(tempDir, 'node_modules', 'jest', 'package.json'),
192-
JSON.stringify({}),
193-
);
170+
const allowedFunctions: string[] = [];
171+
const deprecations = ([
172+
[15, 'jest.resetModuleRegistry', 'jest.resetModules'],
173+
[17, 'jest.addMatchers', 'expect.extend'],
174+
[21, 'require.requireMock', 'jest.requireMock'],
175+
[21, 'require.requireActual', 'jest.requireActual'],
176+
[22, 'jest.runTimersToTime', 'jest.advanceTimersByTime'],
177+
[26, 'jest.genMockFromModule', 'jest.createMockFromModule'],
178+
] as const).filter(deprecation => {
179+
if (deprecation[0] > jestVersion) {
180+
allowedFunctions.push(deprecation[1]);
194181

195-
process.chdir(tempDir);
196-
});
182+
return false;
183+
}
197184

198-
it('requires the version to be set explicitly', () => {
199-
expect(() => {
200-
const linter = new TSESLint.Linter();
185+
return true;
186+
});
201187

202-
linter.defineRule('no-deprecated-functions', rule);
188+
ruleTester.run('explict jest version', rule, {
189+
valid: [
190+
'jest',
191+
'require("fs")',
192+
...allowedFunctions
193+
.map(func => generateValidCases(jestVersion, func))
194+
.reduce((acc, arr) => acc.concat(arr), []),
195+
],
196+
invalid: deprecations
197+
.map(([, deprecation, replacement]) =>
198+
generateInvalidCases(jestVersion, deprecation, replacement),
199+
)
200+
.reduce((acc, arr) => acc.concat(arr), []),
201+
});
203202

204-
linter.verify('jest.resetModuleRegistry()', {
205-
rules: { 'no-deprecated-functions': 'error' },
206-
});
207-
}).toThrow(
208-
'Unable to detect Jest version - please ensure jest package is installed, or otherwise set version explicitly',
209-
);
203+
ruleTester.run('detected jest version', rule, {
204+
valid: [
205+
'jest',
206+
'require("fs")',
207+
...allowedFunctions
208+
.map(func => generateValidCases(undefined, func))
209+
.reduce((acc, arr) => acc.concat(arr), []),
210+
],
211+
invalid: deprecations
212+
.map(([, deprecation, replacement]) =>
213+
generateInvalidCases(undefined, deprecation, replacement),
214+
)
215+
.reduce((acc, arr) => acc.concat(arr), []),
210216
});
211217
});
212218

213-
describe('when the jest package.json is not found', () => {
214-
beforeEach(async () => process.chdir(await makeTempDir()));
219+
describe('when no jest version is provided', () => {
220+
describe('when the jest package.json is missing the version property', () => {
221+
beforeEach(async () => {
222+
const tempDir = await setupFakeProjectDirectory(1);
223+
224+
await fs.writeFileSync(
225+
path.join(tempDir, 'node_modules', 'jest', 'package.json'),
226+
JSON.stringify({}),
227+
);
228+
229+
process.chdir(tempDir);
230+
});
231+
232+
it('requires the version to be set explicitly', () => {
233+
expect(() => {
234+
const linter = new TSESLint.Linter();
235+
236+
linter.defineRule('no-deprecated-functions', rule);
237+
238+
linter.verify('jest.resetModuleRegistry()', {
239+
rules: { 'no-deprecated-functions': 'error' },
240+
});
241+
}).toThrow(
242+
'Unable to detect Jest version - please ensure jest package is installed, or otherwise set version explicitly',
243+
);
244+
});
245+
});
246+
247+
describe('when the jest package.json is not found', () => {
248+
beforeEach(async () => process.chdir(await makeTempDir()));
215249

216-
it('requires the version to be set explicitly', () => {
217-
expect(() => {
218-
const linter = new TSESLint.Linter();
250+
it('requires the version to be set explicitly', () => {
251+
expect(() => {
252+
const linter = new TSESLint.Linter();
219253

220-
linter.defineRule('no-deprecated-functions', rule);
254+
linter.defineRule('no-deprecated-functions', rule);
221255

222-
linter.verify('jest.resetModuleRegistry()', {
223-
rules: { 'no-deprecated-functions': 'error' },
224-
});
225-
}).toThrow(
226-
'Unable to detect Jest version - please ensure jest package is installed, or otherwise set version explicitly',
227-
);
256+
linter.verify('jest.resetModuleRegistry()', {
257+
rules: { 'no-deprecated-functions': 'error' },
258+
});
259+
}).toThrow(
260+
'Unable to detect Jest version - please ensure jest package is installed, or otherwise set version explicitly',
261+
);
262+
});
228263
});
229264
});
230265
});

Diff for: src/rules/no-deprecated-functions.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,16 @@ interface EslintPluginJestSettings {
3030
version: JestVersion;
3131
}
3232

33+
let cachedJestVersion: JestVersion | null = null;
34+
35+
/** @internal */
36+
export const _clearCachedJestVersion = () => (cachedJestVersion = null);
37+
3338
const detectJestVersion = (): JestVersion => {
39+
if (cachedJestVersion) {
40+
return cachedJestVersion;
41+
}
42+
3443
try {
3544
const jestPath = require.resolve('jest/package.json', {
3645
paths: [process.cwd()],
@@ -42,7 +51,7 @@ const detectJestVersion = (): JestVersion => {
4251
if (jestPackageJson.version) {
4352
const [majorVersion] = jestPackageJson.version.split('.');
4453

45-
return parseInt(majorVersion);
54+
return (cachedJestVersion = parseInt(majorVersion, 10));
4655
}
4756
} catch {}
4857

0 commit comments

Comments
 (0)