Spaces:
Sleeping
Sleeping
/** | |
* 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<void> { | |
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<ArrayBuffer | null> { | |
// 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<T = any> { | |
private messages: T[] = []; | |
private promise: Promise<T[]> | 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<T[]> { | |
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; | |
} | |
} |