Files
gridpilot.gg/tests/integration/health/HealthTestContext.ts
Marc Mintel 09632d004d
Some checks failed
CI / lint-typecheck (pull_request) Failing after 12s
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
code quality
2026-01-26 22:16:33 +01:00

88 lines
3.3 KiB
TypeScript

import { vi } from 'vitest';
import { InMemoryHealthCheckAdapter } from '../../../adapters/health/persistence/inmemory/InMemoryHealthCheckAdapter';
import { InMemoryHealthEventPublisher } from '../../../adapters/events/InMemoryHealthEventPublisher';
import { ApiConnectionMonitor } from '../../../apps/website/lib/gateways/api/base/ApiConnectionMonitor';
import { CheckApiHealthUseCase } from '../../../core/health/use-cases/CheckApiHealthUseCase';
import { GetConnectionStatusUseCase } from '../../../core/health/use-cases/GetConnectionStatusUseCase';
export class HealthTestContext {
public healthCheckAdapter: InMemoryHealthCheckAdapter;
public eventPublisher: InMemoryHealthEventPublisher;
public apiConnectionMonitor: ApiConnectionMonitor;
public checkApiHealthUseCase: CheckApiHealthUseCase;
public getConnectionStatusUseCase: GetConnectionStatusUseCase;
public mockFetch = vi.fn();
private constructor() {
this.healthCheckAdapter = new InMemoryHealthCheckAdapter();
this.eventPublisher = new InMemoryHealthEventPublisher();
// Initialize Use Cases
this.checkApiHealthUseCase = new CheckApiHealthUseCase({
healthCheckAdapter: this.healthCheckAdapter,
eventPublisher: this.eventPublisher,
});
this.getConnectionStatusUseCase = new GetConnectionStatusUseCase({
healthCheckAdapter: this.healthCheckAdapter,
});
// Initialize Monitor
(ApiConnectionMonitor as any).instance = undefined;
this.apiConnectionMonitor = ApiConnectionMonitor.getInstance('/health');
// Setup global fetch mock
global.fetch = this.mockFetch as any;
}
public static create(): HealthTestContext {
return new HealthTestContext();
}
public reset(): void {
this.healthCheckAdapter.clear();
this.eventPublisher.clear();
this.mockFetch.mockReset();
// Reset monitor singleton
(ApiConnectionMonitor as any).instance = undefined;
this.apiConnectionMonitor = ApiConnectionMonitor.getInstance('/health');
// Default mock implementation for fetch to use the adapter
this.mockFetch.mockImplementation(async (url: string) => {
// Simulate network delay if configured in adapter
const responseTime = (this.healthCheckAdapter as any).responseTime || 0;
if (responseTime > 0) {
await new Promise(resolve => setTimeout(resolve, responseTime));
}
if ((this.healthCheckAdapter as any).shouldFail) {
const error = (this.healthCheckAdapter as any).failError || 'Network Error';
if (error === 'Timeout') {
// Simulate timeout by never resolving or rejecting until aborted
return new Promise((_, reject) => {
const timeout = setTimeout(() => reject(new Error('Timeout')), 10000);
// In a real fetch, the signal would abort this
});
}
throw new Error(error);
}
return {
ok: true,
status: 200,
json: async () => ({ status: 'ok' }),
} as Response;
});
// Ensure monitor starts with a clean state for each test
this.apiConnectionMonitor.reset();
// Force status to checking initially as per monitor logic for 0 requests
(this.apiConnectionMonitor as any).health.status = 'checking';
}
public teardown(): void {
this.apiConnectionMonitor.stopMonitoring();
vi.restoreAllMocks();
}
}