forked from syntaxbullet/AuroraBot-discord
feat: implement websocket realtime data streaming
This commit is contained in:
54
src/web/websocket.test.ts
Normal file
54
src/web/websocket.test.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
import { describe, expect, it, afterAll, beforeAll } from "bun:test";
|
||||
import { WebServer } from "./server";
|
||||
|
||||
describe("WebSocket Server", () => {
|
||||
// Start server on a random port
|
||||
const port = 0;
|
||||
|
||||
beforeAll(() => {
|
||||
WebServer.start(port);
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
WebServer.stop();
|
||||
});
|
||||
|
||||
it("should accept websocket connection and send welcome message", async () => {
|
||||
// We need to know the actual port assigned by Bun if we passed 0.
|
||||
// But WebServer stores it in private static server.
|
||||
// We can't access it easily unless we expose it or use a known port.
|
||||
// Let's rely on the fact that if we pass 0, we can't easily know the port without exposing it.
|
||||
// So for this test, let's pick a random high port to avoid conflict: 40000 + Math.floor(Math.random() * 1000)
|
||||
|
||||
// Actually, let's restart with a known port 8081 for testing
|
||||
WebServer.stop();
|
||||
const testPort = 8081;
|
||||
WebServer.start(testPort);
|
||||
|
||||
const ws = new WebSocket(`ws://localhost:${testPort}/ws`);
|
||||
|
||||
const messagePromise = new Promise<any>((resolve) => {
|
||||
ws.onmessage = (event) => {
|
||||
resolve(JSON.parse(event.data as string));
|
||||
};
|
||||
});
|
||||
|
||||
const msg = await messagePromise;
|
||||
expect(msg.type).toBe("WELCOME");
|
||||
expect(msg.message).toContain("Connected");
|
||||
|
||||
ws.close();
|
||||
});
|
||||
|
||||
it("should reject non-ws upgrade requests on /ws endpoint via http", async () => {
|
||||
const testPort = 8081;
|
||||
// Just a normal fetch to /ws should fail with 426 Upgrade Required usually,
|
||||
// but our implementation returns "WebSocket upgrade failed" 500 or undefined -> 101 Switching Protocols if valid.
|
||||
// If we send a normal GET request to /ws without Upgrade headers, server.upgrade(req) returns false.
|
||||
// So it returns status 500 "WebSocket upgrade failed" based on our code.
|
||||
|
||||
const res = await fetch(`http://localhost:${testPort}/ws`);
|
||||
expect(res.status).toBe(500);
|
||||
expect(await res.text()).toBe("WebSocket upgrade failed");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user