Files
gridpilot.gg/tests/integration/health/monitor/monitor-metrics.integration.test.ts
Marc Mintel a0f41f242f
Some checks failed
CI / lint-typecheck (pull_request) Failing after 4m51s
CI / tests (pull_request) Has been skipped
CI / contract-tests (pull_request) Has been skipped
CI / e2e-tests (pull_request) Has been skipped
CI / comment-pr (pull_request) Has been skipped
CI / commit-types (pull_request) Has been skipped
integration tests
2026-01-23 00:46:34 +01:00

93 lines
2.8 KiB
TypeScript

import { describe, it, expect, beforeEach, afterEach } from 'vitest';
import { HealthTestContext } from '../HealthTestContext';
describe('API Connection Monitor - Metrics & Selection', () => {
let context: HealthTestContext;
beforeEach(() => {
context = HealthTestContext.create();
context.reset();
});
afterEach(() => {
context.teardown();
});
describe('Metrics Calculation', () => {
it('should correctly calculate reliability percentage', async () => {
context.mockFetch.mockResolvedValue({
ok: true,
status: 200,
});
for (let i = 0; i < 7; i++) {
await context.apiConnectionMonitor.performHealthCheck();
}
context.mockFetch.mockRejectedValue(new Error('ECONNREFUSED'));
for (let i = 0; i < 3; i++) {
await context.apiConnectionMonitor.performHealthCheck();
}
expect(context.apiConnectionMonitor.getReliability()).toBeCloseTo(70, 1);
});
it('should correctly calculate average response time', async () => {
const responseTimes = [50, 100, 150];
context.mockFetch.mockImplementation(async () => {
const time = responseTimes.shift() || 50;
await new Promise(resolve => setTimeout(resolve, time));
return {
ok: true,
status: 200,
} as Response;
});
await context.apiConnectionMonitor.performHealthCheck();
await context.apiConnectionMonitor.performHealthCheck();
await context.apiConnectionMonitor.performHealthCheck();
const health = context.apiConnectionMonitor.getHealth();
expect(health.averageResponseTime).toBeGreaterThanOrEqual(100);
});
});
describe('Endpoint Selection', () => {
it('should try multiple endpoints when primary fails', async () => {
let callCount = 0;
context.mockFetch.mockImplementation(() => {
callCount++;
if (callCount === 1) {
return Promise.reject(new Error('ECONNREFUSED'));
} else {
return Promise.resolve({
ok: true,
status: 200,
} as Response);
}
});
const result = await context.apiConnectionMonitor.performHealthCheck();
expect(result.healthy).toBe(true);
expect(context.apiConnectionMonitor.getStatus()).toBe('connected');
});
it('should handle all endpoints being unavailable', async () => {
context.mockFetch.mockImplementation(async () => {
throw new Error('ECONNREFUSED');
});
// Perform 3 checks to reach disconnected status
await context.apiConnectionMonitor.performHealthCheck();
await context.apiConnectionMonitor.performHealthCheck();
const result = await context.apiConnectionMonitor.performHealthCheck();
expect(result.healthy).toBe(false);
expect(context.apiConnectionMonitor.getStatus()).toBe('disconnected');
});
});
});