Skip to content

Commit b5d42fe

Browse files
test: switch tests to ESM imports
1 parent 2134c09 commit b5d42fe

3 files changed

Lines changed: 144 additions & 43 deletions

File tree

tests/e2e/translations_spec.js

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const fs = require("node:fs");
22
const path = require("node:path");
3+
const { pathToFileURL } = require("node:url");
34
const helmet = require("helmet");
45
const { JSDOM } = require("jsdom");
56
const express = require("express");
@@ -54,23 +55,47 @@ describe("translations", () => {
5455
describe("loadTranslations", () => {
5556
let dom;
5657

57-
beforeEach(() => {
58+
beforeEach(async () => {
5859
// Create a new translation test environment for each test
5960
const env = createTranslationTestEnvironment();
6061
const window = env.window;
6162

62-
// Load module.js content directly for loadTranslations tests
63-
const moduleJs = fs.readFileSync(path.join(__dirname, "..", "..", "js", "module.js"), "utf-8");
64-
65-
// Execute the script in the JSDOM context
66-
window.eval(moduleJs);
67-
68-
// Additional setup for loadTranslations tests
69-
window.config = { language: "de" };
63+
// Bridge JSDOM globals to Node.js so module.js (ES module) can access them
64+
global.Log = window.Log;
65+
global.Translator = window.Translator;
66+
global.config = { language: "de" };
67+
global.window = { name: "", mmVersion: "2.0.0" };
68+
global.MM = { hideModule: () => {}, showModule: () => {}, sendNotification: () => {}, updateDom: () => {} };
69+
global.nunjucks = {
70+
Environment () {
71+
this.addFilter = () => {};
72+
this.renderString = () => "";
73+
this.render = (_t, _d, cb) => cb(null, "");
74+
},
75+
WebLoader () {},
76+
runtime: { markSafe: (str) => str }
77+
};
78+
79+
// Import Module directly — eval can't handle ES module syntax
80+
const modulePath = pathToFileURL(path.join(__dirname, "..", "..", "js", "module.js")).href;
81+
const { Module } = await import(`${modulePath}?test=${Date.now()}`);
82+
window.Module = Module;
83+
84+
// Expose config on window so tests can modify dom.window.config
85+
window.config = global.config;
7086

7187
dom = { window };
7288
});
7389

90+
afterEach(() => {
91+
delete global.Log;
92+
delete global.Translator;
93+
delete global.config;
94+
delete global.window;
95+
delete global.MM;
96+
delete global.nunjucks;
97+
});
98+
7499
it("should load translation file", async () => {
75100
const { Translator, Module, config } = dom.window;
76101
config.language = "en";

tests/unit/classes/module_spec.js

Lines changed: 58 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,64 @@
11
const path = require("node:path");
2-
const { JSDOM } = require("jsdom");
2+
const { pathToFileURL } = require("node:url");
33

44
describe("File js/module (cloneObject)", () => {
55
describe("Test function cloneObject", () => {
66
let clone;
77
let Module;
8-
let dom;
9-
10-
beforeAll(() => {
11-
return new Promise((done) => {
12-
dom = new JSDOM(
13-
`<script>var Log = {log: () => {}, info: () => {}, warn: () => {}, error: () => {}, debug: () => {}};</script>\
14-
<script src="file://${path.join(__dirname, "..", "..", "..", "js", "module.js")}">`,
15-
{ runScripts: "dangerously", resources: "usable" }
16-
);
17-
dom.window.onload = () => {
18-
const { cloneObject, Module: LoadedModule } = dom.window;
19-
clone = cloneObject;
20-
Module = LoadedModule;
21-
done();
22-
};
23-
});
8+
let originalWindow;
9+
let originalLog;
10+
let originalConfig;
11+
let originalMM;
12+
let originalTranslator;
13+
let originalNunjucks;
14+
15+
beforeAll(async () => {
16+
originalWindow = global.window;
17+
originalLog = global.Log;
18+
originalConfig = global.config;
19+
originalMM = global.MM;
20+
originalTranslator = global.Translator;
21+
originalNunjucks = global.nunjucks;
22+
23+
global.window = { mmVersion: "2.0.0" };
24+
global.Log = { log: () => {}, info: () => {}, warn: () => {}, error: () => {}, debug: () => {} };
25+
global.config = { language: "en" };
26+
global.MM = {
27+
hideModule: () => {},
28+
showModule: () => {},
29+
sendNotification: () => {},
30+
updateDom: () => {}
31+
};
32+
global.Translator = {
33+
load: () => Promise.resolve(),
34+
translate: () => ""
35+
};
36+
global.nunjucks = {
37+
Environment () {
38+
this.addFilter = () => {};
39+
this.renderString = () => "";
40+
this.render = (_template, _data, callback) => callback(null, "");
41+
},
42+
WebLoader () {},
43+
runtime: {
44+
markSafe: (str) => str
45+
}
46+
};
47+
48+
const modulePath = pathToFileURL(path.join(__dirname, "..", "..", "..", "js", "module.js")).href;
49+
const loaded = await import(`${modulePath}?test=${Date.now()}`);
50+
51+
clone = loaded.cloneObject;
52+
Module = loaded.Module;
53+
});
54+
55+
afterAll(() => {
56+
global.window = originalWindow;
57+
global.Log = originalLog;
58+
global.config = originalConfig;
59+
global.MM = originalMM;
60+
global.Translator = originalTranslator;
61+
global.nunjucks = originalNunjucks;
2462
});
2563

2664
it("should clone object", () => {
@@ -137,11 +175,11 @@ describe("File js/module (cloneObject)", () => {
137175
let info;
138176

139177
beforeEach(() => {
140-
info = dom.window.Log.info;
178+
info = global.Log.info;
141179
});
142180

143181
afterEach(() => {
144-
dom.window.Log.info = info;
182+
global.Log.info = info;
145183
Module.definitions = {};
146184
});
147185

@@ -181,7 +219,7 @@ describe("File js/module (cloneObject)", () => {
181219
const moduleName = "MMM-TestSuperCall";
182220
let loggedMessage;
183221

184-
dom.window.Log.info = (message) => {
222+
global.Log.info = (message) => {
185223
loggedMessage = message;
186224
};
187225

tests/unit/functions/cmp_versions_spec.js

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,60 @@
11
const path = require("node:path");
2-
const { JSDOM } = require("jsdom");
2+
const { pathToFileURL } = require("node:url");
33

44
describe("Test function cmpVersions in js/module.js", () => {
55
let cmp;
6+
let originalWindow;
7+
let originalLog;
8+
let originalConfig;
9+
let originalMM;
10+
let originalTranslator;
11+
let originalNunjucks;
612

7-
beforeAll(() => {
8-
return new Promise((done) => {
9-
const dom = new JSDOM(
10-
`<script>var Class = {extend: () => { return {}; }};</script>\
11-
<script src="file://${path.join(__dirname, "..", "..", "..", "js", "module.js")}">`,
12-
{ runScripts: "dangerously", resources: "usable" }
13-
);
14-
dom.window.onload = () => {
15-
const { cmpVersions } = dom.window;
16-
cmp = cmpVersions;
17-
done();
18-
};
19-
});
13+
beforeAll(async () => {
14+
originalWindow = global.window;
15+
originalLog = global.Log;
16+
originalConfig = global.config;
17+
originalMM = global.MM;
18+
originalTranslator = global.Translator;
19+
originalNunjucks = global.nunjucks;
20+
21+
global.window = { mmVersion: "2.0.0" };
22+
global.Log = { log: () => {}, info: () => {}, warn: () => {}, error: () => {}, debug: () => {} };
23+
global.config = { language: "en" };
24+
global.MM = {
25+
hideModule: () => {},
26+
showModule: () => {},
27+
sendNotification: () => {},
28+
updateDom: () => {}
29+
};
30+
global.Translator = {
31+
load: () => Promise.resolve(),
32+
translate: () => ""
33+
};
34+
global.nunjucks = {
35+
Environment () {
36+
this.addFilter = () => {};
37+
this.renderString = () => "";
38+
this.render = (_template, _data, callback) => callback(null, "");
39+
},
40+
WebLoader () {},
41+
runtime: {
42+
markSafe: (str) => str
43+
}
44+
};
45+
46+
const modulePath = pathToFileURL(path.join(__dirname, "..", "..", "..", "js", "module.js")).href;
47+
const loaded = await import(`${modulePath}?test=${Date.now()}`);
48+
cmp = loaded.cmpVersions;
49+
});
50+
51+
afterAll(() => {
52+
global.window = originalWindow;
53+
global.Log = originalLog;
54+
global.config = originalConfig;
55+
global.MM = originalMM;
56+
global.Translator = originalTranslator;
57+
global.nunjucks = originalNunjucks;
2058
});
2159

2260
it("should return -1 when comparing 2.1 to 2.2", () => {

0 commit comments

Comments
 (0)