/** * Test setup and utilities for RobotHub TransportServer JS Client Tests * Equivalent to Python's conftest.py */ import { expect } from "bun:test"; // Default server URL for tests export const TEST_SERVER_URL = "http://localhost:8000"; // Test timeout configuration export const TEST_TIMEOUT = 10000; // 10 seconds // Helper to generate test IDs export function generateTestId(prefix: string = "test"): string { return `${prefix}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; } // Helper to wait for async operations export function sleep(ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)); } // Test workspace and room management export class TestRoomManager { private createdRooms: Array<{ workspaceId: string; roomId: string }> = []; addRoom(workspaceId: string, roomId: string) { this.createdRooms.push({ workspaceId, roomId }); } async cleanup(client: any) { for (const { workspaceId, roomId } of this.createdRooms) { try { await client.deleteRoom(workspaceId, roomId); } catch (error) { // Ignore cleanup errors console.warn(`Failed to cleanup room ${roomId}:`, error); } } this.createdRooms = []; } } // Mock frame source for video tests export async function mockFrameSource(): Promise { // Create a simple test frame (RGBA data) const width = 320; const height = 240; const size = width * height * 4; // RGBA const buffer = new ArrayBuffer(size); const view = new Uint8Array(buffer); // Fill with test pattern for (let i = 0; i < size; i += 4) { view[i] = 255; // R view[i + 1] = 0; // G view[i + 2] = 0; // B view[i + 3] = 255; // A } return buffer; } // Test assertion helpers export function assertIsConnected(client: any, workspaceId: string, roomId: string) { if (!client.isConnected()) { throw new Error("Expected client to be connected"); } const info = client.getConnectionInfo(); if (!info.connected) { throw new Error("Expected connection info to show connected"); } if (info.workspace_id !== workspaceId) { throw new Error(`Expected workspace_id ${workspaceId}, got ${info.workspace_id}`); } if (info.room_id !== roomId) { throw new Error(`Expected room_id ${roomId}, got ${info.room_id}`); } } export function assertIsDisconnected(client: any) { if (client.isConnected()) { throw new Error("Expected client to be disconnected"); } const info = client.getConnectionInfo(); if (info.connected) { throw new Error("Expected connection info to show disconnected"); } } // Message collection helper for testing callbacks export class MessageCollector { private messages: T[] = []; private promise: Promise | null = null; private resolve: ((value: T[]) => void) | null = null; constructor(private expectedCount: number = 1) {} collect = (message: T) => { this.messages.push(message); if (this.messages.length >= this.expectedCount && this.resolve) { this.resolve([...this.messages]); } }; async waitForMessages(timeoutMs: number = 5000): Promise { if (this.messages.length >= this.expectedCount) { return [...this.messages]; } this.promise = new Promise((resolve, reject) => { this.resolve = resolve; setTimeout(() => { reject(new Error(`Timeout waiting for ${this.expectedCount} messages, got ${this.messages.length}`)); }, timeoutMs); }); return this.promise; } getMessages(): T[] { return [...this.messages]; } clear() { this.messages = []; this.promise = null; this.resolve = null; } }