test more
This commit is contained in:
+29
-17
@@ -3,7 +3,7 @@ import { assertEquals } from "jsr:@std/assert";
|
|||||||
|
|
||||||
const url = "ws://0.0.0.0:6969";
|
const url = "ws://0.0.0.0:6969";
|
||||||
|
|
||||||
function connect(): Promise<WebSocket> {
|
function connect(url: string): Promise<WebSocket> {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const socket = new WebSocket(url);
|
const socket = new WebSocket(url);
|
||||||
socket.onopen = () => resolve(socket);
|
socket.onopen = () => resolve(socket);
|
||||||
@@ -26,34 +26,46 @@ function nextMessage(socket: WebSocket): Promise<unknown> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function closeAndWait(socket: WebSocket): Promise<void> {
|
function close(socket: WebSocket): Promise<void> {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
if (socket.readyState === WebSocket.CLOSED) return resolve();
|
if (socket.readyState === WebSocket.CLOSED) {
|
||||||
|
return resolve();
|
||||||
|
}
|
||||||
socket.onclose = () => resolve();
|
socket.onclose = () => resolve();
|
||||||
socket.close();
|
socket.close();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Deno.test("broadcasts a message from one client to another", async () => {
|
Deno.test("broadcasts a message on connect to all clients", async () => {
|
||||||
const a = await connect(); // 1
|
const s1 = await connect(url);
|
||||||
const b = await connect(); // 2
|
const s2 = await connect(url);
|
||||||
|
assertEquals(await nextMessage(s1), "2 has joined!");
|
||||||
|
|
||||||
const received = await nextMessage(b);
|
const s3 = connect(url);
|
||||||
assertEquals(received, "2 has joined!");
|
Promise.all([nextMessage(s1), nextMessage(s2)]).then((messages) => {
|
||||||
|
messages.forEach((message) => {
|
||||||
|
assertEquals(message, "3 has joined!");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
await closeAndWait(a);
|
await close(s1);
|
||||||
await closeAndWait(b);
|
await close(s2);
|
||||||
|
await close(await s3);
|
||||||
});
|
});
|
||||||
|
|
||||||
Deno.test("removes a client from broadcast after it disconnects", async () => {
|
Deno.test("removes a client from broadcast after it disconnects", async () => {
|
||||||
// test are executed in a row so the ID will just increment
|
const s4 = await connect(url);
|
||||||
const a = await connect(); // 3
|
const s5 = await connect(url);
|
||||||
const b = await connect(); // 4
|
const s6 = await connect(url);
|
||||||
|
|
||||||
await closeAndWait(b);
|
await close(s5);
|
||||||
|
|
||||||
const msg = await nextMessage(a);
|
Promise.all([nextMessage(s4), nextMessage(s6)]).then((messages) => {
|
||||||
assertEquals(msg, "4 has left!");
|
messages.forEach((message) => {
|
||||||
|
assertEquals(message, "5 has left!");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
await closeAndWait(a);
|
await close(s4);
|
||||||
|
await close(s6);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user