From 65c90cd48c314bb9f6bf0fcb79925d728901551f Mon Sep 17 00:00:00 2001 From: HugoDF Date: Sun, 28 Jul 2024 09:42:40 +0100 Subject: [PATCH 1/4] wip add t.mock.module example --- src/02.04-model-mock-native.test.js | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/02.04-model-mock-native.test.js diff --git a/src/02.04-model-mock-native.test.js b/src/02.04-model-mock-native.test.js new file mode 100644 index 0000000..d40b797 --- /dev/null +++ b/src/02.04-model-mock-native.test.js @@ -0,0 +1,35 @@ +import { describe, test, mock, before } from "node:test"; +import assert from "node:assert/strict"; + +let Model; +/** + * mock.module() was added in 22.3.0 + */ +const isNode22Point3OrLower = (() => { + const [major, minor, _patch] = process.versions.node.split("."); + return !(parseInt(major, 10) >= 22 && parseInt(minor, 10) >= 3); +})(); +describe('Class extends Mock - native', {skip: isNode22Point3OrLower }, () => { + test("It should not throw when passed a model containing an empty list of meetings", async () => { + mock.module('sequelize', { + namedExports: { + Model: class { } + } + }); + + const { default: _model } = await import(`./02.04-model.js?ts=${Date.now()}`); + Model = _model; + + const model = new Model(); + model.meetings = []; + assert.doesNotThrow(model.isAvailable.bind(model, new Date(Date.now()))); + }); + + test("It should not throw when passed a model containing an empty list of meetings", () => { + const model = Object.assign(new Model(), { + meetings: [], + }); + assert.doesNotThrow(model.isAvailable.bind(model, new Date(Date.now()))); + }); + +}) From 6ea7a4db51f2244d22661758c4ba750b9dc40cb0 Mon Sep 17 00:00:00 2001 From: HugoDF Date: Sun, 28 Jul 2024 09:58:13 +0100 Subject: [PATCH 2/4] get native module mocking working (opt-in via CLI flag) --- package-lock.json | 13 +++++++------ package.json | 13 +++++++------ src/02.04-model-mock-native.test.js | 30 +++++++++++++++++------------ 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8054a8..5d4b842 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "name": "node-test-runner-examples", "license": "MIT", "dependencies": { + "@types/node": "20.14.12", "axios": "1.6.8", "bcrypt": "5.1.1", "express": "4.19.2", @@ -217,9 +218,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", - "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "version": "20.14.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", + "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -1980,9 +1981,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "@types/node": { - "version": "20.11.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.0.tgz", - "integrity": "sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==", + "version": "20.14.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", + "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", "requires": { "undici-types": "~5.26.4" } diff --git a/package.json b/package.json index d2b997d..b00e3c4 100644 --- a/package.json +++ b/package.json @@ -3,14 +3,14 @@ "private": true, "type": "module", "scripts": { - "test": "node --test ./src/*.test.js", - "dev": "node --test --watch ./src/*.test.js", + "test": "node --test --experimental-test-module-mocks ./src/*.test.js", + "dev": "node --test --watch --experimental-test-module-mocks ./src/*.test.js", "test:all": "npm run test:coverage && npm run test:only && npm run test:seq && npm run test:par", - "test:coverage": "node --test --experimental-test-coverage ./src/*.test.js", - "test:coverage:file": "node --test --experimental-test-coverage --test-reporter=lcov --test-reporter-destination=lcov.info ./src/*.test.js", + "test:coverage": "node --test --experimental-test-coverage --experimental-test-module-mocks ./src/*.test.js", + "test:coverage:file": "node --test --experimental-test-coverage --experimental-test-module-mocks --test-reporter=lcov --test-reporter-destination=lcov.info ./src/*.test.js", "report:html": "npx @lcov-viewer/cli lcov -o ./coverage ./lcov.info", - "test:seq": "node --test --test-concurrency=1 ./src/*.test.js", - "test:par": "node --test --test-concurrency=5 ./src/*.test.js", + "test:seq": "node --test --test-concurrency=1 --experimental-test-module-mocks ./src/*.test.js", + "test:par": "node --test --test-concurrency=5 --experimental-test-module-mocks ./src/*.test.js", "test:only": "node --test --test-only src/*.only.js", "test:failing": "node --test src/*.failing.js && echo 'Error: test run should fail' && exit 1 || echo 'Success: test run failed as expected' && exit 0", "lint": "biome lint --apply ./src", @@ -18,6 +18,7 @@ }, "license": "MIT", "dependencies": { + "@types/node": "20.14.12", "axios": "1.6.8", "bcrypt": "5.1.1", "express": "4.19.2", diff --git a/src/02.04-model-mock-native.test.js b/src/02.04-model-mock-native.test.js index d40b797..78ad370 100644 --- a/src/02.04-model-mock-native.test.js +++ b/src/02.04-model-mock-native.test.js @@ -1,7 +1,6 @@ -import { describe, test, mock, before } from "node:test"; +import { describe, test, mock, before, after } from "node:test"; import assert from "node:assert/strict"; -let Model; /** * mock.module() was added in 22.3.0 */ @@ -9,17 +8,25 @@ const isNode22Point3OrLower = (() => { const [major, minor, _patch] = process.versions.node.split("."); return !(parseInt(major, 10) >= 22 && parseInt(minor, 10) >= 3); })(); -describe('Class extends Mock - native', {skip: isNode22Point3OrLower }, () => { - test("It should not throw when passed a model containing an empty list of meetings", async () => { - mock.module('sequelize', { + +let Model; +/** @type {ReturnType}*/ +let modelMock; +describe("Class extends Mock - native", { skip: isNode22Point3OrLower }, () => { + before(async () => { + modelMock = mock.module("sequelize", { namedExports: { - Model: class { } - } + Model: class {}, + }, }); - const { default: _model } = await import(`./02.04-model.js?ts=${Date.now()}`); - Model = _model; - + const { default: model } = await import("./02.04-model.js"); + Model = model; + }); + after(() => { + modelMock.restore(); + }); + test("It should not throw when passed a model containing an empty list of meetings", async (t) => { const model = new Model(); model.meetings = []; assert.doesNotThrow(model.isAvailable.bind(model, new Date(Date.now()))); @@ -31,5 +38,4 @@ describe('Class extends Mock - native', {skip: isNode22Point3OrLower }, () => { }); assert.doesNotThrow(model.isAvailable.bind(model, new Date(Date.now()))); }); - -}) +}); From 579b76bcef77a9c90d04318a083ec331a521d9e0 Mon Sep 17 00:00:00 2001 From: HugoDF Date: Sun, 28 Jul 2024 10:01:37 +0100 Subject: [PATCH 3/4] update dev vs prod dep (types/node) --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5d4b842..5d4743e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,6 @@ "name": "node-test-runner-examples", "license": "MIT", "dependencies": { - "@types/node": "20.14.12", "axios": "1.6.8", "bcrypt": "5.1.1", "express": "4.19.2", @@ -16,6 +15,7 @@ }, "devDependencies": { "@biomejs/biome": "1.5.3", + "@types/node": "20.14.12", "esmock": "2.6.3", "nock": "13.5.1", "undici": "6.5.0" diff --git a/package.json b/package.json index b00e3c4..cdb6ccd 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ }, "license": "MIT", "dependencies": { - "@types/node": "20.14.12", "axios": "1.6.8", "bcrypt": "5.1.1", "express": "4.19.2", @@ -26,6 +25,7 @@ "supertest": "7.0.0" }, "devDependencies": { + "@types/node": "20.14.12", "@biomejs/biome": "1.5.3", "esmock": "2.6.3", "nock": "13.5.1", From c779c127d11bd2e8e1b1f70db5ad9dfdd25a4b2d Mon Sep 17 00:00:00 2001 From: HugoDF Date: Sun, 28 Jul 2024 10:04:47 +0100 Subject: [PATCH 4/4] reword skip condition --- src/02.04-model-mock-native.test.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/02.04-model-mock-native.test.js b/src/02.04-model-mock-native.test.js index 78ad370..64f5140 100644 --- a/src/02.04-model-mock-native.test.js +++ b/src/02.04-model-mock-native.test.js @@ -1,18 +1,16 @@ import { describe, test, mock, before, after } from "node:test"; import assert from "node:assert/strict"; -/** - * mock.module() was added in 22.3.0 - */ -const isNode22Point3OrLower = (() => { +// mock.module() was added in 22.3.0 +const supportsMockModule = (() => { const [major, minor, _patch] = process.versions.node.split("."); - return !(parseInt(major, 10) >= 22 && parseInt(minor, 10) >= 3); + return parseInt(major, 10) >= 22 && parseInt(minor, 10) >= 3; })(); let Model; /** @type {ReturnType}*/ let modelMock; -describe("Class extends Mock - native", { skip: isNode22Point3OrLower }, () => { +describe("Class extends Mock - native", { skip: !supportsMockModule }, () => { before(async () => { modelMock = mock.module("sequelize", { namedExports: {