Skip to content

Commit 0c9cdd1

Browse files
rriskinicojs
andauthored
fix(jest-runner): allow prerelease jest versions (#5015) (#5016)
Support jests prerelease versions, like "30.0.0-alpha.6". --------- Co-authored-by: Nico Jansen <[email protected]>
1 parent 5d792d8 commit 0c9cdd1

File tree

4 files changed

+51
-14
lines changed

4 files changed

+51
-14
lines changed

packages/jest-runner/src/jest-plugins/with-coverage-analysis.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const jestEnvironmentGenericFileName = fileURLToPath(new URL('./jest-environment
1818
*/
1919
function getJestDefaults(jestWrapper: JestWrapper) {
2020
// New defaults since 27: https://jestjs.io/blog/2021/05/25/jest-27
21-
if (semver.satisfies(jestWrapper.getVersion(), '>=27')) {
21+
if (semver.satisfies(semver.coerce(jestWrapper.getVersion())!, '>=27')) {
2222
return {
2323
testRunner: 'jest-circus/runner',
2424
testEnvironment: 'node',
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,52 @@
11
import { Logger } from '@stryker-mutator/api/logging';
22
import { StrykerOptions } from '@stryker-mutator/api/core';
33
import { commonTokens, Injector, tokens } from '@stryker-mutator/api/plugin';
4-
import semver from 'semver';
4+
import semver, { SemVer } from 'semver';
55

66
import { JestPluginContext, pluginTokens } from '../plugin-di.js';
77
import { JestWrapper } from '../utils/jest-wrapper.js';
88

99
import { JestLessThan25TestAdapter } from './jest-less-than-25-adapter.js';
1010
import { JestGreaterThan25TestAdapter } from './jest-greater-than-25-adapter.js';
11+
interface CoercedVersion {
12+
version: SemVer;
13+
raw: string;
14+
}
15+
16+
function coerceVersion(version: string): CoercedVersion {
17+
return { version: semver.coerce(version)!, raw: version };
18+
}
1119

1220
export function jestTestAdapterFactory(
1321
log: Logger,
1422
jestWrapper: JestWrapper,
1523
options: StrykerOptions,
1624
injector: Injector<JestPluginContext>,
1725
): JestGreaterThan25TestAdapter | JestLessThan25TestAdapter {
18-
const version = jestWrapper.getVersion();
19-
log.debug('Detected Jest version %s', version);
20-
guardJestVersion(version, options, log);
26+
const coercedVersion = coerceVersion(jestWrapper.getVersion());
27+
log.debug('Detected Jest version %s', coercedVersion.raw);
28+
guardJestVersion(coercedVersion, options, log);
2129

22-
if (semver.satisfies(version, '<25.0.0')) {
30+
if (semver.satisfies(coercedVersion.version, '<25.0.0')) {
2331
return injector.injectClass(JestLessThan25TestAdapter);
2432
} else {
2533
return injector.injectClass(JestGreaterThan25TestAdapter);
2634
}
2735
}
2836
jestTestAdapterFactory.inject = tokens(commonTokens.logger, pluginTokens.jestWrapper, commonTokens.options, commonTokens.injector);
2937

30-
function guardJestVersion(jest: string, options: StrykerOptions, log: Logger) {
31-
if (semver.satisfies(jest, '<22.0.0')) {
32-
throw new Error(`You need Jest version >= 22.0.0 to use the @stryker-mutator/jest-runner plugin, found ${jest}`);
33-
} else if (semver.satisfies(jest, '<24')) {
38+
function guardJestVersion({ version, raw }: CoercedVersion, options: StrykerOptions, log: Logger) {
39+
if (semver.satisfies(version, '<22.0.0')) {
40+
throw new Error(`You need Jest version >= 22.0.0 to use the @stryker-mutator/jest-runner plugin, found ${raw}`);
41+
} else if (semver.satisfies(version, '<24')) {
3442
if (options.coverageAnalysis !== 'off') {
3543
throw new Error(
3644
`You need Jest version >= 24.0.0 to use the @stryker-mutator/jest-runner with "coverageAnalysis": "${options.coverageAnalysis}", you're currently using version 23.0.0. Please upgrade your jest version, or set "coverageAnalysis": "off".`,
3745
);
3846
}
3947
log.warn(
4048
'[DEPRECATED] Support for Jest version < 24 is deprecated and will be removed in the next major version of Stryker, please upgrade your jest version (your current version is %s).',
41-
jest,
49+
raw,
4250
);
4351
}
4452
}

packages/jest-runner/test/unit/jest-test-adapters/jest-test-adapter-factory.spec.ts

+21-2
Original file line numberDiff line numberDiff line change
@@ -37,26 +37,45 @@ describe(jestTestAdapterFactory.name, () => {
3737
expect(testInjector.logger.debug).calledWith('Detected Jest version %s', '25.0.0');
3838
});
3939

40-
it('should return a JestGreaterThan25Adapter when the Jest version is higher or equal to 25.0.0', () => {
40+
it('should return a JestGreaterThan25Adapter when the Jest version is greater or equal to 25.0.0', () => {
4141
jestWrapperMock.getVersion.returns('25.0.0');
4242
const testAdapter = act();
4343

4444
expect(testAdapter).instanceOf(JestGreaterThan25TestAdapter);
4545
});
46-
it('should return a JestLessThan25Adapter when the Jest version is higher or equal to 22.0.0, but less then 25 and coverage analysis is disabled', () => {
46+
it('should return a JestGreaterThan25Adapter when the Jest version is an alpha version greater than 25.0.0', () => {
47+
jestWrapperMock.getVersion.returns('30.0.0-alpha.6');
48+
const testAdapter = act();
49+
50+
expect(testAdapter).instanceOf(JestGreaterThan25TestAdapter);
51+
});
52+
it('should return a JestLessThan25Adapter when the Jest version is greater or equal to 22.0.0, but less then 25 and coverage analysis is disabled', () => {
4753
testInjector.options.coverageAnalysis = 'off';
4854
jestWrapperMock.getVersion.returns('22.0.0');
4955
const testAdapter = act();
5056

5157
expect(testAdapter).instanceOf(JestLessThan25TestAdapter);
5258
});
59+
it('should return a JestLessThan25Adapter when the Jest version is an alpha version greater than 22.0.0, lower than 25', () => {
60+
testInjector.options.coverageAnalysis = 'off';
61+
jestWrapperMock.getVersion.returns('23.0.0-alpha.6');
62+
const testAdapter = act();
63+
64+
expect(testAdapter).instanceOf(JestLessThan25TestAdapter);
65+
});
5366

5467
it('should throw an error when the Jest version is lower than 22.0.0', () => {
5568
jestWrapperMock.getVersion.returns('21.0.0');
5669

5770
expect(act).to.throw(Error, 'You need Jest version >= 22.0.0 to use the @stryker-mutator/jest-runner plugin, found 21.0.0');
5871
});
5972

73+
it('should throw an error when the Jest version is an alpha version lower than 22.0.0', () => {
74+
jestWrapperMock.getVersion.returns('21.0.0-alpha.6');
75+
76+
expect(act).to.throw(Error, 'You need Jest version >= 22.0.0 to use the @stryker-mutator/jest-runner plugin, found 21.0.0-alpha.6');
77+
});
78+
6079
it('should throw an error when the Jest version is between 22 and 24, but coverage analysis is enabled', () => {
6180
jestWrapperMock.getVersion.returns('23.0.0');
6281
testInjector.options.coverageAnalysis = 'all';

packages/jest-runner/test/unit/jest-test-runner.spec.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ describe(JestTestRunner.name, () => {
376376
});
377377
});
378378

379-
it('should not add a set setupFile if testRunner is not specified and jest version >= 27 (circus test runner)', async () => {
379+
it('should not add a setupFile if testRunner is not specified and jest version >= 27 (circus test runner)', async () => {
380380
jestWrapperMock.getVersion.returns('27.0.0');
381381
options.jest.config = { testRunner: undefined };
382382
const sut = await arrangeInitializedSut();
@@ -386,6 +386,16 @@ describe(JestTestRunner.name, () => {
386386
});
387387
});
388388

389+
it('should not add a setupFile if testRunner is not specified and jest is an alpha version >= 27 (circus test runner)', async () => {
390+
jestWrapperMock.getVersion.returns('30.0.0-alpha.6');
391+
options.jest.config = { testRunner: undefined };
392+
const sut = await arrangeInitializedSut();
393+
await sut.dryRun(factory.dryRunOptions({ coverageAnalysis: 'perTest' }));
394+
expect(jestTestAdapterMock.run).calledWithMatch({
395+
jestConfig: sinon.match({ setupFilesAfterEnv: undefined }),
396+
});
397+
});
398+
389399
it('should not allow the circus test runner for coverage analysis "perTest"', async () => {
390400
options.jest.config = { testRunner: 'jest-circus/runner' };
391401
const sut = await arrangeInitializedSut();

0 commit comments

Comments
 (0)