diff --git a/src/cli/assert_node_engine_version.ts b/src/cli/assert_node_engine_version.ts index e2a72f4ab..664d8b524 100644 --- a/src/cli/assert_node_engine_version.ts +++ b/src/cli/assert_node_engine_version.ts @@ -13,13 +13,15 @@ const readActualPackageJSON: () => PackageJSON = () => .toString() ) -export function assertNodeEngineVersion( +export function validateNodeEngineVersion( currentVersion: string, + onError: (message: string) => void, readPackageJSON: () => PackageJSON = readActualPackageJSON ): void { const requiredVersion = readPackageJSON().engines.node if (!semver.satisfies(currentVersion, requiredVersion)) { - const message = `Cucumber can only run on Node.js versions ${requiredVersion}. This Node.js version is ${currentVersion}` - throw new Error(message) + onError( + `Cucumber can only run on Node.js versions ${requiredVersion}. This Node.js version is ${currentVersion}` + ) } } diff --git a/src/cli/assert_node_engine_version_spec.ts b/src/cli/assert_node_engine_version_spec.ts index 01133411a..8b727bdcb 100644 --- a/src/cli/assert_node_engine_version_spec.ts +++ b/src/cli/assert_node_engine_version_spec.ts @@ -1,18 +1,37 @@ -import assert from 'assert' -import { assertNodeEngineVersion } from './assert_node_engine_version' +import { expect } from 'chai' +import * as sinon from 'sinon' +import { validateNodeEngineVersion } from './assert_node_engine_version' -describe(assertNodeEngineVersion.name, () => { - it('fails when the version is lower than specified in package.json', () => { - assert.throws(() => - assertNodeEngineVersion('v11.0.0', () => ({ - engines: { - node: '>=12', - }, - })) +describe(validateNodeEngineVersion.name, () => { + it('returns an error message when the version is lower than specified in package.json', () => { + // Arrange + const errorSpy = sinon.spy() + + // Act + validateNodeEngineVersion('v11.0.0', errorSpy, () => ({ + engines: { + node: '>=12', + }, + })) + + // Assert + expect(errorSpy).to.have.been.calledOnceWith( + 'Cucumber can only run on Node.js versions >=12. This Node.js version is v11.0.0' ) }) - it('passes when the version is greater than specified in package.json', () => { - assertNodeEngineVersion('v17.0.0') + it('returns null when the version is greater than specified in package.json', () => { + // Arrange + const errorSpy = sinon.spy() + + // Act + validateNodeEngineVersion('v17.0.0', errorSpy, () => ({ + engines: { + node: '>=12', + }, + })) + + // Assert + expect(errorSpy).not.to.have.been.called() }) }) diff --git a/src/cli/run.ts b/src/cli/run.ts index f7dec91e1..a4e8801f7 100644 --- a/src/cli/run.ts +++ b/src/cli/run.ts @@ -1,7 +1,7 @@ import Cli, { ICliRunResult } from './' import VError from 'verror' import publishBanner from './publish_banner' -import { assertNodeEngineVersion } from './assert_node_engine_version' +import { validateNodeEngineVersion } from './assert_node_engine_version' function exitWithError(error: Error): void { console.error(VError.fullStack(error)) // eslint-disable-line no-console @@ -13,12 +13,10 @@ function displayPublishAdvertisementBanner(): void { } export default async function run(): Promise { - try { - assertNodeEngineVersion(process.version) - } catch (error) { - console.error(error.message) // eslint-disable-line no-console + validateNodeEngineVersion(process.version, (error) => { + console.error(error) // eslint-disable-line no-console process.exit(1) - } + }) const cli = new Cli({ argv: process.argv,