Skip to content

Commit b4b7444

Browse files
committed
test[load]: add k6 load test structure verification
- Add 72 tests validating k6 config and source structure - Verify collab-session.ts exports, imports, and types - Verify load test configurations for different scenarios
1 parent 10b192d commit b4b7444

3 files changed

Lines changed: 456 additions & 1 deletion

File tree

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
import { describe, expect, it } from "bun:test";
2+
import { readFileSync } from "node:fs";
3+
import { join } from "node:path";
4+
5+
const LIB_DIR = join(import.meta.dir);
6+
7+
function readSource(path: string): string {
8+
return readFileSync(join(LIB_DIR, path), "utf-8");
9+
}
10+
11+
describe("collab-session.ts structure", () => {
12+
const src = readSource("collab-session.ts");
13+
14+
it("exports connectCollabSession function", () => {
15+
expect(src).toContain("export function connectCollabSession");
16+
});
17+
18+
it("accepts url, token, and workspaceId parameters", () => {
19+
expect(src).toContain("url: string");
20+
expect(src).toContain("token: string");
21+
expect(src).toContain("workspaceId: string");
22+
});
23+
24+
it("returns CollabSession type", () => {
25+
expect(src).toContain(": CollabSession");
26+
});
27+
28+
it("builds websocket URL correctly", () => {
29+
expect(src).toContain("/ws/collab/");
30+
expect(src).toContain("?token=");
31+
});
32+
33+
it("defines SyncData interface with ops array", () => {
34+
expect(src).toContain("interface SyncData");
35+
expect(src).toContain("ops: Array<{");
36+
expect(src).toContain("type: string;");
37+
expect(src).toContain("path: string;");
38+
expect(src).toContain("value: string;");
39+
expect(src).toContain("clock: number;");
40+
expect(src).toContain("origin: string;");
41+
});
42+
43+
it("defines AwarenessData interface", () => {
44+
expect(src).toContain("interface AwarenessData");
45+
expect(src).toContain("user: string;");
46+
expect(src).toContain("cursor: { line: number; col: number };");
47+
expect(src).toContain("lastSeen: number;");
48+
});
49+
50+
it("defines CollabSession interface with required methods", () => {
51+
expect(src).toContain("interface CollabSession");
52+
expect(src).toContain("sendSyncUpdate: (data: SyncData) => boolean");
53+
expect(src).toContain("sendAwarenessUpdate: (data: AwarenessData) => boolean");
54+
expect(src).toContain("disconnect: () => void");
55+
expect(src).toContain("established: boolean");
56+
});
57+
58+
it("initializes session with defaults before connection", () => {
59+
expect(src).toContain("established: false");
60+
expect(src).toContain("sendSyncUpdate: () => false");
61+
expect(src).toContain("sendAwarenessUpdate: () => false");
62+
});
63+
64+
it("measures connection duration", () => {
65+
expect(src).toContain("connectStart");
66+
expect(src).toContain("connectEnd");
67+
expect(src).toContain("wsConnectDuration.add(connectEnd - connectStart)");
68+
});
69+
70+
it("validates HTTP 101 status for WebSocket upgrade", () => {
71+
expect(src).toContain("status !== 101");
72+
});
73+
74+
it("sends init sync message on successful connection", () => {
75+
expect(src).toContain('"sync"');
76+
expect(src).toContain('"init"');
77+
});
78+
79+
it("sets up periodic ping at 30 second intervals", () => {
80+
expect(src).toContain("setInterval");
81+
expect(src).toContain("30000");
82+
expect(src).toContain('"ping"');
83+
});
84+
85+
it("tracks disconnect and error events", () => {
86+
expect(src).toContain('"close"');
87+
expect(src).toContain('"error"');
88+
expect(src).toContain("wsDisconnectCount.add(1)");
89+
expect(src).toContain("wsMessageFailures.add(1)");
90+
});
91+
92+
it("sendSyncUpdate wraps payload in try-catch", () => {
93+
const sendSyncBlock = src.slice(src.indexOf("sendSyncUpdate ="));
94+
expect(sendSyncBlock).toContain("try {");
95+
expect(sendSyncBlock).toContain("catch {");
96+
expect(sendSyncBlock).toContain("return true");
97+
expect(sendSyncBlock).toContain("return false");
98+
});
99+
100+
it("sendSyncUpdate includes workspaceId in payload", () => {
101+
const sendSyncBlock = src.slice(src.indexOf("sendSyncUpdate ="));
102+
expect(sendSyncBlock).toContain("workspaceId");
103+
expect(sendSyncBlock).toContain("timestamp: Date.now()");
104+
});
105+
106+
it("sendAwarenessUpdate wraps payload in try-catch", () => {
107+
const sendAwareBlock = src.slice(src.indexOf("sendAwarenessUpdate ="));
108+
expect(sendAwareBlock).toContain("try {");
109+
expect(sendAwareBlock).toContain("catch {");
110+
});
111+
112+
it("disconnect sends disconnect message then closes socket", () => {
113+
const disconnectBlock = src.slice(src.indexOf("disconnect ="));
114+
expect(disconnectBlock).toContain('"disconnect"');
115+
expect(disconnectBlock).toContain("socket.close()");
116+
});
117+
118+
it("imports k6/ws and k6/metrics", () => {
119+
expect(src).toContain('import ws from "k6/ws"');
120+
expect(src).toContain('from "k6/metrics"');
121+
});
122+
123+
it("defines 4 custom metrics", () => {
124+
expect(src).toContain("ws_connect_success");
125+
expect(src).toContain("ws_connect_duration");
126+
expect(src).toContain("ws_disconnect_count");
127+
expect(src).toContain("ws_message_failures");
128+
});
129+
});

0 commit comments

Comments
 (0)