Skip to content

Commit 8ad7372

Browse files
committed
Merge branch 'beta'
2 parents cd6c8a9 + 1c22235 commit 8ad7372

File tree

17 files changed

+244
-74
lines changed

17 files changed

+244
-74
lines changed

.github/workflows/tests.yml

+4-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ jobs:
3737
uses: actions/cache@v4
3838
with:
3939
path: ~/.cache/mongodb-binaries
40-
key: ${{ matrix.node-version }}
40+
key: ${{ matrix.node-version }}-${{ hashFiles('**/globalSetup.ts') }}
41+
restore-keys: |
42+
${{ matrix.node-version }}-
43+
${{ matrix.node-version }}
4144
- name: Install node_modules
4245
run: yarn
4346
- name: TSCheck

CHANGELOG.md

+19
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,22 @@
1+
## [9.4.0-beta.1](https://github.com/nodkz/mongodb-memory-server/compare/v9.3.0...v9.4.0-beta.1) (2024-06-05)
2+
3+
4+
### Fixes
5+
6+
* **MongoMemoryReplSet:** dont warn unless storage engine is set explicitly ([582bf0a](https://github.com/nodkz/mongodb-memory-server/commit/582bf0ae88ffa7ca66258a96344ed2ce6d5abd18))
7+
8+
9+
### Refactor
10+
11+
* **utils::removeDir:** remove nodejs 12 workaround ([a852513](https://github.com/nodkz/mongodb-memory-server/commit/a852513b615b17179837af76f94aafabe1ea7ab7))
12+
13+
14+
### Dependencies
15+
16+
* **async-mutex:** upgrade to version 0.4.1 ([b67c783](https://github.com/nodkz/mongodb-memory-server/commit/b67c7830b3bfce6e23c03ce36fd4a6fea5112933))
17+
* **debug:** upgrade to version 4.3.5 ([72a0b76](https://github.com/nodkz/mongodb-memory-server/commit/72a0b7665d9d63ff99a052220b89c00b909502f8))
18+
* **tslib:** upgrade to version 2.6.3 ([a49993b](https://github.com/nodkz/mongodb-memory-server/commit/a49993b85bb23ecdf90f10f2e73b0a64b096878d))
19+
120
## [9.3.0](https://github.com/nodkz/mongodb-memory-server/compare/v9.2.0...v9.3.0) (2024-05-30)
221

322

packages/mongodb-memory-server-core/package.json

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
{
22
"name": "mongodb-memory-server-core",
3-
"version": "9.3.0",
3+
"version": "9.4.0-beta.1",
44
"description": "MongoDB Server for testing (core package, without autodownload). The server will allow you to connect your favourite ODM or client library to the MongoDB Server and run parallel integration tests isolated from each other.",
55
"main": "lib/index",
66
"types": "lib/index.d.ts",
7+
"type": "commonjs",
78
"repository": {
89
"type": "git",
910
"url": "git+https://github.com/nodkz/mongodb-memory-server.git",
@@ -42,17 +43,17 @@
4243
"yazl": "^2.5.1"
4344
},
4445
"dependencies": {
45-
"async-mutex": "^0.4.0",
46+
"async-mutex": "^0.4.1",
4647
"camelcase": "^6.3.0",
47-
"debug": "^4.3.4",
48+
"debug": "^4.3.5",
4849
"find-cache-dir": "^3.3.2",
4950
"follow-redirects": "^1.15.6",
5051
"https-proxy-agent": "^7.0.4",
5152
"mongodb": "^5.9.1",
5253
"new-find-package-json": "^2.0.0",
5354
"semver": "^7.6.2",
5455
"tar-stream": "^3.1.7",
55-
"tslib": "^2.6.2",
56+
"tslib": "^2.6.3",
5657
"yauzl": "^3.1.3"
5758
},
5859
"scripts": {

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

+16-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
ensureAsync,
99
generateDbName,
1010
getHost,
11+
getStorageEngine,
1112
isNullOrUndefined,
1213
ManagerAdvanced,
1314
removeDir,
@@ -33,6 +34,8 @@ import {
3334
} from './util/errors';
3435
import { promises as fs } from 'fs';
3536
import { resolve } from 'path';
37+
import * as semver from 'semver';
38+
import { DryMongoBinary } from './util/DryMongoBinary';
3639

3740
const log = debug('MongoMS:MongoMemoryReplSet');
3841

@@ -239,6 +242,16 @@ export class MongoMemoryReplSet extends EventEmitter implements ManagerAdvanced
239242

240243
set replSetOpts(val: ReplSetOpts) {
241244
assertionIsMMSRSState(MongoMemoryReplSetStates.stopped, this._state);
245+
246+
// the following needs to be done because we set the default "storageEngine" here
247+
// which means the default is seen as set "explicitly" by the instance and would warn
248+
// in binary versions >=7.0.0
249+
const opts = DryMongoBinary.getEnsuredOptions(this.binaryOpts);
250+
// try to convert a string to a valid semver, like "v6.0-latest" (compiles to "6.0.0")
251+
// use "0.0.0" as a fallback to have a valid semver for later checks, but warn on invalid
252+
const coercedVersion = semver.coerce(opts.version) ?? new semver.SemVer('0.0.0');
253+
const storageEngine = getStorageEngine(val.storageEngine, coercedVersion);
254+
242255
const defaults: Required<ReplSetOpts> = {
243256
auth: { enable: false },
244257
args: [],
@@ -247,10 +260,11 @@ export class MongoMemoryReplSet extends EventEmitter implements ManagerAdvanced
247260
dbName: generateDbName(),
248261
ip: '127.0.0.1',
249262
spawn: {},
250-
storageEngine: 'ephemeralForTest',
263+
storageEngine,
251264
configSettings: {},
252265
};
253-
this._replSetOpts = { ...defaults, ...val };
266+
// force overwrite "storageEngine" because it is transformed already
267+
this._replSetOpts = { ...defaults, ...val, storageEngine };
254268

255269
assertion(this._replSetOpts.count > 0, new ReplsetCountLowError(this._replSetOpts.count));
256270

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

+2-17
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
Cleanup,
1212
createTmpDir,
1313
removeDir,
14+
getStorageEngine,
1415
} from './util/utils';
1516
import { MongoInstance, MongodOpts, MongoMemoryInstanceOpts } from './util/MongoInstance';
1617
import { MongoBinaryOpts } from './util/MongoBinary';
@@ -381,23 +382,7 @@ export class MongoMemoryServer extends EventEmitter implements ManagerAdvanced {
381382
console.warn(new UnknownVersionError(opts.version));
382383
}
383384

384-
// warn when storage engine "ephemeralForTest" is explicitly used and switch to "wiredTiger"
385-
if (storageEngine === 'ephemeralForTest' && semver.gte(coercedVersion, '7.0.0')) {
386-
console.warn(
387-
'Storage Engine "ephemeralForTest" is removed since mongodb 7.0.0, automatically using "wiredTiger"!\n' +
388-
'This warning is because the mentioned storage engine is explicitly used and mongodb version is 7.0.0 or higher'
389-
);
390-
391-
storageEngine = 'wiredTiger';
392-
}
393-
394-
if (isNullOrUndefined(storageEngine)) {
395-
if (semver.gte(coercedVersion, '7.0.0')) {
396-
storageEngine = 'wiredTiger';
397-
} else {
398-
storageEngine = 'ephemeralForTest';
399-
}
400-
}
385+
storageEngine = getStorageEngine(storageEngine, coercedVersion);
401386

402387
// use pre-defined port if available, otherwise generate a new port
403388
let port = typeof instOpts.port === 'number' ? instOpts.port : undefined;

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

+52
Original file line numberDiff line numberDiff line change
@@ -746,4 +746,56 @@ describe('MongoMemoryReplSet', () => {
746746
replSet.servers[0]._instanceInfo.tmpDir!
747747
); // manual cleanup
748748
});
749+
750+
describe('server version specific', () => {
751+
// should use default options that are supported for 7.0 (like not using "ephemeralForTest" by default)
752+
it('should allow mongodb by default 7.0', async () => {
753+
const server = await MongoMemoryReplSet.create({ binary: { version: '7.0.7' } });
754+
755+
await server.stop();
756+
});
757+
758+
it('should not warn if "ephemeralForTest" is used explicitly in mongodb 6.0', async () => {
759+
jest.spyOn(console, 'warn');
760+
const server = await MongoMemoryReplSet.create({
761+
binary: { version: '6.0.14' },
762+
replSet: { storageEngine: 'ephemeralForTest' },
763+
});
764+
765+
expect(console.warn).toHaveBeenCalledTimes(0);
766+
767+
expect(server.replSetOpts?.storageEngine).toStrictEqual('ephemeralForTest');
768+
769+
await server.stop();
770+
});
771+
772+
it('should not warn if no explicit storage engine is set in 7.0', async () => {
773+
jest.spyOn(console, 'warn');
774+
const server = await MongoMemoryReplSet.create({
775+
binary: { version: '7.0.7' },
776+
// replSet: { storageEngine: 'ephemeralForTest' },
777+
});
778+
779+
expect(console.warn).toHaveBeenCalledTimes(0);
780+
781+
expect(server.replSetOpts?.storageEngine).toStrictEqual('wiredTiger');
782+
783+
await server.stop();
784+
});
785+
786+
it('should warn if "ephemeralForTest" is used explicitly in mongodb 7.0', async () => {
787+
const spy = jest.spyOn(console, 'warn').mockImplementationOnce(() => {});
788+
const server = await MongoMemoryReplSet.create({
789+
binary: { version: '7.0.7' },
790+
replSet: { storageEngine: 'ephemeralForTest' },
791+
});
792+
793+
expect(console.warn).toHaveBeenCalledTimes(1);
794+
expect(spy.mock.calls).toMatchSnapshot();
795+
796+
expect(server.replSetOpts?.storageEngine).toStrictEqual('wiredTiger');
797+
798+
await server.stop();
799+
});
800+
});
749801
});

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

+28
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,34 @@ describe('MongoMemoryServer', () => {
11401140
await server.stop();
11411141
});
11421142

1143+
it('should not warn if "ephemeralForTest" is used explicitly in mongodb 6.0', async () => {
1144+
jest.spyOn(console, 'warn');
1145+
const server = await MongoMemoryServer.create({
1146+
binary: { version: '6.0.14' },
1147+
instance: { storageEngine: 'ephemeralForTest' },
1148+
});
1149+
1150+
expect(console.warn).toHaveBeenCalledTimes(0);
1151+
1152+
expect(server.instanceInfo?.storageEngine).toStrictEqual('ephemeralForTest');
1153+
1154+
await server.stop();
1155+
});
1156+
1157+
it('should not warn if no explicit storage engine is set in 7.0', async () => {
1158+
jest.spyOn(console, 'warn');
1159+
const server = await MongoMemoryServer.create({
1160+
binary: { version: '7.0.7' },
1161+
// instance: { storageEngine: 'ephemeralForTest' },
1162+
});
1163+
1164+
expect(console.warn).toHaveBeenCalledTimes(0);
1165+
1166+
expect(server.instanceInfo?.storageEngine).toStrictEqual('wiredTiger');
1167+
1168+
await server.stop();
1169+
});
1170+
11431171
it('should warn if "ephemeralForTest" is used explicitly in mongodb 7.0', async () => {
11441172
const spy = jest.spyOn(console, 'warn').mockImplementationOnce(() => {});
11451173
const server = await MongoMemoryServer.create({

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

+9
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,15 @@ This may be because of using a v6.x way of calling functions, look at the follow
2626
https://nodkz.github.io/mongodb-memory-server/docs/guides/migration/migrate7#no-function-other-than-start-create-ensureinstance-will-be-starting-anything"
2727
`;
2828

29+
exports[`MongoMemoryReplSet server version specific should warn if "ephemeralForTest" is used explicitly in mongodb 7.0 1`] = `
30+
Array [
31+
Array [
32+
"Storage Engine \\"ephemeralForTest\\" is removed since mongodb 7.0.0, automatically using \\"wiredTiger\\"!
33+
This warning is because the mentioned storage engine is explicitly used and mongodb version is 7.0.0 or higher",
34+
],
35+
]
36+
`;
37+
2938
exports[`single server replset "_initReplSet" should throw an error if _state is not "init" 1`] = `
3039
"Incorrect State for operation: \\"running\\", allowed States: \\"[init]\\"
3140
This may be because of using a v6.x way of calling functions, look at the following guide if anything applies:

packages/mongodb-memory-server-core/src/util/DryMongoBinary.ts

+15-5
Original file line numberDiff line numberDiff line change
@@ -130,20 +130,30 @@ export class DryMongoBinary {
130130
return returnValue[1];
131131
}
132132

133+
/**
134+
* Ensure the given options fulfill {@link DryMongoBinaryOptions} by defaulting them
135+
* @param opts The options to ensure
136+
* @returns The ensured options
137+
*/
138+
static getEnsuredOptions(opts?: BaseDryMongoBinaryOptions): DryMongoBinaryOptions {
139+
const defaultVersion = resolveConfig(ResolveConfigVariables.VERSION) ?? DEFAULT_VERSION;
140+
141+
return isNullOrUndefined(opts)
142+
? { version: defaultVersion }
143+
: { ...opts, version: opts.version || defaultVersion };
144+
}
145+
133146
/**
134147
* Generate All required options for the binary name / path generation
135148
*/
136149
static async generateOptions(
137150
opts?: BaseDryMongoBinaryOptions
138151
): Promise<Required<DryMongoBinaryOptions>> {
139152
log('generateOptions');
140-
const defaultVersion = resolveConfig(ResolveConfigVariables.VERSION) ?? DEFAULT_VERSION;
141-
const ensuredOpts: BaseDryMongoBinaryOptions = isNullOrUndefined(opts)
142-
? { version: defaultVersion }
143-
: opts;
153+
const ensuredOpts = DryMongoBinary.getEnsuredOptions(opts);
144154

145155
const final: Required<DryMongoBinaryOptions> = {
146-
version: ensuredOpts.version || defaultVersion,
156+
version: ensuredOpts.version,
147157
downloadDir:
148158
resolveConfig(ResolveConfigVariables.DOWNLOAD_DIR) || ensuredOpts.downloadDir || '',
149159
os: ensuredOpts.os ?? (await getOS()),

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

+33
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
InsufficientPermissionsError,
99
} from '../errors';
1010
import { assertIsError } from '../../__tests__/testUtils/test_utils';
11+
import { SemVer } from 'semver';
1112

1213
describe('utils', () => {
1314
describe('uriTemplate', () => {
@@ -224,4 +225,36 @@ describe('utils', () => {
224225
expect(spy).toHaveBeenCalledTimes(1);
225226
});
226227
});
228+
229+
describe('getStorageEngine', () => {
230+
it('should get default without warning for versions', () => {
231+
jest.spyOn(console, 'warn');
232+
expect(utils.getStorageEngine(undefined, new SemVer('6.0.0'))).toStrictEqual(
233+
'ephemeralForTest'
234+
);
235+
expect(utils.getStorageEngine(undefined, new SemVer('7.0.0'))).toStrictEqual('wiredTiger');
236+
237+
expect(console.warn).toHaveBeenCalledTimes(0);
238+
});
239+
240+
it('should not warn for versions below 7.0.0', () => {
241+
jest.spyOn(console, 'warn');
242+
expect(utils.getStorageEngine('ephemeralForTest', new SemVer('6.0.0'))).toStrictEqual(
243+
'ephemeralForTest'
244+
);
245+
expect(utils.getStorageEngine('wiredTiger', new SemVer('6.0.0'))).toStrictEqual('wiredTiger');
246+
247+
expect(console.warn).toHaveBeenCalledTimes(0);
248+
});
249+
250+
it('should warn for versions above 7.0.0 for ephemeralForTest', () => {
251+
jest.spyOn(console, 'warn').mockImplementationOnce(() => void 0);
252+
expect(utils.getStorageEngine('ephemeralForTest', new SemVer('7.0.0'))).toStrictEqual(
253+
'wiredTiger'
254+
);
255+
expect(utils.getStorageEngine('wiredTiger', new SemVer('7.0.0'))).toStrictEqual('wiredTiger');
256+
257+
expect(console.warn).toHaveBeenCalledTimes(1);
258+
});
259+
});
227260
});

0 commit comments

Comments
 (0)