mission-control/tests/task-regression.spec.ts

76 lines
2.6 KiB
TypeScript

import { expect, test } from '@playwright/test'
import { API_KEY_HEADER, createTestTask, deleteTestTask } from './helpers'
test.describe('Task Regression Metrics API', () => {
const cleanup: number[] = []
test.afterEach(async ({ request }) => {
for (const id of cleanup) {
await deleteTestTask(request, id).catch(() => {})
}
cleanup.length = 0
})
test('returns baseline vs post p95 latency and intervention trend', async ({ request }) => {
const baselineTaskA = await createTestTask(request, {
status: 'done',
retry_count: 0,
outcome: 'success',
})
expect(baselineTaskA.res.status()).toBe(201)
cleanup.push(baselineTaskA.id)
const baselineTaskB = await createTestTask(request, {
status: 'done',
retry_count: 1,
outcome: 'partial',
error_message: 'Needs operator check',
})
expect(baselineTaskB.res.status()).toBe(201)
cleanup.push(baselineTaskB.id)
await new Promise((resolve) => setTimeout(resolve, 1200))
const betaStart = Math.floor(Date.now() / 1000)
const postTaskA = await createTestTask(request, {
status: 'done',
retry_count: 2,
outcome: 'failed',
error_message: 'Escalated',
})
expect(postTaskA.res.status()).toBe(201)
cleanup.push(postTaskA.id)
const postTaskB = await createTestTask(request, {
status: 'done',
retry_count: 1,
outcome: 'abandoned',
error_message: 'Manual rollback',
})
expect(postTaskB.res.status()).toBe(201)
cleanup.push(postTaskB.id)
const res = await request.get(`/api/tasks/regression?beta_start=${betaStart}&lookback_seconds=3600`, {
headers: API_KEY_HEADER,
})
const responseText = await res.text()
expect(res.status(), responseText).toBe(200)
const body = JSON.parse(responseText)
expect(body.metric_definitions).toBeTruthy()
expect(body.windows?.baseline?.sample_size).toBeGreaterThan(0)
expect(body.windows?.post?.sample_size).toBeGreaterThan(0)
expect(typeof body.windows?.baseline?.latency_seconds?.p95).toBe('number')
expect(typeof body.windows?.post?.latency_seconds?.p95).toBe('number')
expect(body.windows?.post?.interventions?.rate).toBeGreaterThan(body.windows?.baseline?.interventions?.rate)
})
test('requires beta_start and auth', async ({ request }) => {
const unauth = await request.get('/api/tasks/regression?beta_start=1700000000')
expect(unauth.status()).toBe(401)
const missing = await request.get('/api/tasks/regression', { headers: API_KEY_HEADER })
expect(missing.status()).toBe(400)
})
})