socket/src/test/messages.test.ts
2025-01-07 15:17:51 -05:00

77 lines
2.5 KiB
TypeScript

import { test, describe, expect } from "bun:test";
import { SocketSpeak } from "../messages";
import { ManagedSocketError } from "../errors";
import { NON_RECONNECT_CODES, SocketDisconnectCode } from "../constants";
describe("createDataMessage()", () => {
test("wraps the provided data in a message object", () => {
const data = { foo: "bar" };
const message = SocketSpeak.createDataMessage(data);
expect(message).toEqual({ type: "message", data });
});
});
describe("createHeartbeatMessage()", () => {
test("creates a heartbeat message with the current timestamp", () => {
const message = SocketSpeak.createHeartbeatMessage();
expect(message.type).toBe("heartbeat");
expect(message.data).toBeTypeOf("string");
});
});
describe("serialize()", () => {
test("serializes a SocketMessage object into a JSON string", () => {
const message = SocketSpeak.createDataMessage({ foo: "bar" });
const serialized = SocketSpeak.serialize(message) as string;
expect(serialized).toBe(JSON.stringify(message));
});
});
describe("deserialize()", () => {
test("deserializes a JSON string into a SocketMessage object", () => {
const message = SocketSpeak.createDataMessage({ foo: "bar" });
const serialized = SocketSpeak.serialize(message);
const deserialized = SocketSpeak.deserialize(serialized);
expect(deserialized).toEqual(message);
});
test("throws an error if the JSON string cannot be parsed", () => {
const invalidData = "invalid";
expect(() => SocketSpeak.deserialize(invalidData)).toThrow(
ManagedSocketError,
);
});
test("throws an error if the message shape is invalid", () => {
const invalidData = JSON.stringify({ type: "invalid" });
expect(() => SocketSpeak.deserialize(invalidData)).toThrow(
ManagedSocketError,
);
});
});
describe("prepare()", () => {
test("serializes and wraps the provided data in a message object", () => {
const data = { foo: "bar" };
const message = SocketSpeak.prepare(data);
expect(message).toEqual(SocketSpeak.serialize({ type: "message", data }));
});
});
describe("isCatatrophicCloseCode()", () => {
test("returns for codes in the catastrophic list", () => {
for (const code of NON_RECONNECT_CODES) {
expect(SocketSpeak.isCatastrophicCloseCode(code)).toBe(true);
}
});
test("returns false for other close codes", () => {
expect(
SocketSpeak.isCatastrophicCloseCode(
SocketDisconnectCode.CLOSE_SERVICE_RESTART,
),
).toBe(false);
});
});