Skip to content

Commit

Permalink
test: different channels, same process
Browse files Browse the repository at this point in the history
Fixes #3
  • Loading branch information
hugojosefson committed Jul 2, 2023
1 parent 294fc4c commit 2ea3ba3
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 19 deletions.
10 changes: 10 additions & 0 deletions test/fn.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { assertNotStrictEquals } from "https://deno.land/std@0.192.0/testing/asserts.ts";

export const DEFAULT_TEST_TIMEOUT = 2000;

export function rejectOnTimeout<T>(
Expand All @@ -24,3 +26,11 @@ export function rejectOnTimeout<T>(
);
});
}

export function assertDifferentInstances<T>(xs: T[]) {
for (let i = 0; i < xs.length; i++) {
for (let j = i + 1; j < xs.length; j++) {
assertNotStrictEquals(xs[i], xs[j]);
}
}
}
100 changes: 81 additions & 19 deletions test/websocket-broadcastchannel.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@ import {
import {
assertEquals,
assertInstanceOf,
assertNotStrictEquals,
assertStrictEquals,
} from "https://deno.land/std@0.192.0/testing/asserts.ts";
import { createBroadcastChannel } from "../src/create-broadcast-channel.ts";
import { getAvailablePort } from "./get-available-port.ts";
import { defaultWebSocketUrl } from "../src/default-websocket-url.ts";
import { rejectOnTimeout } from "./fn.ts";
import { assertDifferentInstances, rejectOnTimeout } from "./fn.ts";
import { deferred } from "https://deno.land/std@0.192.0/async/deferred.ts";
import { using } from "../src/using.ts";
import { WebSocketBroadcastChannel } from "../mod.ts";
Expand All @@ -31,10 +30,12 @@ describe("websocket-broadcastchannel", () => {
() => createBroadcastChannel("chat", url),
() => createBroadcastChannel("chat", url),
],
([bc0, bc1]) => {
assertInstanceOf(bc0, WebSocketBroadcastChannel);
assertInstanceOf(bc1, WebSocketBroadcastChannel);
assertNotStrictEquals(bc0, bc1);
(channels) => {
assertEquals(channels.length, 2);
for (const channel of channels) {
assertInstanceOf(channel, WebSocketBroadcastChannel);
}
assertDifferentInstances(channels);
},
);
});
Expand Down Expand Up @@ -71,12 +72,12 @@ describe("websocket-broadcastchannel", () => {
() => createBroadcastChannel("chat", url),
() => createBroadcastChannel("chat", url),
],
([bc0, bc1, bc2]) => {
assertInstanceOf(bc0, WebSocketBroadcastChannel);
assertInstanceOf(bc1, WebSocketBroadcastChannel);
assertInstanceOf(bc2, WebSocketBroadcastChannel);
assertNotStrictEquals(bc0, bc1);
assertNotStrictEquals(bc0, bc2);
(channels) => {
assertEquals(channels.length, 3);
for (const channel of channels) {
assertInstanceOf(channel, WebSocketBroadcastChannel);
}
assertDifferentInstances(channels);
},
);
});
Expand Down Expand Up @@ -105,21 +106,82 @@ describe("websocket-broadcastchannel", () => {
bc1.onmessage = collectMessages(1);
bc2.onmessage = collectMessages(2);

bc0.postMessage("test0");
bc1.postMessage("test1");
bc2.postMessage("test2");
bc0.postMessage("from bc0");
bc1.postMessage("from bc1");
bc2.postMessage("from bc2");
await rejectOnTimeout(doneDeferred);
assertEquals(receivedMessages, [
["test1", "test2"],
["test0", "test2"],
["test0", "test1"],
["from bc1", "from bc2"],
["from bc0", "from bc2"],
["from bc0", "from bc1"],
]);
},
);
});
});
});
describe("2 instances w/ channel name 'chat2' and 3 instances w/ channel name 'chat3'", () => {
it("should send one message from each, to the others", async () => {});
it("should send one message from each, to the others of the same name", async () => {
await using(
[
() => createBroadcastChannel("chat2", url),
() => createBroadcastChannel("chat2", url),
() => createBroadcastChannel("chat3", url),
() => createBroadcastChannel("chat3", url),
() => createBroadcastChannel("chat3", url),
],
async ([chat2a, chat2b, chat3a, chat3b, chat3c]) => {
const chat2DoneDeferred = deferred<void>();
const chat3DoneDeferred = deferred<void>();
const chat2ExpectedCount = 2;
const chat3ExpectedCount = 6;
let chat2ReceivedCount = 0;
let chat3ReceivedCount = 0;
const chat2ReceivedMessages: string[][] = [[], []];
const chat3ReceivedMessages: string[][] = [[], [], []];
const collectChat2Messages =
(index: number): (e: MessageEvent<string>) => void => (e) => {
chat2ReceivedMessages[index].push(e.data);
chat2ReceivedCount++;
if (chat2ReceivedCount === chat2ExpectedCount) {
chat2DoneDeferred.resolve();
}
};
const collectChat3Messages =
(index: number): (e: MessageEvent<string>) => void => (e) => {
chat3ReceivedMessages[index].push(e.data);
chat3ReceivedCount++;
if (chat3ReceivedCount === chat3ExpectedCount) {
chat3DoneDeferred.resolve();
}
};

chat2a.onmessage = collectChat2Messages(0);
chat2b.onmessage = collectChat2Messages(1);

chat3a.onmessage = collectChat3Messages(0);
chat3b.onmessage = collectChat3Messages(1);
chat3c.onmessage = collectChat3Messages(2);

chat2a.postMessage("from chat2a");
chat2b.postMessage("from chat2b");

chat3a.postMessage("from chat3a");
chat3b.postMessage("from chat3b");
chat3c.postMessage("from chat3c");

await rejectOnTimeout([chat2DoneDeferred, chat3DoneDeferred]);
assertEquals(chat2ReceivedMessages, [
["from chat2b"],
["from chat2a"],
]);
assertEquals(chat3ReceivedMessages, [
["from chat3b", "from chat3c"],
["from chat3a", "from chat3c"],
["from chat3a", "from chat3b"],
]);
},
);
});
});
});

0 comments on commit 2ea3ba3

Please sign in to comment.