Skip to content

Commit 9eb2892

Browse files
committed
feat: support es6 module tests
note: dynamicImport eslint rule is caused by eslint-plugin-node bug mysticatea/eslint-plugin-node#250
1 parent 92cd932 commit 9eb2892

12 files changed

+77
-33
lines changed

.eslintrc.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ module.exports = {
99
parserOptions: {
1010
ecmaVersion: 2021,
1111
},
12-
rules: {},
12+
rules: {
13+
'node/no-unsupported-features/es-syntax': [
14+
'error',
15+
{ ignores: ['dynamicImport'] },
16+
],
17+
},
1318
overrides: [
1419
{
1520
files: ['bin/watest.js'],

core/series.js

+40-23
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ class Series {
129129
* Runs tests matching the patterns.
130130
*/
131131
async runFor(patterns, name_postfix = '') {
132-
let tests = this.build({
132+
let tests = await this.build({
133133
patterns,
134134
folder: root_folder,
135135
virtual_folder: this.invocation,
@@ -162,19 +162,19 @@ class Series {
162162
/**
163163
* Returns tests as an array of { name, func, ... } objects.
164164
*/
165-
build({ patterns, folder, virtual_folder, webdriver = '' }) {
165+
async build({ patterns, folder, virtual_folder, webdriver = '' }) {
166166
let tests = [];
167167

168168
try {
169169
let test_module = {};
170170
try {
171-
test_module = this.loadTestMeta(folder);
171+
test_module = await this.loadTestMeta(folder);
172172
} catch (e) {
173173
// no meta.js
174174
}
175175

176176
let subfolders = test_module.folders;
177-
let testfiles = test_module.list || this.getTestFileList(folder);
177+
let testfiles = test_module.list || (await this.getTestFileList(folder));
178178
if (!subfolders && testfiles.length == 0) {
179179
throw new Error(`No tests found in ${folder}`);
180180
}
@@ -189,7 +189,7 @@ class Series {
189189
testfiles,
190190
webdriver,
191191
patterns,
192-
subtests: this.buildSubtests({
192+
subtests: await this.buildSubtests({
193193
patterns,
194194
folder,
195195
virtual_folder,
@@ -205,15 +205,15 @@ class Series {
205205
// Build the tests for webdrivers. Filter the list according traversed
206206
// webdriver.
207207
for (let webdriver of this.webdrivers) {
208-
let wdtests = this.buildTests({
208+
let wdtests = await this.buildTests({
209209
tests: [],
210210
folder,
211211
virtual_folder: `${virtual_folder}/${webdriver}`,
212212
testfiles,
213213
test_module,
214214
webdriver,
215215
patterns,
216-
subtests: this.buildSubtests({
216+
subtests: await this.buildSubtests({
217217
patterns,
218218
folder,
219219
virtual_folder: `${virtual_folder}/${webdriver}`,
@@ -242,24 +242,40 @@ class Series {
242242
return tests;
243243
}
244244

245-
buildSubtests({ patterns, folder, virtual_folder, subfolders, webdriver }) {
245+
async buildSubtests({
246+
patterns,
247+
folder,
248+
virtual_folder,
249+
subfolders,
250+
webdriver,
251+
}) {
246252
if (!subfolders) {
247253
return [];
248254
}
249-
return subfolders
250-
.map(subfolder => ({
251-
name: `${virtual_folder}/${subfolder}`,
252-
subtests: this.build({
255+
256+
let subtests_for_subfolders = await Promise.all(
257+
subfolders.map(subfolder =>
258+
this.build({
253259
patterns,
254260
folder: `${folder}/${subfolder}`,
255261
virtual_folder: `${virtual_folder}/${subfolder}`,
256262
webdriver,
257-
}),
263+
}).then(subtests => ({
264+
subfolder,
265+
subtests,
266+
}))
267+
)
268+
);
269+
270+
return subtests_for_subfolders
271+
.map(({ subfolder, subtests }) => ({
272+
name: `${virtual_folder}/${subfolder}`,
273+
subtests,
258274
}))
259275
.filter(t => t.subtests.length > 0);
260276
}
261277

262-
buildTests({
278+
async buildTests({
263279
tests,
264280
folder,
265281
virtual_folder,
@@ -313,22 +329,23 @@ class Series {
313329

314330
// Tests
315331
for (let { name, path } of list) {
332+
// Get a test.
316333
let single_test_module = null;
317334
try {
318-
single_test_module = this.loadTest(path);
335+
single_test_module = await this.loadTest(path);
319336
} catch (e) {
320337
console.error(e);
321-
throw new Error(`Failed to load test file: ${path}`);
338+
throw new Error(`Failed to load test: ${path}`);
322339
}
323340

324-
let test = single_test_module.test;
341+
const test = single_test_module.test;
325342
if (!test) {
326-
throw new Error(`No test function to was found in ${path}`);
343+
throw new Error(`No test was found in ${path}`);
327344
}
328345

329-
// If request service is running, then notify it of a test start.
330-
let test_wrap = () =>
331-
Promise.resolve(servicer.ontest(name)).then(() => test());
346+
// A function to notify the servicer the test is about to start and then
347+
// to invoke the test.
348+
const test_wrap = () => Promise.resolve(servicer.ontest(name)).then(test);
332349

333350
let failures_info = Series.failuresInfo({
334351
failures: expected_failures,
@@ -637,11 +654,11 @@ class Series {
637654
}
638655

639656
loadTestMeta(folder) {
640-
return require(path.join(root_dir, `${folder}/meta.js`));
657+
return import(path.join(root_dir, `${folder}/meta.js`));
641658
}
642659

643660
loadTest(fn) {
644-
return require(path.join(root_dir, fn));
661+
return import(path.join(root_dir, fn));
645662
}
646663

647664
getTestFileList(folder) {

index.mjs

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { createRequire } from 'module';
2+
const require = createRequire(import.meta.url);
3+
4+
const all_exports = require('./index.js');
5+
export default all_exports;

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
{
22
"name": "@camperaid/watest",
3-
"version": "2.0.3",
3+
"version": "2.0.4",
44
"description": "Web Application Testsuite",
55
"engines": {
66
"node": ">=14.15.1"
77
},
88
"main": "index.js",
9+
"module": "index.mjs",
910
"bin": {
1011
"watest": "./bin/watest.js"
1112
},

tests/series/build/t_adjust_names.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ module.exports.test = async () => {
3434
};
3535

3636
const series = new MockSeries([], { ts });
37-
const tests = series.build({ patterns: [], folder: 'unit', virtual_folder: 'unit' });
37+
const tests = await series.build({
38+
patterns: [],
39+
folder: 'unit',
40+
virtual_folder: 'unit',
41+
});
3842
series.adjustTestNames(tests, '2');
3943
series.shutdown();
4044

tests/series/build/t_adjust_names_webdriver.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ module.exports.test = async () => {
3030
};
3131

3232
const series = new MockSeries([], { ts, webdrivers: ['chrome', 'firefox'] });
33-
const tests = series.build({
33+
const tests = await series.build({
3434
patterns: [
3535
{
3636
path: 'tests/webdriver/end-to-end/sharing/t_shared_editing.js',

tests/series/build/t_mixed.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ module.exports.test = async () => {
4040
};
4141

4242
const series = new MockSeries([], { ts, webdrivers: ['chrome', 'firefox'] });
43-
const tests = series.build({
43+
const tests = await series.build({
4444
patterns: [],
4545
folder: 'tests',
4646
virtual_folder: 'mac',

tests/series/build/t_nested.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ module.exports.test = async () => {
3434
};
3535

3636
const series = new MockSeries('', { ts });
37-
const tests = series.build({ patterns: [], folder: 'unit', virtual_folder: 'unit' });
37+
const tests = await series.build({
38+
patterns: [],
39+
folder: 'unit',
40+
virtual_folder: 'unit',
41+
});
3842
series.shutdown();
3943

4044
is(

tests/series/build/t_patterns_webdriver.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ module.exports.test = async () => {
2020
};
2121

2222
const series = new MockSeries([], { ts, webdrivers: ['chrome', 'firefox'] });
23-
const tests = series.build({
23+
const tests = await series.build({
2424
patterns: [
2525
{
2626
path: 'e2e/t_testo.js',

tests/series/build/t_webdriver.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ module.exports.test = async () => {
2727
};
2828

2929
const series = new MockSeries('', { ts, webdrivers: ['chrome', 'firefox'] });
30-
const tests = series.build({ patterns: [], folder: 'e2e', virtual_folder: 'e2e' });
30+
const tests = await series.build({
31+
patterns: [],
32+
folder: 'e2e',
33+
virtual_folder: 'e2e',
34+
});
3135
series.shutdown();
3236

3337
is(

tests/series/build/t_webdriver_nested.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ module.exports.test = async () => {
2020
};
2121

2222
const series = new MockSeries('', { ts, webdrivers: ['chrome', 'firefox'] });
23-
const tests = series.build({ patterns: [], folder: 'e2e', virtual_folder: 'e2e' });
23+
const tests = await series.build({
24+
patterns: [],
25+
folder: 'e2e',
26+
virtual_folder: 'e2e',
27+
});
2428
series.shutdown();
2529

2630
is(

tests/series/build/t_webdriver_services.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ module.exports.test = async () => {
2323
};
2424

2525
const series = new MockSeries('', { ts, webdrivers: ['chrome', 'firefox'] });
26-
const tests = series.build({
26+
const tests = await series.build({
2727
patterns: [],
2828
folder: 'e2e',
2929
virtual_folder: 'e2e',

0 commit comments

Comments
 (0)