Skip to content

Commit

Permalink
feat: support es6 module tests
Browse files Browse the repository at this point in the history
note: dynamicImport eslint rule is caused by eslint-plugin-node bug mysticatea/eslint-plugin-node#250
  • Loading branch information
asurkov committed Jun 14, 2021
1 parent 92cd932 commit 9eb2892
Show file tree
Hide file tree
Showing 12 changed files with 77 additions and 33 deletions.
7 changes: 6 additions & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@ module.exports = {
parserOptions: {
ecmaVersion: 2021,
},
rules: {},
rules: {
'node/no-unsupported-features/es-syntax': [
'error',
{ ignores: ['dynamicImport'] },
],
},
overrides: [
{
files: ['bin/watest.js'],
Expand Down
63 changes: 40 additions & 23 deletions core/series.js
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ class Series {
* Runs tests matching the patterns.
*/
async runFor(patterns, name_postfix = '') {
let tests = this.build({
let tests = await this.build({
patterns,
folder: root_folder,
virtual_folder: this.invocation,
Expand Down Expand Up @@ -162,19 +162,19 @@ class Series {
/**
* Returns tests as an array of { name, func, ... } objects.
*/
build({ patterns, folder, virtual_folder, webdriver = '' }) {
async build({ patterns, folder, virtual_folder, webdriver = '' }) {
let tests = [];

try {
let test_module = {};
try {
test_module = this.loadTestMeta(folder);
test_module = await this.loadTestMeta(folder);
} catch (e) {
// no meta.js
}

let subfolders = test_module.folders;
let testfiles = test_module.list || this.getTestFileList(folder);
let testfiles = test_module.list || (await this.getTestFileList(folder));
if (!subfolders && testfiles.length == 0) {
throw new Error(`No tests found in ${folder}`);
}
Expand All @@ -189,7 +189,7 @@ class Series {
testfiles,
webdriver,
patterns,
subtests: this.buildSubtests({
subtests: await this.buildSubtests({
patterns,
folder,
virtual_folder,
Expand All @@ -205,15 +205,15 @@ class Series {
// Build the tests for webdrivers. Filter the list according traversed
// webdriver.
for (let webdriver of this.webdrivers) {
let wdtests = this.buildTests({
let wdtests = await this.buildTests({
tests: [],
folder,
virtual_folder: `${virtual_folder}/${webdriver}`,
testfiles,
test_module,
webdriver,
patterns,
subtests: this.buildSubtests({
subtests: await this.buildSubtests({
patterns,
folder,
virtual_folder: `${virtual_folder}/${webdriver}`,
Expand Down Expand Up @@ -242,24 +242,40 @@ class Series {
return tests;
}

buildSubtests({ patterns, folder, virtual_folder, subfolders, webdriver }) {
async buildSubtests({
patterns,
folder,
virtual_folder,
subfolders,
webdriver,
}) {
if (!subfolders) {
return [];
}
return subfolders
.map(subfolder => ({
name: `${virtual_folder}/${subfolder}`,
subtests: this.build({

let subtests_for_subfolders = await Promise.all(
subfolders.map(subfolder =>
this.build({
patterns,
folder: `${folder}/${subfolder}`,
virtual_folder: `${virtual_folder}/${subfolder}`,
webdriver,
}),
}).then(subtests => ({
subfolder,
subtests,
}))
)
);

return subtests_for_subfolders
.map(({ subfolder, subtests }) => ({
name: `${virtual_folder}/${subfolder}`,
subtests,
}))
.filter(t => t.subtests.length > 0);
}

buildTests({
async buildTests({
tests,
folder,
virtual_folder,
Expand Down Expand Up @@ -313,22 +329,23 @@ class Series {

// Tests
for (let { name, path } of list) {
// Get a test.
let single_test_module = null;
try {
single_test_module = this.loadTest(path);
single_test_module = await this.loadTest(path);
} catch (e) {
console.error(e);
throw new Error(`Failed to load test file: ${path}`);
throw new Error(`Failed to load test: ${path}`);
}

let test = single_test_module.test;
const test = single_test_module.test;
if (!test) {
throw new Error(`No test function to was found in ${path}`);
throw new Error(`No test was found in ${path}`);
}

// If request service is running, then notify it of a test start.
let test_wrap = () =>
Promise.resolve(servicer.ontest(name)).then(() => test());
// A function to notify the servicer the test is about to start and then
// to invoke the test.
const test_wrap = () => Promise.resolve(servicer.ontest(name)).then(test);

let failures_info = Series.failuresInfo({
failures: expected_failures,
Expand Down Expand Up @@ -637,11 +654,11 @@ class Series {
}

loadTestMeta(folder) {
return require(path.join(root_dir, `${folder}/meta.js`));
return import(path.join(root_dir, `${folder}/meta.js`));
}

loadTest(fn) {
return require(path.join(root_dir, fn));
return import(path.join(root_dir, fn));
}

getTestFileList(folder) {
Expand Down
5 changes: 5 additions & 0 deletions index.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { createRequire } from 'module';
const require = createRequire(import.meta.url);

const all_exports = require('./index.js');
export default all_exports;
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
{
"name": "@camperaid/watest",
"version": "2.0.3",
"version": "2.0.4",
"description": "Web Application Testsuite",
"engines": {
"node": ">=14.15.1"
},
"main": "index.js",
"module": "index.mjs",
"bin": {
"watest": "./bin/watest.js"
},
Expand Down
6 changes: 5 additions & 1 deletion tests/series/build/t_adjust_names.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,11 @@ module.exports.test = async () => {
};

const series = new MockSeries([], { ts });
const tests = series.build({ patterns: [], folder: 'unit', virtual_folder: 'unit' });
const tests = await series.build({
patterns: [],
folder: 'unit',
virtual_folder: 'unit',
});
series.adjustTestNames(tests, '2');
series.shutdown();

Expand Down
2 changes: 1 addition & 1 deletion tests/series/build/t_adjust_names_webdriver.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ module.exports.test = async () => {
};

const series = new MockSeries([], { ts, webdrivers: ['chrome', 'firefox'] });
const tests = series.build({
const tests = await series.build({
patterns: [
{
path: 'tests/webdriver/end-to-end/sharing/t_shared_editing.js',
Expand Down
2 changes: 1 addition & 1 deletion tests/series/build/t_mixed.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ module.exports.test = async () => {
};

const series = new MockSeries([], { ts, webdrivers: ['chrome', 'firefox'] });
const tests = series.build({
const tests = await series.build({
patterns: [],
folder: 'tests',
virtual_folder: 'mac',
Expand Down
6 changes: 5 additions & 1 deletion tests/series/build/t_nested.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,11 @@ module.exports.test = async () => {
};

const series = new MockSeries('', { ts });
const tests = series.build({ patterns: [], folder: 'unit', virtual_folder: 'unit' });
const tests = await series.build({
patterns: [],
folder: 'unit',
virtual_folder: 'unit',
});
series.shutdown();

is(
Expand Down
2 changes: 1 addition & 1 deletion tests/series/build/t_patterns_webdriver.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ module.exports.test = async () => {
};

const series = new MockSeries([], { ts, webdrivers: ['chrome', 'firefox'] });
const tests = series.build({
const tests = await series.build({
patterns: [
{
path: 'e2e/t_testo.js',
Expand Down
6 changes: 5 additions & 1 deletion tests/series/build/t_webdriver.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ module.exports.test = async () => {
};

const series = new MockSeries('', { ts, webdrivers: ['chrome', 'firefox'] });
const tests = series.build({ patterns: [], folder: 'e2e', virtual_folder: 'e2e' });
const tests = await series.build({
patterns: [],
folder: 'e2e',
virtual_folder: 'e2e',
});
series.shutdown();

is(
Expand Down
6 changes: 5 additions & 1 deletion tests/series/build/t_webdriver_nested.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,11 @@ module.exports.test = async () => {
};

const series = new MockSeries('', { ts, webdrivers: ['chrome', 'firefox'] });
const tests = series.build({ patterns: [], folder: 'e2e', virtual_folder: 'e2e' });
const tests = await series.build({
patterns: [],
folder: 'e2e',
virtual_folder: 'e2e',
});
series.shutdown();

is(
Expand Down
2 changes: 1 addition & 1 deletion tests/series/build/t_webdriver_services.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ module.exports.test = async () => {
};

const series = new MockSeries('', { ts, webdrivers: ['chrome', 'firefox'] });
const tests = series.build({
const tests = await series.build({
patterns: [],
folder: 'e2e',
virtual_folder: 'e2e',
Expand Down

0 comments on commit 9eb2892

Please sign in to comment.