Skip to content

Commit 427531e

Browse files
committed
fix(MongoMemoryServer::getStartOptions): coerce version to semver before semver checks
fixes #841
1 parent f5c7e27 commit 427531e

File tree

3 files changed

+38
-3
lines changed

3 files changed

+38
-3
lines changed

packages/mongodb-memory-server-core/src/MongoMemoryServer.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import debug from 'debug';
1818
import { EventEmitter } from 'events';
1919
import { promises as fspromises } from 'fs';
2020
import { AddUserOptions, MongoClient } from 'mongodb';
21-
import { InstanceInfoError, StateError } from './util/errors';
21+
import { InstanceInfoError, StateError, UnknownVersionError } from './util/errors';
2222
import * as os from 'os';
2323
import { DryMongoBinary } from './util/DryMongoBinary';
2424
import * as semver from 'semver';
@@ -372,8 +372,17 @@ export class MongoMemoryServer extends EventEmitter implements ManagerAdvanced {
372372
const opts = await DryMongoBinary.generateOptions(this.opts.binary);
373373
let storageEngine = instOpts.storageEngine;
374374

375+
// try to convert a string to a valid semver, like "v6.0-latest" (compiles to "6.0.0")
376+
// use "0.0.0" as a fallback to have a valid semver for later checks, but warn on invalid
377+
const coercedVersion = semver.coerce(opts.version) ?? new semver.SemVer('0.0.0');
378+
379+
// warn on invalid version here, a invalid version will be thrown in MongoBinaryDownloadUrl if downloading
380+
if (semver.eq(coercedVersion, '0.0.0')) {
381+
console.warn(new UnknownVersionError(opts.version));
382+
}
383+
375384
// warn when storage engine "ephemeralForTest" is explicitly used and switch to "wiredTiger"
376-
if (storageEngine === 'ephemeralForTest' && semver.gte(opts.version, '7.0.0')) {
385+
if (storageEngine === 'ephemeralForTest' && semver.gte(coercedVersion, '7.0.0')) {
377386
console.warn(
378387
'Storage Engine "ephemeralForTest" is removed since mongodb 7.0.0, automatically using "wiredTiger"!\n' +
379388
'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 {
383392
}
384393

385394
if (isNullOrUndefined(storageEngine)) {
386-
if (semver.gte(opts.version, '7.0.0')) {
395+
if (semver.gte(coercedVersion, '7.0.0')) {
387396
storageEngine = 'wiredTiger';
388397
} else {
389398
storageEngine = 'ephemeralForTest';

packages/mongodb-memory-server-core/src/__tests__/MongoMemoryServer.test.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,24 @@ describe('MongoMemoryServer', () => {
10011001

10021002
await utils.removeDir(options.data.tmpDir!); // manual cleanup
10031003
});
1004+
1005+
it('should work with -latest versions [#841]', async () => {
1006+
const mongoServer = new MongoMemoryServer({ binary: { version: 'v6.0-latest' } });
1007+
1008+
// @ts-expect-error "getStartOptions" is protected
1009+
await mongoServer.getStartOptions();
1010+
});
1011+
1012+
it('should work with -latest versions [#841]', async () => {
1013+
const spy = jest.spyOn(console, 'warn').mockImplementationOnce(() => {});
1014+
const mongoServer = new MongoMemoryServer({ binary: { version: 'junk' } });
1015+
1016+
// @ts-expect-error "getStartOptions" is protected
1017+
await mongoServer.getStartOptions();
1018+
1019+
expect(console.warn).toHaveBeenCalledTimes(1);
1020+
expect(spy.mock.calls).toMatchSnapshot();
1021+
});
10041022
});
10051023

10061024
it('"getDbPath" should return the dbPath', async () => {

packages/mongodb-memory-server-core/src/__tests__/__snapshots__/MongoMemoryServer.test.ts.snap

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ This may be because of using a v6.x way of calling functions, look at the follow
2424
https://nodkz.github.io/mongodb-memory-server/docs/guides/migration/migrate7#no-function-other-than-start-create-ensureinstance-will-be-starting-anything"
2525
`;
2626

27+
exports[`MongoMemoryServer getStartOptions() should work with -latest versions [#841] 1`] = `
28+
Array [
29+
Array [
30+
[Error: Could not coerce VERSION to a semver version (version: "junk")],
31+
],
32+
]
33+
`;
34+
2735
exports[`MongoMemoryServer getUri() should throw an state error, if not starting or running 1`] = `
2836
"Incorrect State for operation: \\"new\\", allowed States: \\"[running,starting]\\"
2937
This may be because of using a v6.x way of calling functions, look at the following guide if anything applies:

0 commit comments

Comments
 (0)