Files
Final-Year-Project/Backend/tests/streaming-simple.test.ts

98 lines
3.0 KiB
TypeScript

import { describe, expect, test } from 'bun:test';
import {
canRelayWebrtcSignal,
createStreamEndedPayload,
createStreamRequestedPayload,
createStreamStartedPayload,
toSimpleStreamSessionResponse,
} from '../streaming/simple';
const buildSession = () => ({
id: 'stream-1',
ownerUserId: 'user-1',
cameraDeviceId: 'camera-1',
requesterDeviceId: 'client-1',
status: 'streaming',
reason: 'on_demand',
metadata: { quality: 'standard' },
startedAt: new Date('2026-04-06T10:00:00.000Z'),
endedAt: null,
createdAt: new Date('2026-04-06T09:59:00.000Z'),
updatedAt: new Date('2026-04-06T10:00:00.000Z'),
});
describe('simple streaming helpers', () => {
test('only relays WebRTC signals between stream participants', () => {
const session = buildSession();
expect(canRelayWebrtcSignal(session, 'camera-1', 'client-1')).toBe(true);
expect(canRelayWebrtcSignal(session, 'client-1', 'camera-1')).toBe(true);
expect(canRelayWebrtcSignal(session, 'camera-1', 'camera-1')).toBe(false);
expect(canRelayWebrtcSignal(session, 'camera-1', 'intruder-1')).toBe(false);
});
test('builds deterministic requested and started payloads', () => {
const session = buildSession();
expect(createStreamRequestedPayload(session)).toEqual({
streamSessionId: 'stream-1',
cameraDeviceId: 'camera-1',
requesterDeviceId: 'client-1',
status: 'streaming',
reason: 'on_demand',
});
expect(createStreamStartedPayload(session)).toEqual({
streamSessionId: 'stream-1',
cameraDeviceId: 'camera-1',
requesterDeviceId: 'client-1',
status: 'streaming',
startedAt: session.startedAt,
transport: 'webrtc',
});
});
test('normalizes ended payload and strips provider fields from API response', () => {
const session = {
...buildSession(),
mediaProvider: 'mock',
mediaSessionId: 'mock_stream-1',
streamKey: 'stream-key',
publishEndpoint: 'https://example.test/publish',
subscribeEndpoint: 'https://example.test/subscribe',
};
expect(
createStreamEndedPayload({
streamSessionId: session.id,
cameraDeviceId: session.cameraDeviceId,
requesterDeviceId: session.requesterDeviceId,
endedAt: new Date('2026-04-06T10:05:00.000Z'),
reason: 'completed',
}),
).toEqual({
streamSessionId: 'stream-1',
cameraDeviceId: 'camera-1',
requesterDeviceId: 'client-1',
status: 'ended',
endedAt: new Date('2026-04-06T10:05:00.000Z'),
reason: 'completed',
});
expect(toSimpleStreamSessionResponse(session)).toEqual({
id: 'stream-1',
ownerUserId: 'user-1',
cameraDeviceId: 'camera-1',
requesterDeviceId: 'client-1',
status: 'streaming',
reason: 'on_demand',
metadata: { quality: 'standard' },
startedAt: new Date('2026-04-06T10:00:00.000Z'),
endedAt: null,
createdAt: new Date('2026-04-06T09:59:00.000Z'),
updatedAt: new Date('2026-04-06T10:00:00.000Z'),
});
});
});