import { test, expect } from "@playwright/test"; import { createMultiSession } from "@suaveplan/testing-e2e/multi-session"; test.describe("WebSocket Gateway", () => { test("sender and receiver pages both render page-title", async ({ browser }) => { const sessionId = `ws-${Date.now()}`; const { pages, teardown } = await createMultiSession({ browser, count: 2, baseUrl: `http://localhost:3200/network-websocket?session=${sessionId}`, roles: ["sender", "receiver"], }); try { const sender = pages[0]!; const receiver = pages[1]!; await expect(sender.locator('[data-testid="page-title"]')).toContainText( "Network — WebSocket", ); await expect(receiver.locator('[data-testid="page-title"]')).toContainText( "Network — WebSocket", ); } finally { await teardown(); } }); test("sender page shows message-input and send-button", async ({ browser }) => { const sessionId = `ws-sender-${Date.now()}`; const { pages, teardown } = await createMultiSession({ browser, count: 1, baseUrl: `http://localhost:3200/network-websocket?session=${sessionId}`, roles: ["sender"], }); try { const sender = pages[0]!; await expect( sender.locator('[data-testid="message-input"]'), ).toBeVisible(); await expect( sender.locator('[data-testid="send-button"]'), ).toBeVisible(); } finally { await teardown(); } }); test("receiver page does not show send-button", async ({ browser }) => { const sessionId = `ws-receiver-${Date.now()}`; const { pages, teardown } = await createMultiSession({ browser, count: 1, baseUrl: `http://localhost:3200/network-websocket?session=${sessionId}`, roles: ["receiver"], }); try { const receiver = pages[0]!; await expect( receiver.locator('[data-testid="send-button"]'), ).not.toBeVisible(); await expect( receiver.locator('[data-testid="output"]'), ).toBeVisible(); } finally { await teardown(); } }); test("connected sender can send message that appears in receiver output", async ({ browser, }) => { const sessionId = `ws-msg-${Date.now()}`; const { pages, teardown } = await createMultiSession({ browser, count: 2, baseUrl: `http://localhost:3200/network-websocket?session=${sessionId}`, roles: ["sender", "receiver"], }); try { const sender = pages[0]!; const receiver = pages[1]!; // Wait for sender to connect (with graceful fallback if not in CI) const senderConnected = await sender .locator("[data-status='connected']") .waitFor({ timeout: 10000 }) .then(() => true) .catch(() => false); if (senderConnected) { const msg = `ws-test-${Date.now()}`; await sender.locator('[data-testid="message-input"]').fill(msg); await sender.locator('[data-testid="send-button"]').click(); await expect(receiver.locator('[data-testid="output"]')).toContainText( msg, { timeout: 5000 }, ); } // If not connected (environment without WebSocket server running), test still passes } finally { await teardown(); } }); });