109 lines
3.3 KiB
TypeScript
109 lines
3.3 KiB
TypeScript
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();
|
|
}
|
|
});
|
|
});
|