Skip to content
Open
6 changes: 6 additions & 0 deletions .github/workflows/verify-node.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ jobs:
- name: Install Playwright dependencies
run: npx playwright install --with-deps

- name: Install Selenium dependencies
run: npx selenium-standalone install

- name: Test
run: npm run test:node
env:
Expand Down Expand Up @@ -96,6 +99,9 @@ jobs:
- name: Install Playwright dependencies
run: npx playwright install --with-deps

- name: Install Selenium dependencies
run: npx selenium-standalone install

- name: Test
run: npm run test:node
env:
Expand Down
16 changes: 8 additions & 8 deletions integration/test-runner/index.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { BrowserLauncher, TestRunnerCoreConfig } from '@web/test-runner-core';
import { runBasicTest } from './tests/basic/runBasicTest.js';
import { runConfigGroupsTest } from './tests/config-groups/runConfigGroupsTest.js';
import { runParallelTest } from './tests/parallel/runParallelTest.js';
import { runTestFailureTest } from './tests/test-failure/runTestFailureTest.js';
import { runLocationChangeTest } from './tests/location-change/runLocationChangeTest.js';
import { runFocusTest } from './tests/focus/runFocusTest.js';
import { runManyTests } from './tests/many/runManyTests.js';
import type { BrowserLauncher, TestRunnerCoreConfig } from '@web/test-runner-core';
import { runBasicTest } from './tests/basic/runBasicTest.ts';
import { runConfigGroupsTest } from './tests/config-groups/runConfigGroupsTest.ts';
import { runParallelTest } from './tests/parallel/runParallelTest.ts';
import { runTestFailureTest } from './tests/test-failure/runTestFailureTest.ts';
import { runLocationChangeTest } from './tests/location-change/runLocationChangeTest.ts';
import { runFocusTest } from './tests/focus/runFocusTest.ts';
import { runManyTests } from './tests/many/runManyTests.ts';

export interface Tests {
basic: boolean;
Expand Down
5 changes: 1 addition & 4 deletions integration/test-runner/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,7 @@
"author": "modern-web",
"homepage": "https://github.com/modernweb-dev/web/tree/master/packages/test-runner-integration-tests",
"main": "index.js",
"scripts": {
"test": "mocha test/**/*.test.ts --require ts-node/register --reporter dot",
"test:watch": "mocha test/**/*.test.ts --require ts-node/register --watch --watch-files src,test --reporter dot"
},
"scripts": {},
"dependencies": {
"@web/dev-server-legacy": "^2.1.0",
"@web/test-runner-core": "^0.13.4"
Expand Down
92 changes: 54 additions & 38 deletions integration/test-runner/tests/basic/runBasicTest.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { BrowserLauncher, TestRunnerCoreConfig, TestSession } from '@web/test-runner-core';
import assert from 'node:assert/strict';
import { describe, before, it } from 'node:test';
import type { BrowserLauncher, TestRunnerCoreConfig, TestSession } from '@web/test-runner-core';
import { runTests } from '@web/test-runner-core/test-helpers';
import { legacyPlugin } from '@web/dev-server-legacy';
import { resolve } from 'path';
import { expect } from 'chai';

export function runBasicTest(
config: Partial<TestRunnerCoreConfig> & { browsers: BrowserLauncher[] },
Expand All @@ -14,78 +15,93 @@ export function runBasicTest(
before(async () => {
const result = await runTests({
...config,
files: [...(config.files ?? []), resolve(__dirname, 'browser-tests', '*.test.js')],
files: [
...(config.files ?? []),
resolve(import.meta.dirname, 'browser-tests', '*.test.js'),
],
plugins: [...(config.plugins ?? []), legacyPlugin()],
});
allSessions = result.sessions;

expect(allSessions.every(s => s.passed)).to.equal(true, 'All sessions should have passed');
assert.equal(
allSessions.every(s => s.passed),
true,
'All sessions should have passed',
);
});

it('passes basic test', () => {
const sessions = allSessions.filter(s => s.testFile.endsWith('basic.test.js'));
expect(sessions.length === browserCount).to.equal(
true,
'Each browser should run basic.test.js',
);
assert.equal(sessions.length === browserCount, true, 'Each browser should run basic.test.js');
for (const session of sessions) {
expect(session.testResults!.tests.length).to.equal(0);
expect(session.testResults!.suites.length).to.equal(1);
expect(session.testResults!.suites[0].tests.length).to.equal(1);
expect(session.testResults!.suites[0].tests.map(t => t.name)).to.eql(['works']);
assert.equal(session.testResults!.tests.length, 0);
assert.equal(session.testResults!.suites.length, 1);
assert.equal(session.testResults!.suites[0].tests.length, 1);
assert.deepEqual(
session.testResults!.suites[0].tests.map(t => t.name),
['works'],
);
}
});

it('passes js-syntax test', () => {
const sessions = allSessions.filter(s => s.testFile.endsWith('js-syntax.test.js'));
expect(sessions.length === browserCount).to.equal(
assert.equal(
sessions.length === browserCount,
true,
'Each browser should run js-syntax.test.js',
);
for (const session of sessions) {
expect(session.testResults!.tests.map(t => t.name)).to.eql([
'supports object spread',
'supports async functions',
'supports exponentiation',
'supports classes',
'supports template literals',
'supports optional chaining',
'supports nullish coalescing',
]);
assert.deepEqual(
session.testResults!.tests.map(t => t.name),
[
'supports object spread',
'supports async functions',
'supports exponentiation',
'supports classes',
'supports template literals',
'supports optional chaining',
'supports nullish coalescing',
],
);
}
});

it('passes module-features test', () => {
const sessions = allSessions.filter(s => s.testFile.endsWith('module-features.test.js'));
expect(sessions.length === browserCount).to.equal(
assert.equal(
sessions.length === browserCount,
true,
'Each browser should run module-features.test.js',
);
for (const session of sessions) {
expect(session.testResults!.tests.map(t => t.name)).to.eql([
'supports static imports',
'supports dynamic imports',
'supports import meta',
]);
assert.deepEqual(
session.testResults!.tests.map(t => t.name),
['supports static imports', 'supports dynamic imports', 'supports import meta'],
);
}
});

it('passes timers test', () => {
const sessions = allSessions.filter(s => s.testFile.endsWith('timers.test.js'));
expect(sessions.length === browserCount).to.equal(
assert.equal(
sessions.length === browserCount,
true,
'Each browser should run timers.test.js',
);
for (const session of sessions) {
expect(session.testResults!.tests.length).to.equal(0);
expect(session.testResults!.suites.length).to.equal(1);
expect(session.testResults!.suites[0].tests.map(t => t.name)).to.eql([
'can call setTimeout',
'can cancel setTimeout',
'can call and cancel setInterval',
'can call requestAnimationFrame',
'can cancel requestAnimationFrame',
]);
assert.equal(session.testResults!.tests.length, 0);
assert.equal(session.testResults!.suites.length, 1);
assert.deepEqual(
session.testResults!.suites[0].tests.map(t => t.name),
[
'can call setTimeout',
'can cancel setTimeout',
'can call and cancel setInterval',
'can call requestAnimationFrame',
'can cancel requestAnimationFrame',
],
);
}
});
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import {
import assert from 'node:assert/strict';
import { describe, it } from 'node:test';
import type {
BrowserLauncher,
TestRunnerCoreConfig,
TestRunnerGroupConfig,
} from '@web/test-runner-core';
import { runTests } from '@web/test-runner-core/test-helpers';
import { legacyPlugin } from '@web/dev-server-legacy';
import { resolve } from 'path';
import { expect } from 'chai';

export function runConfigGroupsTest(
config: Partial<TestRunnerCoreConfig> & { browsers: BrowserLauncher[] },
Expand All @@ -18,13 +19,13 @@ export function runConfigGroupsTest(
name: 'a',
testRunnerHtml: path =>
`<html><body><script>window.__group__ = "a";</script><script type="module" src=${path}></script></body></html>`,
files: [resolve(__dirname, 'browser-tests', 'test-runner-html-a.test.js')],
files: [resolve(import.meta.dirname, 'browser-tests', 'test-runner-html-a.test.js')],
},
{
name: 'b',
testRunnerHtml: path =>
`<html><body><script>window.__group__ = "b";</script><script type="module" src=${path}></script></body></html>`,
files: [resolve(__dirname, 'browser-tests', 'test-runner-html-b.test.js')],
files: [resolve(import.meta.dirname, 'browser-tests', 'test-runner-html-b.test.js')],
},
];
const result = await runTests(
Expand All @@ -35,7 +36,8 @@ export function runConfigGroupsTest(
groupConfigs,
);

expect(result.sessions.every(s => s.passed)).to.equal(
assert.equal(
result.sessions.every(s => s.passed),
true,
'All sessions should have passed',
);
Expand Down
17 changes: 12 additions & 5 deletions integration/test-runner/tests/focus/runFocusTest.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { BrowserLauncher, TestRunnerCoreConfig, TestSession } from '@web/test-runner-core';
import assert from 'node:assert/strict';
import { describe, before, it } from 'node:test';
import type { BrowserLauncher, TestRunnerCoreConfig, TestSession } from '@web/test-runner-core';
import { runTests } from '@web/test-runner-core/test-helpers';
import { legacyPlugin } from '@web/dev-server-legacy';
import { resolve } from 'path';
import { expect } from 'chai';

export function runFocusTest(
config: Partial<TestRunnerCoreConfig> & { browsers: BrowserLauncher[] },
Expand All @@ -13,16 +14,22 @@ export function runFocusTest(
before(async () => {
const result = await runTests({
...config,
// 2 means some are executed concurrently, and some sequentially
concurrency: 2,
files: [...(config.files ?? []), resolve(__dirname, 'browser-tests', '*.test.js')],
files: [
...(config.files ?? []),
resolve(import.meta.dirname, 'browser-tests', '*.test.js'),
],
plugins: [...(config.plugins ?? []), legacyPlugin()],
});
allSessions = result.sessions;
});

it.skip('can run tests with focus, concurrently and sequentially', () => {
expect(allSessions.every(s => s.passed)).to.equal(true, 'All sessions should have passed');
assert.equal(
allSessions.every(s => s.passed),
true,
'All sessions should have passed',
);
});
});
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { BrowserLauncher, TestRunnerCoreConfig, TestSession } from '@web/test-runner-core';
import assert from 'node:assert/strict';
import { describe, before, it } from 'node:test';
import type { BrowserLauncher, TestRunnerCoreConfig, TestSession } from '@web/test-runner-core';
import { runTests } from '@web/test-runner-core/test-helpers';
import { expectIncludes } from '@web/dev-server-core/test-helpers';
import { legacyPlugin } from '@web/dev-server-legacy';
import { resolve } from 'path';
import { expect } from 'chai';

export function runLocationChangeTest(
config: Partial<TestRunnerCoreConfig> & { browsers: BrowserLauncher[] },
Expand All @@ -15,40 +17,49 @@ export function runLocationChangeTest(
const result = await runTests(
{
...config,
files: [...(config.files ?? []), resolve(__dirname, 'browser-tests', '*.test.js')],
files: [
...(config.files ?? []),
resolve(import.meta.dirname, 'browser-tests', '*.test.js'),
],
plugins: [...(config.plugins ?? []), legacyPlugin()],
},
undefined,
{ allowFailure: true, reportErrors: false },
);
allSessions = result.sessions;

expect(allSessions.every(s => s.passed)).to.equal(false, 'All sessions should have failed');
assert.equal(
allSessions.every(s => s.passed),
false,
'All sessions should have failed',
);
});

it('handles tests which assign to window.location.href', () => {
const sessions = allSessions.filter(s => s.testFile.endsWith('fail-location-href.test.js'));
expect(sessions.length === browserCount).to.equal(true);
assert.equal(sessions.length === browserCount, true);
for (const session of sessions) {
expect(session.testResults).to.equal(undefined);
expect(session.logs).to.eql([]);
expect(session.errors.length).to.equal(1);
expect(session.errors[0].message).to.include(
assert.equal(session.testResults, undefined);
assert.deepEqual(session.logs, []);
assert.equal(session.errors.length, 1);
expectIncludes(
session.errors[0].message,
'Tests were interrupted because the page navigated to',
);
expect(session.errors[0].message).to.include(
expectIncludes(
session.errors[0].message,
'This can happen when clicking a link, submitting a form or interacting with window.location.',
);
}
});

it('handles tests which call window.location.reload()', () => {
const sessions = allSessions.filter(s => s.testFile.endsWith('fail-location-reload.test.js'));
expect(sessions.length === browserCount).to.equal(true);
assert.equal(sessions.length === browserCount, true);
for (const session of sessions) {
expect(session.testResults).to.equal(undefined);
expect(session.logs).to.eql([]);
expect(session.errors).to.eql([
assert.equal(session.testResults, undefined);
assert.deepEqual(session.logs, []);
assert.deepEqual(session.errors, [
{
message:
'Tests were interrupted because the page was reloaded. This can happen when clicking a link, submitting a form or interacting with window.location.',
Expand All @@ -61,16 +72,18 @@ export function runLocationChangeTest(
const sessions = allSessions.filter(s =>
s.testFile.endsWith('fail-location-replace.test.js'),
);
expect(sessions.length === browserCount).to.equal(true);
assert.equal(sessions.length === browserCount, true);
for (const session of sessions) {
expect(session.testResults).to.equal(undefined);
expect(session.logs).to.eql([]);
expect(session.errors.length).to.equal(1);
expect(session.errors[0].message).to.include(
assert.equal(session.testResults, undefined);
assert.deepEqual(session.logs, []);
assert.equal(session.errors.length, 1);
expectIncludes(
session.errors[0].message,
'Tests were interrupted because the page navigated to',
);
expect(session.errors[0].message).to.include('/new-page/');
expect(session.errors[0].message).to.include(
expectIncludes(session.errors[0].message, '/new-page/');
expectIncludes(
session.errors[0].message,
'This can happen when clicking a link, submitting a form or interacting with window.location.',
);
}
Expand Down
8 changes: 6 additions & 2 deletions integration/test-runner/tests/many/runManyTests.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { BrowserLauncher, TestRunnerCoreConfig } from '@web/test-runner-core';
import { describe, it } from 'node:test';
import type { BrowserLauncher, TestRunnerCoreConfig } from '@web/test-runner-core';
import { runTests } from '@web/test-runner-core/test-helpers';
import { legacyPlugin } from '@web/dev-server-legacy';
import { resolve } from 'path';
Expand All @@ -11,7 +12,10 @@ export function runManyTests(
await Promise.all([
runTests({
...config,
files: [...(config.files ?? []), resolve(__dirname, 'browser-tests', '*.test.js')],
files: [
...(config.files ?? []),
resolve(import.meta.dirname, 'browser-tests', '*.test.js'),
],
plugins: [...(config.plugins ?? []), legacyPlugin()],
}),
]);
Expand Down
Loading
Loading