From 8d5a891e3f687b93d0c35a4fc0ae335e222c4a80 Mon Sep 17 00:00:00 2001 From: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> Date: Sun, 5 Jan 2025 16:27:29 +0100 Subject: [PATCH 1/2] feat(learn): add section for dynamically generating test cases --- .../en/learn/test-runner/using-test-runner.md | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/apps/site/pages/en/learn/test-runner/using-test-runner.md b/apps/site/pages/en/learn/test-runner/using-test-runner.md index 84e2657d7b953..c7df13dcbad6b 100644 --- a/apps/site/pages/en/learn/test-runner/using-test-runner.md +++ b/apps/site/pages/en/learn/test-runner/using-test-runner.md @@ -64,6 +64,40 @@ Then for each setup, create a dedicated `setup` file (ensuring the base `setup.m Each example below was taken from real-world projects; they may not be appropriate/applicable to yours, but each demonstrate general concepts that are broadly applicable. +## Dynamically generating test cases + +Some times, you may want to dynamically generate test-cases. For instance, you want to test the same thing across a bunch of files. This is possible, albeit slightly arcane. You must use `test` (you cannot use `describe`) + `await testContext.test`: + +```js +import assert from 'node:assert/strict'; +import { globSync } from 'node:fs'; +import { test } from 'node:test'; +import { fileURLToPath } from 'node:url'; + +test('Check package.jsons', { concurrency: true }, async t => { + const pjsons = await Promise.all( + globSync( + // Get all the package.json files 1-level deep within ./workspaces + // ⚠️ Passing a file URL string, like from import.meta.resolve, causes glob* to fail silently + fileURLToPath(import.meta.resolve('./workspaces/*/package.json')) + ).map(path => import(path, { with: { type: 'json' } })) + ); + + // ⚠️ `t.test`, NOT `test` + const cases = pjsons.map(pjson => + t.test(`Ensure fields are properly set: ${pjson.name}`, () => { + assert.partialDeepStrictEqual(pjson.keywords, [ + 'node.js', + 'sliced bread', + ]); + }) + ); + + // Allow the cases to run concurrently. + await Promise.allSettled(cases); +}); +``` + ## ServiceWorker tests [`ServiceWorkerGlobalScope`](https://developer.mozilla.org/docs/Web/API/ServiceWorkerGlobalScope) contains very specific APIs that don't exist in other environments, and some of its APIs are seemingly similar to others (ex `fetch`) but have augmented behaviour. You do not want these to spill into unrelated tests. From 7c0f5dec6de5d38ff4723aea4716bd9638e56209 Mon Sep 17 00:00:00 2001 From: Jacob Smith <3012099+JakobJingleheimer@users.noreply.github.com> Date: Sun, 5 Jan 2025 16:31:35 +0100 Subject: [PATCH 2/2] fixup!: adjust for prettier mangling --- apps/site/pages/en/learn/test-runner/using-test-runner.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/site/pages/en/learn/test-runner/using-test-runner.md b/apps/site/pages/en/learn/test-runner/using-test-runner.md index c7df13dcbad6b..17598c1fec588 100644 --- a/apps/site/pages/en/learn/test-runner/using-test-runner.md +++ b/apps/site/pages/en/learn/test-runner/using-test-runner.md @@ -83,8 +83,8 @@ test('Check package.jsons', { concurrency: true }, async t => { ).map(path => import(path, { with: { type: 'json' } })) ); - // ⚠️ `t.test`, NOT `test` const cases = pjsons.map(pjson => + // ⚠️ `t.test`, NOT `test` t.test(`Ensure fields are properly set: ${pjson.name}`, () => { assert.partialDeepStrictEqual(pjson.keywords, [ 'node.js',