Web Platform Tests

September 17, 2026 · View on GitHub

Runs a subset of web-platform-tests against @whatwg-node/node-fetch. The runner is adapted from undici (Deno MIT license).

The WPT checkout is a shallow + sparse submodule: only the dirs listed in sparse-paths.txt are materialized (docs, fetch, xhr, mimesniff, plus serve/manifest helpers).

Prerequisites

  • Python 3
  • Git submodule at test/web-platform-tests/wpt
  • Hosts entries for web-platform.test (setup can configure them)
git submodule update --init --depth 1 -- test/web-platform-tests/wpt
npm run build
npm run test:wpt:setup

test:wpt:setup re-applies the sparse checkout automatically.

Run

npm run test:wpt

Subset / single file:

node test/web-platform-tests/wpt-runner.mjs run /fetch/api/headers
node test/web-platform-tests/wpt-runner.mjs run /fetch/api/headers/headers-basic.any.html

Docker (no local /etc/hosts / python3-venv needed)

docker run --rm \
  -v "$PWD":/work -w /work \
  -e CI=true \
  node:26-bookworm \
  bash -c 'apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get install -y -qq python3 python3-venv >/dev/null &&
    (python3 test/web-platform-tests/wpt/wpt make-hosts-file >> /etc/hosts) &&
    npm ci && npm run build && npm run test:wpt'

Syncing WPT

Cron (recommended): .github/workflows/update-wpt.yml runs weekly (Monday 06:00 UTC) and on workflow_dispatch. A read-only job syncs WPT and refreshes expectation.json; a separate write-only job opens the PR (chore/update-wpt). Merge stays manual so you can review drift.

Local / on demand:

npm run test:wpt:sync # submodule --remote + sparse + manifest
npm run test:wpt      # refresh expectation.json (success-bit baseline)
git add test/web-platform-tests/wpt test/web-platform-tests/expectation.json
git commit -m "test: bump WPT"

CI test workflow pins the committed submodule SHA; it does not auto-bump on every PR.

The WPT CI gate (.github/workflows/wpt.yml) is expectation.json success-bit drift, not “all tests pass”.