test(router): tighten routing and telemetry assertions

This commit is contained in:
root 2026-03-14 14:53:43 +00:00
parent 3cc35e2b51
commit b7c8e4fbef
3 changed files with 30 additions and 13 deletions

View File

@ -2,7 +2,7 @@
* Tests for GET /api/health (tracker dashboard)
*/
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { describe, it, expect, afterEach } from 'vitest';
import { GET } from '@/app/api/health/route';
@ -23,8 +23,14 @@ describe('GET /api/health', () => {
const data = await res.json();
expect(data.status).toBe('ok');
expect(data.service).toBe('tracker-dashboard');
expect(data.timestamp).toBeDefined();
expect(data.checks).toBeInstanceOf(Array);
expect(data.timestamp).toMatch(/^\d{4}-\d{2}-\d{2}T/);
expect(data.checks).toEqual([
{
name: 'env',
status: 'pass',
message: '3 required vars set',
},
]);
});
it('returns degraded when env vars are missing', async () => {
@ -36,6 +42,7 @@ describe('GET /api/health', () => {
expect(res.status).toBe(503);
const data = await res.json();
expect(data.status).toBe('degraded');
expect(data.service).toBe('tracker-dashboard');
expect(data.checks[0].status).toBe('fail');
expect(data.checks[0].message).toContain('Missing');
});

View File

@ -69,10 +69,10 @@ describe('trackEvent', () => {
expect(event.eventType).toBe('info');
expect(event.module).toBe('tracker');
expect(event.eventName).toBe('item_created');
expect(event.id).toBeDefined();
expect(event.sessionId).toBeDefined();
expect(event.anonymousInstallId).toBeDefined();
expect(event.occurredAt).toBeDefined();
expect(event.id).toBe('550e8400-e29b-41d4-a716-446655440000');
expect(typeof event.sessionId).toBe('string');
expect(event.anonymousInstallId).toBe('550e8400-e29b-41d4-a716-446655440000');
expect(event.occurredAt).toMatch(/^\d{4}-\d{2}-\d{2}T/);
});
it('includes optional fields when provided', () => {
@ -171,7 +171,12 @@ describe('initTelemetry', () => {
const sessionEvent = payload.events.find(
(e: Record<string, string>) => e.eventName === 'session_started'
);
expect(sessionEvent).toBeDefined();
expect(sessionEvent.module).toBe('app_lifecycle');
expect(sessionEvent).toEqual(
expect.objectContaining({
module: 'app_lifecycle',
eventType: 'info',
eventName: 'session_started',
})
);
});
});

View File

@ -92,8 +92,8 @@ describe('LlmRouter', () => {
expect(result.response.choices[0]!.message.content).toBe('Hello!');
expect(result.attempts).toBe(1);
expect(result.provider).toBeDefined();
expect(result.model).toBeDefined();
expect(result.provider).toBe('test-fast');
expect(result.model).toBe('fast-model');
});
it('retries on 429 with fallback provider', async () => {
@ -233,8 +233,13 @@ describe('LlmRouter', () => {
await router.chat({ messages: [{ role: 'user', content: 'Hello' }] });
const health = router.getHealth();
expect(health.length).toBeGreaterThan(0);
expect(health[0]!.successes).toBe(1);
expect(health).toContainEqual(
expect.objectContaining({
provider: 'test-fast',
model: 'fast-model',
successes: 1,
})
);
});
it('lists available providers', () => {