test(web): add Vitest CI, ADRs, and PR Definition of Done

FE unit-тесты селекторов/api-client в CI; ADR по durable jobs, OpenAPI codegen и legacy Svelte; PR template WEB-19; процесс KPI cross-app sync.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Denozordec
2026-07-31 12:27:13 +07:00
co-authored by Cursor
parent 8fe74c1d3b
commit 26f5172f88
8 changed files with 161 additions and 1 deletions
+49
View File
@@ -0,0 +1,49 @@
import { describe, expect, it } from 'vitest'
import { normalizeApiToken, DEV_API_TOKEN } from '@/lib/api-client'
import {
aggregateNetworkMetrics,
moduleNameById,
runningJobCount,
} from '@/queries/overview'
import type { JobRow, ModuleRow, PeerRow, SpeakerRow } from '@/types/api'
describe('normalizeApiToken', () => {
it('trims and strips Bearer prefix', () => {
expect(normalizeApiToken(' Bearer dev ')).toBe('dev')
expect(normalizeApiToken(DEV_API_TOKEN)).toBe('dev')
})
})
describe('overview selectors', () => {
it('runningJobCount counts queued and running', () => {
const jobs = [
{ status: 'queued' },
{ status: 'running' },
{ status: 'succeeded' },
] as JobRow[]
expect(runningJobCount(jobs)).toBe(2)
})
it('moduleNameById maps ids', () => {
const modules = [
{ id: 'a', name: 'Alpha' },
{ id: 'b', name: 'Beta' },
] as ModuleRow[]
expect(moduleNameById(modules).get('a')).toBe('Alpha')
})
it('aggregateNetworkMetrics sums peers and speakers', () => {
const peers = [
{ enabled: true, session_state: 'Established', session_mismatch: false },
{ enabled: false, session_state: 'Idle', session_mismatch: true },
] as PeerRow[]
const speakers = [{ live: { agent_ok: true } }, { live: { agent_ok: false } }] as SpeakerRow[]
const m = aggregateNetworkMetrics(peers, speakers)
expect(m.peersTotal).toBe(2)
expect(m.peersEnabled).toBe(1)
expect(m.peersEstablished).toBe(1)
expect(m.peersMismatch).toBe(1)
expect(m.speakersOnline).toBe(1)
})
})