Skip to content

fix(site): add tests for createMockWebSocket #19172

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Aug 7, 2025
Merged
Prev Previous commit
Next Next commit
chore: get all initial tests passing
  • Loading branch information
Parkreiner committed Aug 5, 2025
commit 5eff4dfe314e658465530ede9c64c4960924f213
67 changes: 43 additions & 24 deletions site/src/testHelpers/websockets.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { subscribe } from "node:diagnostics_channel";
import { createMockWebSocket } from "./websockets";

describe(createMockWebSocket.name, () => {
Expand All @@ -13,8 +14,8 @@ describe(createMockWebSocket.name, () => {
}
})

it("Sends events from publisher to socket", () => {
const [socket, publisher] = createMockWebSocket("wss://www.dog.ceo/shake");
it("Sends events from server to socket", () => {
const [socket, server] = createMockWebSocket("wss://www.dog.ceo/shake");

const onOpen = jest.fn();
const onError = jest.fn();
Expand All @@ -31,10 +32,10 @@ describe(createMockWebSocket.name, () => {
const messageEvent = new MessageEvent<string>("message")
const closeEvent = new CloseEvent("close");

publisher.publishOpen(openEvent);
publisher.publishError(errorEvent);
publisher.publishMessage(messageEvent);
publisher.publishClose(closeEvent);
server.publishOpen(openEvent);
server.publishError(errorEvent);
server.publishMessage(messageEvent);
server.publishClose(closeEvent);

expect(onOpen).toHaveBeenCalledTimes(1);
expect(onOpen).toHaveBeenCalledWith(openEvent);
Expand All @@ -50,7 +51,7 @@ describe(createMockWebSocket.name, () => {
});

it("Sends JSON data to the socket for message events", () => {
const [socket, publisher] = createMockWebSocket("wss://www.dog.ceo/wag");
const [socket, server] = createMockWebSocket("wss://www.dog.ceo/wag");
const onMessage = jest.fn();

// Could type this as a special JSON type, but unknown is good enough,
Expand All @@ -74,7 +75,7 @@ describe(createMockWebSocket.name, () => {
];
for (const jd of jsonData) {
socket.addEventListener("message", onMessage);
publisher.publishMessage(new MessageEvent<string>("message", {
server.publishMessage(new MessageEvent<string>("message", {
"data": JSON.stringify(jd)
}));

Expand All @@ -89,7 +90,7 @@ describe(createMockWebSocket.name, () => {
})

it("Only registers each socket event handler once", () => {
const [socket, publisher] = createMockWebSocket("wss://www.dog.ceo/borf");
const [socket, server] = createMockWebSocket("wss://www.dog.ceo/borf");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

borf!!!


const onOpen = jest.fn();
const onError = jest.fn();
Expand All @@ -108,10 +109,10 @@ describe(createMockWebSocket.name, () => {
socket.addEventListener("message", onMessage);
socket.addEventListener("close", onClose);

publisher.publishOpen(new Event("open"));
publisher.publishError(new Event("error"));
publisher.publishMessage(new MessageEvent<string>("message"));
publisher.publishClose(new CloseEvent("close"));
server.publishOpen(new Event("open"));
server.publishError(new Event("error"));
server.publishMessage(new MessageEvent<string>("message"));
server.publishClose(new CloseEvent("close"));

expect(onOpen).toHaveBeenCalledTimes(1);
expect(onError).toHaveBeenCalledTimes(1);
Expand All @@ -120,7 +121,7 @@ describe(createMockWebSocket.name, () => {
});

it("Lets a socket unsubscribe to event types", () => {
const [socket, publisher] = createMockWebSocket("wss://www.dog.ceo/zoomies");
const [socket, server] = createMockWebSocket("wss://www.dog.ceo/zoomies");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

zoomies!!!


const onOpen = jest.fn();
const onError = jest.fn();
Expand All @@ -137,10 +138,10 @@ describe(createMockWebSocket.name, () => {
socket.removeEventListener("message", onMessage);
socket.removeEventListener("close", onClose);

publisher.publishOpen(new Event("open"));
publisher.publishError(new Event("error"));
publisher.publishMessage(new MessageEvent<string>("message"));
publisher.publishClose(new CloseEvent("close"));
server.publishOpen(new Event("open"));
server.publishError(new Event("error"));
server.publishMessage(new MessageEvent<string>("message"));
server.publishClose(new CloseEvent("close"));

expect(onOpen).not.toHaveBeenCalled();
expect(onError).not.toHaveBeenCalled();
Expand All @@ -149,20 +150,38 @@ describe(createMockWebSocket.name, () => {
});

it("Renders socket inert after being closed", () => {
const [socket, publisher] = createMockWebSocket("wss://www.dog.ceo/woof");
expect(publisher.isConnectionOpen).toBe(true);
const [socket, server] = createMockWebSocket("wss://www.dog.ceo/woof");
expect(server.isConnectionOpen).toBe(true);

const onMessage = jest.fn();
socket.addEventListener("message", onMessage);

socket.close();
expect(publisher.isConnectionOpen).toBe(false);
expect(server.isConnectionOpen).toBe(false);

publisher.publishMessage(new MessageEvent<string>("message"));
server.publishMessage(new MessageEvent<string>("message"));
expect(onMessage).not.toHaveBeenCalled();
});

it("Lets a socket send data to the mock server", () => {
expect.hasAssertions();
it("Tracks arguments sent by the mock socket", () => {
const [socket, server] = createMockWebSocket("wss://www.dog.ceo/wan-wan");
const data = JSON.stringify({
famousDogs: [
"snoopy",
"clifford",
"lassie",
"beethoven",
"courage the cowardly dog",
],
});

socket.send(data);
expect(server.socketSendArguments).toHaveLength(1);
expect(server.socketSendArguments).toEqual([data]);

socket.close();
socket.send(data);
expect(server.socketSendArguments).toHaveLength(1);
expect(server.socketSendArguments).toEqual([data]);
});
});
17 changes: 16 additions & 1 deletion site/src/testHelpers/websockets.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import type { WebSocketEventType } from "utils/OneWayWebSocket";

type SocketSendData = string | ArrayBufferLike | Blob | ArrayBufferView;

export type MockWebSocketServer = Readonly<{
publishMessage: (event: MessageEvent<string>) => void;
publishError: (event: Event) => void;
publishClose: (event: CloseEvent) => void;
publishOpen: (event: Event) => void;

readonly isConnectionOpen: boolean;
readonly socketSendArguments: readonly SocketSendData[];
}>;

export function createMockWebSocket(
Expand Down Expand Up @@ -44,6 +47,8 @@ export function createMockWebSocket(
open: [],
};

let sendData: SocketSendData[] = [];

const mockSocket: WebSocket = {
CONNECTING: 0,
OPEN: 1,
Expand All @@ -60,9 +65,15 @@ export function createMockWebSocket(
onerror: null,
onmessage: null,
onopen: null,
send: jest.fn(),
dispatchEvent: jest.fn(),

send: (data) => {
if (!isOpen) {
return;
}
sendData.push(data);
},

addEventListener: <E extends WebSocketEventType>(
eventType: E,
callback: (event: WebSocketEventMap[E]) => void,
Expand Down Expand Up @@ -102,6 +113,10 @@ export function createMockWebSocket(
return isOpen;
},

get socketSendArguments() {
return [...sendData];
},

publishOpen: (event) => {
if (!isOpen) {
return;
Expand Down