Assessor_2.0/tests/server/import-worker-startup-check...

41 lines
2.2 KiB
JavaScript

// Opt-in check of the built production worker; synthetic input only.
import assert from 'node:assert/strict';
import { Worker } from 'node:worker_threads';
const entry = new URL('../../dist-server/import-worker.mjs', import.meta.url).href;
const harness = new URL(`data:text/javascript,${encodeURIComponent(`
import { createRequire } from 'node:module';
import { parentPort } from 'node:worker_threads';
const require = createRequire(${JSON.stringify(entry)});
const send = parentPort.postMessage.bind(parentPort);
parentPort.postMessage = result => send({ ...result,
markupLoaded: Object.keys(require.cache).some(path => /[\\\\/]node_modules[\\\\/]jsdom[\\\\/]/.test(path)) });
await import(${JSON.stringify(entry)});
`)}`);
const csv = '"Domain"\r\n"synthetic.example.invalid"\r\n';
const start = Date.now();
for (let batch = 0; batch < 11; batch++) {
await Promise.all([0, 1].map(async index => {
const bytes = new TextEncoder().encode(csv);
const worker = new Worker(harness, {
execArgv: [],
workerData: { source: { metadata: { name: `synthetic-${batch}-${index}.csv`, sizeBytes: bytes.length, lastModified: 0 }, bytes } },
resourceLimits: { maxOldGenerationSizeMb: 512, maxYoungGenerationSizeMb: 64, stackSizeMb: 8 }
});
try {
const result = await new Promise((resolve, reject) => {
const timer = setTimeout(() => reject(new Error('Production worker exceeded its unchanged 30-second limit')), 30_000);
worker.once('message', result => { clearTimeout(timer); resolve(result); });
worker.once('error', error => { clearTimeout(timer); reject(error); });
});
assert.equal(result.ok, true);
assert.equal(result.dataset.format, 'CSV');
assert.equal(result.dataset.rawText, csv);
assert.equal(result.dataset.intermediate.tables.length, 1);
assert.deepEqual(result.dataset.intermediate.tables[0].rows.map(row => row.cells.map(cell => cell.rawValue)), [['Domain'], ['synthetic.example.invalid']]);
assert.equal(result.markupLoaded, false, 'CSV workers must not initialize the unrelated HTML/XML DOM runtime');
} finally { await worker.terminate(); }
}));
}
console.log(JSON.stringify({ syntheticFiles: 22, elapsedMs: Date.now() - start, markupLoaded: false }));