chore(monitoring): type fetch test mocks

Replace test-only any casts with a small typed fetch mock helper for partial health-check responses.

Verification: pnpm --filter @bytelyst/monitoring build; pnpm --filter @bytelyst/monitoring test; pnpm --filter @bytelyst/monitoring exec eslint . --ext .ts,.tsx; pnpm lint.
This commit is contained in:
Saravana Achu Mac 2026-05-04 15:19:05 -07:00
parent 46900728d3
commit afe7d88869

View File

@ -2,6 +2,13 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import { checkService, generateHealthReport, type ServiceTarget } from '../index.js';
type FetchInput = Parameters<typeof globalThis.fetch>[0];
type MockFetchResult = Pick<Response, 'ok' | 'status' | 'json'>;
function mockFetch(handler: (input: FetchInput) => Promise<MockFetchResult>): void {
globalThis.fetch = vi.fn(handler) as unknown as typeof globalThis.fetch;
}
describe('monitoring', () => {
const originalFetch = globalThis.fetch;
@ -14,11 +21,11 @@ describe('monitoring', () => {
});
it('checkService returns healthy for 200', async () => {
globalThis.fetch = vi.fn(async () => ({
mockFetch(async () => ({
ok: true,
status: 200,
json: async () => ({ status: 'ok' }),
})) as any;
}));
const res = await checkService({ name: 'svc', url: 'http://x', path: '/health' });
expect(res.status).toBe('healthy');
@ -26,11 +33,11 @@ describe('monitoring', () => {
});
it('checkService returns unhealthy for non-2xx', async () => {
globalThis.fetch = vi.fn(async () => ({
mockFetch(async () => ({
ok: false,
status: 503,
json: async () => ({}),
})) as any;
}));
const res = await checkService({ name: 'svc', url: 'http://x', path: '/health' });
expect(res.status).toBe('unhealthy');
@ -38,9 +45,9 @@ describe('monitoring', () => {
});
it('checkService returns unreachable on fetch error', async () => {
globalThis.fetch = vi.fn(async () => {
mockFetch(async () => {
throw new Error('network');
}) as any;
});
const res = await checkService({ name: 'svc', url: 'http://x', path: '/health' });
expect(res.status).toBe('unreachable');
@ -48,9 +55,9 @@ describe('monitoring', () => {
});
it('generateHealthReport sets overall=down when all unreachable', async () => {
globalThis.fetch = vi.fn(async () => {
mockFetch(async () => {
throw new Error('network');
}) as any;
});
const services: ServiceTarget[] = [
{ name: 'a', url: 'http://a', path: '/health' },
@ -63,11 +70,10 @@ describe('monitoring', () => {
});
it('generateHealthReport sets overall=degraded when mixed', async () => {
const calls = vi.fn(async (url: string) => {
if (url.includes('good')) return { ok: true, status: 200, json: async () => ({}) };
mockFetch(async url => {
if (String(url).includes('good')) return { ok: true, status: 200, json: async () => ({}) };
return { ok: false, status: 500, json: async () => ({}) };
});
globalThis.fetch = calls as any;
const services: ServiceTarget[] = [
{ name: 'good', url: 'http://good', path: '/health' },
@ -81,11 +87,11 @@ describe('monitoring', () => {
});
it('generateHealthReport sets overall=healthy when all healthy', async () => {
globalThis.fetch = vi.fn(async () => ({
mockFetch(async () => ({
ok: true,
status: 200,
json: async () => ({}),
})) as any;
}));
const services: ServiceTarget[] = [
{ name: 'a', url: 'http://a', path: '/health' },