Skip to content

Commit dcccf6d

Browse files
authored
Merge pull request #3099 from modernweb-dev/migrate/test-runner-integration-node-test
test(test-runner): migrate integration tests from mocha/chai to node:test
2 parents 02b7ae8 + 48d4ef9 commit dcccf6d

25 files changed

Lines changed: 987 additions & 375 deletions

File tree

.github/workflows/verify-node.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ jobs:
5454
- name: Install Playwright dependencies
5555
run: npx playwright install --with-deps
5656

57+
- name: Install Selenium dependencies
58+
run: npx selenium-standalone install
59+
5760
- name: Test
5861
run: npm run test:node
5962
env:
@@ -96,6 +99,9 @@ jobs:
9699
- name: Install Playwright dependencies
97100
run: npx playwright install --with-deps
98101

102+
- name: Install Selenium dependencies
103+
run: npx selenium-standalone install
104+
99105
- name: Test
100106
run: npm run test:node
101107
env:

integration/test-runner/index.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { BrowserLauncher, TestRunnerCoreConfig } from '@web/test-runner-core';
2-
import { runBasicTest } from './tests/basic/runBasicTest.js';
3-
import { runConfigGroupsTest } from './tests/config-groups/runConfigGroupsTest.js';
4-
import { runParallelTest } from './tests/parallel/runParallelTest.js';
5-
import { runTestFailureTest } from './tests/test-failure/runTestFailureTest.js';
6-
import { runLocationChangeTest } from './tests/location-change/runLocationChangeTest.js';
7-
import { runFocusTest } from './tests/focus/runFocusTest.js';
8-
import { runManyTests } from './tests/many/runManyTests.js';
1+
import type { BrowserLauncher, TestRunnerCoreConfig } from '@web/test-runner-core';
2+
import { runBasicTest } from './tests/basic/runBasicTest.ts';
3+
import { runConfigGroupsTest } from './tests/config-groups/runConfigGroupsTest.ts';
4+
import { runParallelTest } from './tests/parallel/runParallelTest.ts';
5+
import { runTestFailureTest } from './tests/test-failure/runTestFailureTest.ts';
6+
import { runLocationChangeTest } from './tests/location-change/runLocationChangeTest.ts';
7+
import { runFocusTest } from './tests/focus/runFocusTest.ts';
8+
import { runManyTests } from './tests/many/runManyTests.ts';
99

1010
export interface Tests {
1111
basic: boolean;

integration/test-runner/package.json

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,7 @@
1515
"author": "modern-web",
1616
"homepage": "https://github.com/modernweb-dev/web/tree/master/packages/test-runner-integration-tests",
1717
"main": "index.js",
18-
"scripts": {
19-
"test": "mocha test/**/*.test.ts --require ts-node/register --reporter dot",
20-
"test:watch": "mocha test/**/*.test.ts --require ts-node/register --watch --watch-files src,test --reporter dot"
21-
},
18+
"scripts": {},
2219
"dependencies": {
2320
"@web/dev-server-legacy": "^2.1.0",
2421
"@web/test-runner-core": "^0.13.4"

integration/test-runner/tests/basic/runBasicTest.ts

Lines changed: 54 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import { BrowserLauncher, TestRunnerCoreConfig, TestSession } from '@web/test-runner-core';
1+
import assert from 'node:assert/strict';
2+
import { describe, before, it } from 'node:test';
3+
import type { BrowserLauncher, TestRunnerCoreConfig, TestSession } from '@web/test-runner-core';
24
import { runTests } from '@web/test-runner-core/test-helpers';
35
import { legacyPlugin } from '@web/dev-server-legacy';
46
import { resolve } from 'path';
5-
import { expect } from 'chai';
67

78
export function runBasicTest(
89
config: Partial<TestRunnerCoreConfig> & { browsers: BrowserLauncher[] },
@@ -14,78 +15,93 @@ export function runBasicTest(
1415
before(async () => {
1516
const result = await runTests({
1617
...config,
17-
files: [...(config.files ?? []), resolve(__dirname, 'browser-tests', '*.test.js')],
18+
files: [
19+
...(config.files ?? []),
20+
resolve(import.meta.dirname, 'browser-tests', '*.test.js'),
21+
],
1822
plugins: [...(config.plugins ?? []), legacyPlugin()],
1923
});
2024
allSessions = result.sessions;
2125

22-
expect(allSessions.every(s => s.passed)).to.equal(true, 'All sessions should have passed');
26+
assert.equal(
27+
allSessions.every(s => s.passed),
28+
true,
29+
'All sessions should have passed',
30+
);
2331
});
2432

2533
it('passes basic test', () => {
2634
const sessions = allSessions.filter(s => s.testFile.endsWith('basic.test.js'));
27-
expect(sessions.length === browserCount).to.equal(
28-
true,
29-
'Each browser should run basic.test.js',
30-
);
35+
assert.equal(sessions.length === browserCount, true, 'Each browser should run basic.test.js');
3136
for (const session of sessions) {
32-
expect(session.testResults!.tests.length).to.equal(0);
33-
expect(session.testResults!.suites.length).to.equal(1);
34-
expect(session.testResults!.suites[0].tests.length).to.equal(1);
35-
expect(session.testResults!.suites[0].tests.map(t => t.name)).to.eql(['works']);
37+
assert.equal(session.testResults!.tests.length, 0);
38+
assert.equal(session.testResults!.suites.length, 1);
39+
assert.equal(session.testResults!.suites[0].tests.length, 1);
40+
assert.deepEqual(
41+
session.testResults!.suites[0].tests.map(t => t.name),
42+
['works'],
43+
);
3644
}
3745
});
3846

3947
it('passes js-syntax test', () => {
4048
const sessions = allSessions.filter(s => s.testFile.endsWith('js-syntax.test.js'));
41-
expect(sessions.length === browserCount).to.equal(
49+
assert.equal(
50+
sessions.length === browserCount,
4251
true,
4352
'Each browser should run js-syntax.test.js',
4453
);
4554
for (const session of sessions) {
46-
expect(session.testResults!.tests.map(t => t.name)).to.eql([
47-
'supports object spread',
48-
'supports async functions',
49-
'supports exponentiation',
50-
'supports classes',
51-
'supports template literals',
52-
'supports optional chaining',
53-
'supports nullish coalescing',
54-
]);
55+
assert.deepEqual(
56+
session.testResults!.tests.map(t => t.name),
57+
[
58+
'supports object spread',
59+
'supports async functions',
60+
'supports exponentiation',
61+
'supports classes',
62+
'supports template literals',
63+
'supports optional chaining',
64+
'supports nullish coalescing',
65+
],
66+
);
5567
}
5668
});
5769

5870
it('passes module-features test', () => {
5971
const sessions = allSessions.filter(s => s.testFile.endsWith('module-features.test.js'));
60-
expect(sessions.length === browserCount).to.equal(
72+
assert.equal(
73+
sessions.length === browserCount,
6174
true,
6275
'Each browser should run module-features.test.js',
6376
);
6477
for (const session of sessions) {
65-
expect(session.testResults!.tests.map(t => t.name)).to.eql([
66-
'supports static imports',
67-
'supports dynamic imports',
68-
'supports import meta',
69-
]);
78+
assert.deepEqual(
79+
session.testResults!.tests.map(t => t.name),
80+
['supports static imports', 'supports dynamic imports', 'supports import meta'],
81+
);
7082
}
7183
});
7284

7385
it('passes timers test', () => {
7486
const sessions = allSessions.filter(s => s.testFile.endsWith('timers.test.js'));
75-
expect(sessions.length === browserCount).to.equal(
87+
assert.equal(
88+
sessions.length === browserCount,
7689
true,
7790
'Each browser should run timers.test.js',
7891
);
7992
for (const session of sessions) {
80-
expect(session.testResults!.tests.length).to.equal(0);
81-
expect(session.testResults!.suites.length).to.equal(1);
82-
expect(session.testResults!.suites[0].tests.map(t => t.name)).to.eql([
83-
'can call setTimeout',
84-
'can cancel setTimeout',
85-
'can call and cancel setInterval',
86-
'can call requestAnimationFrame',
87-
'can cancel requestAnimationFrame',
88-
]);
93+
assert.equal(session.testResults!.tests.length, 0);
94+
assert.equal(session.testResults!.suites.length, 1);
95+
assert.deepEqual(
96+
session.testResults!.suites[0].tests.map(t => t.name),
97+
[
98+
'can call setTimeout',
99+
'can cancel setTimeout',
100+
'can call and cancel setInterval',
101+
'can call requestAnimationFrame',
102+
'can cancel requestAnimationFrame',
103+
],
104+
);
89105
}
90106
});
91107
});

integration/test-runner/tests/config-groups/runConfigGroupsTest.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import {
1+
import assert from 'node:assert/strict';
2+
import { describe, it } from 'node:test';
3+
import type {
24
BrowserLauncher,
35
TestRunnerCoreConfig,
46
TestRunnerGroupConfig,
57
} from '@web/test-runner-core';
68
import { runTests } from '@web/test-runner-core/test-helpers';
79
import { legacyPlugin } from '@web/dev-server-legacy';
810
import { resolve } from 'path';
9-
import { expect } from 'chai';
1011

1112
export function runConfigGroupsTest(
1213
config: Partial<TestRunnerCoreConfig> & { browsers: BrowserLauncher[] },
@@ -18,13 +19,13 @@ export function runConfigGroupsTest(
1819
name: 'a',
1920
testRunnerHtml: path =>
2021
`<html><body><script>window.__group__ = "a";</script><script type="module" src=${path}></script></body></html>`,
21-
files: [resolve(__dirname, 'browser-tests', 'test-runner-html-a.test.js')],
22+
files: [resolve(import.meta.dirname, 'browser-tests', 'test-runner-html-a.test.js')],
2223
},
2324
{
2425
name: 'b',
2526
testRunnerHtml: path =>
2627
`<html><body><script>window.__group__ = "b";</script><script type="module" src=${path}></script></body></html>`,
27-
files: [resolve(__dirname, 'browser-tests', 'test-runner-html-b.test.js')],
28+
files: [resolve(import.meta.dirname, 'browser-tests', 'test-runner-html-b.test.js')],
2829
},
2930
];
3031
const result = await runTests(
@@ -35,7 +36,8 @@ export function runConfigGroupsTest(
3536
groupConfigs,
3637
);
3738

38-
expect(result.sessions.every(s => s.passed)).to.equal(
39+
assert.equal(
40+
result.sessions.every(s => s.passed),
3941
true,
4042
'All sessions should have passed',
4143
);
Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import { BrowserLauncher, TestRunnerCoreConfig, TestSession } from '@web/test-runner-core';
1+
import assert from 'node:assert/strict';
2+
import { describe, before, it } from 'node:test';
3+
import type { BrowserLauncher, TestRunnerCoreConfig, TestSession } from '@web/test-runner-core';
24
import { runTests } from '@web/test-runner-core/test-helpers';
35
import { legacyPlugin } from '@web/dev-server-legacy';
46
import { resolve } from 'path';
5-
import { expect } from 'chai';
67

78
export function runFocusTest(
89
config: Partial<TestRunnerCoreConfig> & { browsers: BrowserLauncher[] },
@@ -13,16 +14,22 @@ export function runFocusTest(
1314
before(async () => {
1415
const result = await runTests({
1516
...config,
16-
// 2 means some are executed concurrently, and some sequentially
1717
concurrency: 2,
18-
files: [...(config.files ?? []), resolve(__dirname, 'browser-tests', '*.test.js')],
18+
files: [
19+
...(config.files ?? []),
20+
resolve(import.meta.dirname, 'browser-tests', '*.test.js'),
21+
],
1922
plugins: [...(config.plugins ?? []), legacyPlugin()],
2023
});
2124
allSessions = result.sessions;
2225
});
2326

2427
it.skip('can run tests with focus, concurrently and sequentially', () => {
25-
expect(allSessions.every(s => s.passed)).to.equal(true, 'All sessions should have passed');
28+
assert.equal(
29+
allSessions.every(s => s.passed),
30+
true,
31+
'All sessions should have passed',
32+
);
2633
});
2734
});
2835
}

integration/test-runner/tests/location-change/runLocationChangeTest.ts

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import { BrowserLauncher, TestRunnerCoreConfig, TestSession } from '@web/test-runner-core';
1+
import assert from 'node:assert/strict';
2+
import { describe, before, it } from 'node:test';
3+
import type { BrowserLauncher, TestRunnerCoreConfig, TestSession } from '@web/test-runner-core';
24
import { runTests } from '@web/test-runner-core/test-helpers';
5+
import { expectIncludes } from '@web/dev-server-core/test-helpers';
36
import { legacyPlugin } from '@web/dev-server-legacy';
47
import { resolve } from 'path';
5-
import { expect } from 'chai';
68

79
export function runLocationChangeTest(
810
config: Partial<TestRunnerCoreConfig> & { browsers: BrowserLauncher[] },
@@ -15,40 +17,49 @@ export function runLocationChangeTest(
1517
const result = await runTests(
1618
{
1719
...config,
18-
files: [...(config.files ?? []), resolve(__dirname, 'browser-tests', '*.test.js')],
20+
files: [
21+
...(config.files ?? []),
22+
resolve(import.meta.dirname, 'browser-tests', '*.test.js'),
23+
],
1924
plugins: [...(config.plugins ?? []), legacyPlugin()],
2025
},
2126
undefined,
2227
{ allowFailure: true, reportErrors: false },
2328
);
2429
allSessions = result.sessions;
2530

26-
expect(allSessions.every(s => s.passed)).to.equal(false, 'All sessions should have failed');
31+
assert.equal(
32+
allSessions.every(s => s.passed),
33+
false,
34+
'All sessions should have failed',
35+
);
2736
});
2837

2938
it('handles tests which assign to window.location.href', () => {
3039
const sessions = allSessions.filter(s => s.testFile.endsWith('fail-location-href.test.js'));
31-
expect(sessions.length === browserCount).to.equal(true);
40+
assert.equal(sessions.length === browserCount, true);
3241
for (const session of sessions) {
33-
expect(session.testResults).to.equal(undefined);
34-
expect(session.logs).to.eql([]);
35-
expect(session.errors.length).to.equal(1);
36-
expect(session.errors[0].message).to.include(
42+
assert.equal(session.testResults, undefined);
43+
assert.deepEqual(session.logs, []);
44+
assert.equal(session.errors.length, 1);
45+
expectIncludes(
46+
session.errors[0].message,
3747
'Tests were interrupted because the page navigated to',
3848
);
39-
expect(session.errors[0].message).to.include(
49+
expectIncludes(
50+
session.errors[0].message,
4051
'This can happen when clicking a link, submitting a form or interacting with window.location.',
4152
);
4253
}
4354
});
4455

4556
it('handles tests which call window.location.reload()', () => {
4657
const sessions = allSessions.filter(s => s.testFile.endsWith('fail-location-reload.test.js'));
47-
expect(sessions.length === browserCount).to.equal(true);
58+
assert.equal(sessions.length === browserCount, true);
4859
for (const session of sessions) {
49-
expect(session.testResults).to.equal(undefined);
50-
expect(session.logs).to.eql([]);
51-
expect(session.errors).to.eql([
60+
assert.equal(session.testResults, undefined);
61+
assert.deepEqual(session.logs, []);
62+
assert.deepEqual(session.errors, [
5263
{
5364
message:
5465
'Tests were interrupted because the page was reloaded. This can happen when clicking a link, submitting a form or interacting with window.location.',
@@ -61,16 +72,18 @@ export function runLocationChangeTest(
6172
const sessions = allSessions.filter(s =>
6273
s.testFile.endsWith('fail-location-replace.test.js'),
6374
);
64-
expect(sessions.length === browserCount).to.equal(true);
75+
assert.equal(sessions.length === browserCount, true);
6576
for (const session of sessions) {
66-
expect(session.testResults).to.equal(undefined);
67-
expect(session.logs).to.eql([]);
68-
expect(session.errors.length).to.equal(1);
69-
expect(session.errors[0].message).to.include(
77+
assert.equal(session.testResults, undefined);
78+
assert.deepEqual(session.logs, []);
79+
assert.equal(session.errors.length, 1);
80+
expectIncludes(
81+
session.errors[0].message,
7082
'Tests were interrupted because the page navigated to',
7183
);
72-
expect(session.errors[0].message).to.include('/new-page/');
73-
expect(session.errors[0].message).to.include(
84+
expectIncludes(session.errors[0].message, '/new-page/');
85+
expectIncludes(
86+
session.errors[0].message,
7487
'This can happen when clicking a link, submitting a form or interacting with window.location.',
7588
);
7689
}

integration/test-runner/tests/many/runManyTests.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { BrowserLauncher, TestRunnerCoreConfig } from '@web/test-runner-core';
1+
import { describe, it } from 'node:test';
2+
import type { BrowserLauncher, TestRunnerCoreConfig } from '@web/test-runner-core';
23
import { runTests } from '@web/test-runner-core/test-helpers';
34
import { legacyPlugin } from '@web/dev-server-legacy';
45
import { resolve } from 'path';
@@ -11,7 +12,10 @@ export function runManyTests(
1112
await Promise.all([
1213
runTests({
1314
...config,
14-
files: [...(config.files ?? []), resolve(__dirname, 'browser-tests', '*.test.js')],
15+
files: [
16+
...(config.files ?? []),
17+
resolve(import.meta.dirname, 'browser-tests', '*.test.js'),
18+
],
1519
plugins: [...(config.plugins ?? []), legacyPlugin()],
1620
}),
1721
]);

0 commit comments

Comments
 (0)