89 lines
2.7 KiB
TypeScript
89 lines
2.7 KiB
TypeScript
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');
|
|
});
|
|
});
|