40 lines
1.1 KiB
TypeScript
40 lines
1.1 KiB
TypeScript
import { spawn } from "child_process";
|
|
import { ChildProcess, spawnSync } from "node:child_process";
|
|
|
|
let backendProcess: ChildProcess;
|
|
|
|
async function waitForEndpoint(url: string, delay = 1000, retries = 60): Promise<void> {
|
|
try {
|
|
await fetch(url);
|
|
} catch {
|
|
// Endpoint is not ready yet
|
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
// Retry
|
|
await waitForEndpoint(url, delay, retries - 1);
|
|
}
|
|
}
|
|
|
|
export async function setup(): Promise<void> {
|
|
// Precompile needed packages
|
|
spawnSync("npx", ["tsc", "--build", "tsconfig.json"], {
|
|
cwd: `../common`,
|
|
});
|
|
|
|
// Spin up the backend
|
|
backendProcess = spawn("npx", ["tsx", "--env-file=.env.test", "tool/startTestApp.ts"], {
|
|
cwd: `../backend`,
|
|
env: {
|
|
...process.env,
|
|
NODE_ENV: "test",
|
|
},
|
|
});
|
|
|
|
// Wait until you can curl the backend
|
|
await waitForEndpoint("http://localhost:9876/api");
|
|
}
|
|
|
|
export async function teardown(): Promise<void> {
|
|
if (backendProcess) {
|
|
backendProcess.kill();
|
|
}
|
|
}
|