53 lines
2.4 KiB
JavaScript
53 lines
2.4 KiB
JavaScript
import { spawn } from "node:child_process";
|
|
import assert from "node:assert/strict";
|
|
import { setTimeout } from "node:timers/promises";
|
|
import { createServer } from "node:net";
|
|
import { once } from "node:events";
|
|
|
|
async function availablePort() {
|
|
const server = createServer();
|
|
server.listen(0, "127.0.0.1");
|
|
await once(server, "listening");
|
|
const port = server.address().port;
|
|
await new Promise((resolve, reject) => server.close(error => error ? reject(error) : resolve()));
|
|
return String(port);
|
|
}
|
|
|
|
const port = process.env.SMOKE_PORT || await availablePort();
|
|
const release = "smoke-test";
|
|
const child = spawn(process.execPath, [".next/standalone/server.js"], {
|
|
env: { ...process.env, PORT: port, HOSTNAME: "127.0.0.1", RELEASE_SHA: release },
|
|
stdio: "inherit",
|
|
});
|
|
try {
|
|
let ready = false;
|
|
for (let i = 0; i < 40; i++) {
|
|
if (child.exitCode !== null) throw new Error(`Server exited: ${child.exitCode}`);
|
|
try {
|
|
const response = await fetch(`http://127.0.0.1:${port}/api/health`);
|
|
assert.equal(response.status, 200);
|
|
assert.deepEqual(await response.json(), { status: "ok", service: "prompt", release });
|
|
ready = true;
|
|
break;
|
|
} catch { await setTimeout(500); }
|
|
}
|
|
assert.ok(ready, "Standalone production server must be healthy");
|
|
const response = await fetch(`http://127.0.0.1:${port}/api/health`, { method: "POST" });
|
|
assert.equal(response.status, 405);
|
|
const indexResponse=await fetch(`http://127.0.0.1:${port}/api/wiki-index`);
|
|
assert.equal(indexResponse.status,200);
|
|
const indexText=await indexResponse.text();
|
|
const id=indexText.match(/\/explore\/([a-f0-9]{24})/)?.[1];assert.ok(id);
|
|
const agent=await fetch(`http://127.0.0.1:${port}/explore/${id}?agent_mode=True`);
|
|
assert.equal(agent.status,200);assert.match(agent.headers.get('content-type'),/text\/plain/);assert.ok(!(await agent.text()).includes('<html'));
|
|
const preview=await fetch(`http://127.0.0.1:${port}/api/preview?source=${encodeURIComponent('/skills/shadow-puppet/egret-example.png')}&width=480`);
|
|
assert.equal(preview.status,200);assert.match(preview.headers.get('content-type'),/image\/webp/);assert.ok((await preview.arrayBuffer()).byteLength<=100000);
|
|
console.log("Production smoke test passed");
|
|
} finally {
|
|
if (child.exitCode === null && child.signalCode === null) {
|
|
const exited = once(child, "exit");
|
|
child.kill("SIGTERM");
|
|
await exited;
|
|
}
|
|
}
|