import { afterEach, describe, expect, it, vi } from 'vitest'; import { finishBarkBattleRun, getBarkBattleRuntimeConfig, startBarkBattleRun, } from './barkBattleRuntimeClient'; const requestJsonMock = vi.hoisted(() => vi.fn()); vi.mock('../apiClient', () => ({ requestJson: requestJsonMock, })); describe('barkBattleRuntimeClient', () => { afterEach(() => { requestJsonMock.mockReset(); }); it('reads runtime config from stable work route', async () => { requestJsonMock.mockResolvedValueOnce({ workId: 'work-1' }); await getBarkBattleRuntimeConfig('work/1'); expect(requestJsonMock).toHaveBeenCalledWith( '/api/runtime/bark-battle/works/work%2F1/config', { method: 'GET' }, '读取汪汪声浪大作战配置失败', expect.objectContaining({ retry: expect.objectContaining({ maxRetries: 1 }) }), ); }); it('starts a formal run with workId in body', async () => { requestJsonMock.mockResolvedValueOnce({ runId: 'run-1' }); await startBarkBattleRun('work-1', { sourceRoute: '/play/work-1' }); expect(requestJsonMock).toHaveBeenCalledWith( '/api/runtime/bark-battle/works/work-1/runs', expect.objectContaining({ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sourceRoute: '/play/work-1', workId: 'work-1' }), }), '启动汪汪声浪大作战正式局失败', expect.objectContaining({ retry: expect.objectContaining({ retryUnsafeMethods: true }) }), ); }); it('finishes a run using derived metrics only', async () => { requestJsonMock.mockResolvedValueOnce({ status: 'accepted' }); await finishBarkBattleRun('run-1', { runId: 'run-1', runToken: 'token-1', workId: 'work-1', configVersion: 1, rulesetVersion: 'bark-battle-ruleset-v1', difficultyPreset: 'normal', clientStartedAt: '2026-05-13T00:00:00Z', clientFinishedAt: '2026-05-13T00:00:30Z', durationMs: 30000, derivedMetrics: { triggerCount: 12, maxVolume: 0.82, averageVolume: 0.36, finalEnergy: 58, comboMax: 4, }, clientResult: 'player_win', }); const [, init] = requestJsonMock.mock.calls[0]; expect(requestJsonMock.mock.calls[0][0]).toBe( '/api/runtime/bark-battle/runs/run-1/finish', ); expect(JSON.parse(init.body)).toEqual( expect.objectContaining({ runId: 'run-1', runToken: 'token-1', derivedMetrics: expect.objectContaining({ finalEnergy: 58 }), }), ); expect(init.body).not.toContain('audio'); expect(init.body).not.toContain('waveform'); expect(init.body).not.toContain('pcm'); }); });