mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 02:14:01 +00:00
Merge pull request #792 from daikaginza/fix/unit-runner-discovers-server-tests
fix(build): discover unit tests under server/, not only src/
This commit is contained in:
2 files changed
+64
-3
No files matched your search
@@ -21,9 +21,20 @@ export function assertNode24AllocationRuntime(version = process.versions.node) {
|
||||
return version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Directories this runner searches for `*.test.mjs`, in stable order.
|
||||
*
|
||||
* `server/` belongs here because provider modules own tests of their own: a
|
||||
* suite placed beside the module it covers must run, and CI's unit-test job runs
|
||||
* `npm test`, so a directory missing from this list is a suite that never runs
|
||||
* there. `unitTestRunner.test.mjs` asserts the list covers every `*.test.mjs`
|
||||
* outside dependencies, build output and dot-directories, so adding a tree
|
||||
* without adding it here fails.
|
||||
*/
|
||||
export const UNIT_TEST_ROOTS = Object.freeze(['src', 'server']);
|
||||
|
||||
/** Discover repository unit tests in stable path order. */
|
||||
export function discoverUnitTestFiles(root = process.cwd()) {
|
||||
const sourceRoot = path.join(root, 'src');
|
||||
const files = [];
|
||||
const visit = (directory) => {
|
||||
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
||||
@@ -34,7 +45,7 @@ export function discoverUnitTestFiles(root = process.cwd()) {
|
||||
}
|
||||
}
|
||||
};
|
||||
visit(sourceRoot);
|
||||
for (const testRoot of UNIT_TEST_ROOTS) visit(path.join(root, testRoot));
|
||||
return files.sort();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,40 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { readFileSync } from 'node:fs';
|
||||
import { readFileSync, readdirSync } from 'node:fs';
|
||||
import path from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import {
|
||||
ALLOCATION_TEST_FILES,
|
||||
UNIT_TEST_ROOTS,
|
||||
allocationTestArgs,
|
||||
assertNode24AllocationRuntime,
|
||||
buildUnitTestPlan,
|
||||
discoverUnitTestFiles,
|
||||
isCalibratedAllocationRuntime,
|
||||
} from '../scripts/run-unit-tests.mjs';
|
||||
|
||||
const repositoryRoot = fileURLToPath(new URL('..', import.meta.url));
|
||||
|
||||
/** Every `*.test.mjs` a contributor could add, found without consulting the runner. */
|
||||
function testFilesOnDisk(root) {
|
||||
// Build outputs and dependencies are not places a contributor writes a test,
|
||||
// and walking them would be slow enough to matter. Everything else counts.
|
||||
const skip = new Set(['node_modules', 'dist', 'build', 'public']);
|
||||
const found = [];
|
||||
const visit = (directory) => {
|
||||
for (const entry of readdirSync(directory, { withFileTypes: true })) {
|
||||
if (entry.name.startsWith('.') || skip.has(entry.name)) continue;
|
||||
const absolute = path.join(directory, entry.name);
|
||||
if (entry.isDirectory()) visit(absolute);
|
||||
else if (entry.isFile() && entry.name.endsWith('.test.mjs')) {
|
||||
found.push(path.relative(root, absolute).split(path.sep).join('/'));
|
||||
}
|
||||
}
|
||||
};
|
||||
visit(root);
|
||||
return found.sort();
|
||||
}
|
||||
|
||||
test('unit runner serializes only GC-bracketed allocation microbenchmarks', () => {
|
||||
const ordinary = [
|
||||
'src/data/manager.test.mjs',
|
||||
@@ -37,6 +63,30 @@ test('unit runner serializes only GC-bracketed allocation microbenchmarks', () =
|
||||
);
|
||||
});
|
||||
|
||||
test('the runner discovers every test file in the repository', () => {
|
||||
// CI's unit-test job runs `npm test`, which runs exactly what this function
|
||||
// returns. A `*.test.mjs` outside the searched roots therefore never runs
|
||||
// there, while still reading — in review and to its author — like covered
|
||||
// code. Compare the two sets rather than their sizes, so the failure names the
|
||||
// files instead of only disagreeing about a count. The final equality also
|
||||
// catches the reverse: files the runner finds that this walk skips.
|
||||
const discovered = discoverUnitTestFiles(repositoryRoot);
|
||||
const onDisk = testFilesOnDisk(repositoryRoot);
|
||||
const undiscovered = onDisk.filter((file) => !discovered.includes(file));
|
||||
assert.deepEqual(
|
||||
undiscovered,
|
||||
[],
|
||||
`test files the runner never executes: ${undiscovered.join(', ')}`,
|
||||
);
|
||||
assert.deepEqual(discovered, onDisk);
|
||||
for (const file of discovered) {
|
||||
assert.ok(
|
||||
UNIT_TEST_ROOTS.some((root) => file.startsWith(`${root}/`)),
|
||||
`${file} should sit under one of ${UNIT_TEST_ROOTS.join(', ')}`,
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
test('allocation runtime calibration is explicit and pinned to Node 24', () => {
|
||||
assert.equal(assertNode24AllocationRuntime('24.19.0'), '24.19.0');
|
||||
assert.throws(
|
||||
|
||||
Reference in new issue
Block a user