import test from 'node:test' import assert from 'node:assert/strict' import { createVideoApi } from '../../src/modules/cockpit/services/videoApi.js' const code = 'CAM/03 空格' const config = { dataSource: 'real', api: { baseUrl: 'http://fixture.invalid/api/cockpit/v1', token: 'never-send' } } const response = (data, status = 200) => Response.json({ code: 200, msg: '操作成功', data }, { status }) test('prepare assigns an owned identity before any live request and later operations carry only its credential', async () => { const calls = [] const api = createVideoApi({ config, fetchImpl: async (url, options) => { calls.push({ url: new URL(url), options, body: JSON.parse(options.body) }) if (url.endsWith('/prepare')) return response({ deviceCode: code, deviceName: '摄像机03', sessionId: 'session-03', sessionToken: 'owner-03', mode: 'LIVE', status: 'PREPARED' }, 201) if (url.endsWith('/live')) return response({ deviceCode: code, sessionId: 'session-03', mode: 'LIVE', status: 'ACTIVE', media: { native: true, url: 'https://media.invalid/live.mp4' } }) if (url.endsWith('/status')) return response({ sessionId: 'session-03', status: 'STOPPED' }) return response({ sessionId: 'session-03', status: 'CLEANUP_PENDING', category: 'CLEANUP_UNCONFIRMED' }, 202) } }) const identity = await api.prepare(code) assert.equal(calls.length, 1) assert.equal(calls[0].url.pathname, '/api/cockpit/v1/video/sessions/prepare') assert.deepEqual(calls[0].body, { deviceCode: code }) assert.equal(identity.status, 'PREPARED') assert.equal(identity.media, undefined) const started = await api.start(identity) assert.equal(started.status, 'ACTIVE') assert.equal(started.sessionToken, undefined) assert.equal((await api.stop(identity)).status, 'CLEANUP_PENDING') assert.equal((await api.status(identity)).status, 'STOPPED') for (const call of calls) { assert.equal(call.options.headers.Authorization, undefined) assert.equal(call.options.credentials, 'omit') assert.equal(call.url.search, '') } for (const call of calls.slice(1)) assert.deepEqual(call.body, { sessionToken: 'owner-03' }) })