mirror of https://github.com/garrytan/gstack.git
test: add isServerHealthy + startup error log tests
Tests for the new cross-platform health check helper (isServerHealthy) that replaces PID-based liveness checks in all polling loops. Covers healthy, unhealthy, unreachable, and error response cases. Also tests the startup error log write/read format used on Windows. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
082a8f6d81
commit
342252584b
|
|
@ -248,3 +248,69 @@ describe('version mismatch detection', () => {
|
||||||
expect(shouldRestart).toBe(false);
|
expect(shouldRestart).toBe(false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('isServerHealthy', () => {
|
||||||
|
const { isServerHealthy } = require('../src/cli');
|
||||||
|
const http = require('http');
|
||||||
|
|
||||||
|
test('returns true for a healthy server', async () => {
|
||||||
|
const server = http.createServer((_req: any, res: any) => {
|
||||||
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
||||||
|
res.end(JSON.stringify({ status: 'healthy' }));
|
||||||
|
});
|
||||||
|
await new Promise<void>(resolve => server.listen(0, resolve));
|
||||||
|
const port = server.address().port;
|
||||||
|
try {
|
||||||
|
expect(await isServerHealthy(port)).toBe(true);
|
||||||
|
} finally {
|
||||||
|
server.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test('returns false for an unhealthy server', async () => {
|
||||||
|
const server = http.createServer((_req: any, res: any) => {
|
||||||
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
||||||
|
res.end(JSON.stringify({ status: 'unhealthy' }));
|
||||||
|
});
|
||||||
|
await new Promise<void>(resolve => server.listen(0, resolve));
|
||||||
|
const port = server.address().port;
|
||||||
|
try {
|
||||||
|
expect(await isServerHealthy(port)).toBe(false);
|
||||||
|
} finally {
|
||||||
|
server.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test('returns false when server is not running', async () => {
|
||||||
|
// Use a port that's almost certainly not in use
|
||||||
|
expect(await isServerHealthy(59999)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('returns false on non-200 response', async () => {
|
||||||
|
const server = http.createServer((_req: any, res: any) => {
|
||||||
|
res.writeHead(500);
|
||||||
|
res.end('Internal Server Error');
|
||||||
|
});
|
||||||
|
await new Promise<void>(resolve => server.listen(0, resolve));
|
||||||
|
const port = server.address().port;
|
||||||
|
try {
|
||||||
|
expect(await isServerHealthy(port)).toBe(false);
|
||||||
|
} finally {
|
||||||
|
server.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('startup error log', () => {
|
||||||
|
test('write and read error log', () => {
|
||||||
|
const tmpDir = path.join(os.tmpdir(), `browse-error-log-test-${Date.now()}`);
|
||||||
|
fs.mkdirSync(tmpDir, { recursive: true });
|
||||||
|
const errorLogPath = path.join(tmpDir, 'browse-startup-error.log');
|
||||||
|
const errorMsg = 'Cannot find module playwright';
|
||||||
|
fs.writeFileSync(errorLogPath, `2026-03-23T00:00:00.000Z ${errorMsg}\n`);
|
||||||
|
const content = fs.readFileSync(errorLogPath, 'utf-8').trim();
|
||||||
|
expect(content).toContain(errorMsg);
|
||||||
|
expect(content).toMatch(/^\d{4}-\d{2}-\d{2}T/); // ISO timestamp prefix
|
||||||
|
fs.rmSync(tmpDir, { recursive: true, force: true });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue