/** * Tests for REST API functionality - equivalent to Python's test_rest_api.py */ import { test, expect, describe, beforeEach, afterEach } from "bun:test"; import { robotics } from "../src/index"; import { TEST_SERVER_URL, TestRoomManager } from "./setup"; const { RoboticsProducer } = robotics; describe("REST API", () => { let producer: robotics.RoboticsProducer; let roomManager: TestRoomManager; beforeEach(() => { producer = new RoboticsProducer(TEST_SERVER_URL); roomManager = new TestRoomManager(); }); afterEach(async () => { if (producer.isConnected()) { await producer.disconnect(); } await roomManager.cleanup(producer); }); test("list rooms empty", async () => { // Use a temporary workspace ID const workspaceId = `test-workspace-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; const rooms = await producer.listRooms(workspaceId); expect(Array.isArray(rooms)).toBe(true); }); test("create room", async () => { const { workspaceId, roomId } = await producer.createRoom(); roomManager.addRoom(workspaceId, roomId); expect(typeof workspaceId).toBe("string"); expect(typeof roomId).toBe("string"); expect(workspaceId.length).toBeGreaterThan(0); expect(roomId.length).toBeGreaterThan(0); }); test("create room with id", async () => { const customRoomId = "test-room-123"; const customWorkspaceId = "test-workspace-456"; const { workspaceId, roomId } = await producer.createRoom(customWorkspaceId, customRoomId); roomManager.addRoom(workspaceId, roomId); expect(workspaceId).toBe(customWorkspaceId); expect(roomId).toBe(customRoomId); }); test("list rooms with rooms", async () => { // Create a test room const { workspaceId, roomId } = await producer.createRoom(); roomManager.addRoom(workspaceId, roomId); const rooms = await producer.listRooms(workspaceId); expect(Array.isArray(rooms)).toBe(true); expect(rooms.length).toBeGreaterThanOrEqual(1); // Check if our room is in the list const roomIds = rooms.map(room => room.id); expect(roomIds).toContain(roomId); // Verify room structure const testRoom = rooms.find(room => room.id === roomId); expect(testRoom).toBeDefined(); expect(testRoom!).toHaveProperty("participants"); expect(testRoom!).toHaveProperty("joints_count"); }); test("get room info", async () => { const { workspaceId, roomId } = await producer.createRoom(); roomManager.addRoom(workspaceId, roomId); const roomInfo = await producer.getRoomInfo(workspaceId, roomId); expect(typeof roomInfo).toBe("object"); expect(roomInfo.id).toBe(roomId); expect(roomInfo.workspace_id).toBe(workspaceId); expect(roomInfo).toHaveProperty("participants"); expect(roomInfo).toHaveProperty("joints_count"); expect(roomInfo).toHaveProperty("has_producer"); expect(roomInfo).toHaveProperty("active_consumers"); }); test("get room state", async () => { const { workspaceId, roomId } = await producer.createRoom(); roomManager.addRoom(workspaceId, roomId); const roomState = await producer.getRoomState(workspaceId, roomId); expect(typeof roomState).toBe("object"); expect(roomState).toHaveProperty("room_id"); expect(roomState).toHaveProperty("workspace_id"); expect(roomState).toHaveProperty("joints"); expect(roomState).toHaveProperty("participants"); expect(roomState).toHaveProperty("timestamp"); expect(roomState.room_id).toBe(roomId); expect(roomState.workspace_id).toBe(workspaceId); }); test("delete room", async () => { const { workspaceId, roomId } = await producer.createRoom(); // Verify room exists const roomsBefore = await producer.listRooms(workspaceId); const roomIdsBefore = roomsBefore.map(room => room.id); expect(roomIdsBefore).toContain(roomId); // Delete room const success = await producer.deleteRoom(workspaceId, roomId); expect(success).toBe(true); // Verify room is deleted const roomsAfter = await producer.listRooms(workspaceId); const roomIdsAfter = roomsAfter.map(room => room.id); expect(roomIdsAfter).not.toContain(roomId); }); test("delete nonexistent room", async () => { const workspaceId = `test-workspace-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; const fakeRoomId = "nonexistent-room-id"; const success = await producer.deleteRoom(workspaceId, fakeRoomId); expect(success).toBe(false); }); test("get room info nonexistent", async () => { const workspaceId = `test-workspace-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; const fakeRoomId = "nonexistent-room-id"; // This should raise an exception or return error info try { await producer.getRoomInfo(workspaceId, fakeRoomId); // If no exception, this is unexpected for nonexistent room expect(true).toBe(false); // Force test failure } catch (error) { // Expected behavior for nonexistent room expect(error).toBeDefined(); } }); test("get room state nonexistent", async () => { const workspaceId = `test-workspace-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; const fakeRoomId = "nonexistent-room-id"; // This should raise an exception or return error info try { await producer.getRoomState(workspaceId, fakeRoomId); // If no exception, this is unexpected for nonexistent room expect(true).toBe(false); // Force test failure } catch (error) { // Expected behavior for nonexistent room expect(error).toBeDefined(); } }); });