From 427531e1e05c038e457593a89c42c0b0dac02f76 Mon Sep 17 00:00:00 2001 From: hasezoey Date: Thu, 4 Jan 2024 15:23:50 +0100 Subject: [PATCH] fix(MongoMemoryServer::getStartOptions): coerce version to semver before semver checks fixes #841 --- .../src/MongoMemoryServer.ts | 15 ++++++++++++--- .../src/__tests__/MongoMemoryServer.test.ts | 18 ++++++++++++++++++ .../MongoMemoryServer.test.ts.snap | 8 ++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/packages/mongodb-memory-server-core/src/MongoMemoryServer.ts b/packages/mongodb-memory-server-core/src/MongoMemoryServer.ts index 36ffd0f95..6e6f08106 100644 --- a/packages/mongodb-memory-server-core/src/MongoMemoryServer.ts +++ b/packages/mongodb-memory-server-core/src/MongoMemoryServer.ts @@ -18,7 +18,7 @@ import debug from 'debug'; import { EventEmitter } from 'events'; import { promises as fspromises } from 'fs'; import { AddUserOptions, MongoClient } from 'mongodb'; -import { InstanceInfoError, StateError } from './util/errors'; +import { InstanceInfoError, StateError, UnknownVersionError } from './util/errors'; import * as os from 'os'; import { DryMongoBinary } from './util/DryMongoBinary'; import * as semver from 'semver'; @@ -372,8 +372,17 @@ export class MongoMemoryServer extends EventEmitter implements ManagerAdvanced { const opts = await DryMongoBinary.generateOptions(this.opts.binary); let storageEngine = instOpts.storageEngine; + // try to convert a string to a valid semver, like "v6.0-latest" (compiles to "6.0.0") + // use "0.0.0" as a fallback to have a valid semver for later checks, but warn on invalid + const coercedVersion = semver.coerce(opts.version) ?? new semver.SemVer('0.0.0'); + + // warn on invalid version here, a invalid version will be thrown in MongoBinaryDownloadUrl if downloading + if (semver.eq(coercedVersion, '0.0.0')) { + console.warn(new UnknownVersionError(opts.version)); + } + // warn when storage engine "ephemeralForTest" is explicitly used and switch to "wiredTiger" - if (storageEngine === 'ephemeralForTest' && semver.gte(opts.version, '7.0.0')) { + if (storageEngine === 'ephemeralForTest' && semver.gte(coercedVersion, '7.0.0')) { console.warn( 'Storage Engine "ephemeralForTest" is removed since mongodb 7.0.0, automatically using "wiredTiger"!\n' + 'This warning is because the mentioned storage engine is explicitly used and mongodb version is 7.0.0 or higher' @@ -383,7 +392,7 @@ export class MongoMemoryServer extends EventEmitter implements ManagerAdvanced { } if (isNullOrUndefined(storageEngine)) { - if (semver.gte(opts.version, '7.0.0')) { + if (semver.gte(coercedVersion, '7.0.0')) { storageEngine = 'wiredTiger'; } else { storageEngine = 'ephemeralForTest'; diff --git a/packages/mongodb-memory-server-core/src/__tests__/MongoMemoryServer.test.ts b/packages/mongodb-memory-server-core/src/__tests__/MongoMemoryServer.test.ts index b0f25d795..4a85f9143 100644 --- a/packages/mongodb-memory-server-core/src/__tests__/MongoMemoryServer.test.ts +++ b/packages/mongodb-memory-server-core/src/__tests__/MongoMemoryServer.test.ts @@ -1001,6 +1001,24 @@ describe('MongoMemoryServer', () => { await utils.removeDir(options.data.tmpDir!); // manual cleanup }); + + it('should work with -latest versions [#841]', async () => { + const mongoServer = new MongoMemoryServer({ binary: { version: 'v6.0-latest' } }); + + // @ts-expect-error "getStartOptions" is protected + await mongoServer.getStartOptions(); + }); + + it('should work with -latest versions [#841]', async () => { + const spy = jest.spyOn(console, 'warn').mockImplementationOnce(() => {}); + const mongoServer = new MongoMemoryServer({ binary: { version: 'junk' } }); + + // @ts-expect-error "getStartOptions" is protected + await mongoServer.getStartOptions(); + + expect(console.warn).toHaveBeenCalledTimes(1); + expect(spy.mock.calls).toMatchSnapshot(); + }); }); it('"getDbPath" should return the dbPath', async () => { diff --git a/packages/mongodb-memory-server-core/src/__tests__/__snapshots__/MongoMemoryServer.test.ts.snap b/packages/mongodb-memory-server-core/src/__tests__/__snapshots__/MongoMemoryServer.test.ts.snap index 03dee7547..da3d83286 100644 --- a/packages/mongodb-memory-server-core/src/__tests__/__snapshots__/MongoMemoryServer.test.ts.snap +++ b/packages/mongodb-memory-server-core/src/__tests__/__snapshots__/MongoMemoryServer.test.ts.snap @@ -24,6 +24,14 @@ This may be because of using a v6.x way of calling functions, look at the follow https://nodkz.github.io/mongodb-memory-server/docs/guides/migration/migrate7#no-function-other-than-start-create-ensureinstance-will-be-starting-anything" `; +exports[`MongoMemoryServer getStartOptions() should work with -latest versions [#841] 1`] = ` +Array [ + Array [ + [Error: Could not coerce VERSION to a semver version (version: "junk")], + ], +] +`; + exports[`MongoMemoryServer getUri() should throw an state error, if not starting or running 1`] = ` "Incorrect State for operation: \\"new\\", allowed States: \\"[running,starting]\\" This may be because of using a v6.x way of calling functions, look at the following guide if anything applies: