Files
WebRTC-Broadcast/tests/basic.test.ts
2025-09-05 00:36:54 -04:00

130 lines
4.2 KiB
TypeScript

import { test, expect, describe } from "bun:test";
import { ClientManager } from "../src/services/ClientManager.ts";
import { SignalingService } from "../src/services/SignalingService.ts";
import type { IWebSocketClient } from "../src/interfaces/ISignalingMessage.ts";
class MockWebSocket {
sentMessages: string[] = [];
send(data: string) {
this.sentMessages.push(data);
}
close() {}
}
describe("Basic WebRTC Broadcasting Tests", () => {
test("ClientManager should add and retrieve clients", () => {
const clientManager = new ClientManager();
const mockWs = new MockWebSocket();
const client: IWebSocketClient = {
id: "test-client",
ws: mockWs,
role: "publisher"
};
clientManager.addClient(client);
expect(clientManager.getClient("test-client")).toBe(client);
expect(clientManager.getPublisher()).toBe(client);
});
test("ClientManager should track subscribers separately", () => {
const clientManager = new ClientManager();
const subscriber1: IWebSocketClient = {
id: "sub-1",
ws: new MockWebSocket(),
role: "subscriber"
};
const subscriber2: IWebSocketClient = {
id: "sub-2",
ws: new MockWebSocket(),
role: "subscriber"
};
clientManager.addClient(subscriber1);
clientManager.addClient(subscriber2);
const subscribers = clientManager.getSubscribers();
expect(subscribers.length).toBe(2);
expect(subscribers).toContain(subscriber1);
expect(subscribers).toContain(subscriber2);
});
test("SignalingService should create client connections", () => {
const clientManager = new ClientManager();
const signalingService = new SignalingService(clientManager);
const mockWs = new MockWebSocket();
const clientId = signalingService.handleConnection(mockWs, "publisher");
expect(typeof clientId).toBe("string");
expect(clientId.length).toBeGreaterThan(0);
expect(mockWs.sentMessages.length).toBe(1);
const message = JSON.parse(mockWs.sentMessages[0]);
expect(message.type).toBe("join");
expect(message.data.clientId).toBe(clientId);
expect(message.data.role).toBe("publisher");
});
test("SignalingService should handle disconnections", () => {
const clientManager = new ClientManager();
const signalingService = new SignalingService(clientManager);
const mockWs = new MockWebSocket();
const clientId = signalingService.handleConnection(mockWs, "publisher");
expect(clientManager.getPublisher()).toBeTruthy();
signalingService.handleDisconnection(clientId);
expect(clientManager.getPublisher()).toBeNull();
});
test("Complete publisher-subscriber flow", () => {
const clientManager = new ClientManager();
const signalingService = new SignalingService(clientManager);
// Add publisher
const publisherWs = new MockWebSocket();
const publisherId = signalingService.handleConnection(publisherWs, "publisher");
// Add subscriber
const subscriberWs = new MockWebSocket();
const subscriberId = signalingService.handleConnection(subscriberWs, "subscriber");
// Clear initial connection messages
publisherWs.sentMessages = [];
subscriberWs.sentMessages = [];
// Send offer from publisher
const offerMessage = {
type: "offer" as const,
data: { sdp: "test-offer" }
};
signalingService.handleMessage(publisherId, offerMessage);
// Check subscriber received the offer
expect(subscriberWs.sentMessages.length).toBe(1);
const receivedMessage = JSON.parse(subscriberWs.sentMessages[0]);
expect(receivedMessage.type).toBe("offer");
expect(receivedMessage.data.sdp).toBe("test-offer");
expect(receivedMessage.senderId).toBe(publisherId);
// Send answer from subscriber
const answerMessage = {
type: "answer" as const,
data: { sdp: "test-answer" }
};
signalingService.handleMessage(subscriberId, answerMessage);
// Check publisher received the answer
expect(publisherWs.sentMessages.length).toBe(1);
const publisherMessage = JSON.parse(publisherWs.sentMessages[0]);
expect(publisherMessage.type).toBe("answer");
expect(publisherMessage.data.sdp).toBe("test-answer");
expect(publisherMessage.senderId).toBe(subscriberId);
});
});