182 lines
5 KiB
TypeScript
182 lines
5 KiB
TypeScript
|
import WS from "jest-websocket-mock";
|
||
|
import Stream from "../src/streaming";
|
||
|
|
||
|
describe("Streaming", () => {
|
||
|
test("useChannel", async () => {
|
||
|
const server = new WS("wss://firefish.test/streaming");
|
||
|
const stream = new Stream("https://firefish.test", { token: "TOKEN" });
|
||
|
const mainChannelReceived: any[] = [];
|
||
|
const main = stream.useChannel("main");
|
||
|
main.on("meUpdated", (payload) => {
|
||
|
mainChannelReceived.push(payload);
|
||
|
});
|
||
|
|
||
|
const ws = await server.connected;
|
||
|
expect(new URLSearchParams(new URL(ws.url).search).get("i")).toEqual(
|
||
|
"TOKEN",
|
||
|
);
|
||
|
|
||
|
const msg = JSON.parse((await server.nextMessage) as string);
|
||
|
const mainChannelId = msg.body.id;
|
||
|
expect(msg.type).toEqual("connect");
|
||
|
expect(msg.body.channel).toEqual("main");
|
||
|
expect(mainChannelId != null).toEqual(true);
|
||
|
|
||
|
server.send(
|
||
|
JSON.stringify({
|
||
|
type: "channel",
|
||
|
body: {
|
||
|
id: mainChannelId,
|
||
|
type: "meUpdated",
|
||
|
body: {
|
||
|
id: "foo",
|
||
|
},
|
||
|
},
|
||
|
}),
|
||
|
);
|
||
|
|
||
|
expect(mainChannelReceived[0]).toEqual({
|
||
|
id: "foo",
|
||
|
});
|
||
|
|
||
|
stream.close();
|
||
|
server.close();
|
||
|
});
|
||
|
|
||
|
test("useChannel with parameters", async () => {
|
||
|
const server = new WS("wss://firefish.test/streaming");
|
||
|
const stream = new Stream("https://firefish.test", { token: "TOKEN" });
|
||
|
const messagingChannelReceived: any[] = [];
|
||
|
const messaging = stream.useChannel("messaging", { otherparty: "aaa" });
|
||
|
messaging.on("message", (payload) => {
|
||
|
messagingChannelReceived.push(payload);
|
||
|
});
|
||
|
|
||
|
const ws = await server.connected;
|
||
|
expect(new URLSearchParams(new URL(ws.url).search).get("i")).toEqual(
|
||
|
"TOKEN",
|
||
|
);
|
||
|
|
||
|
const msg = JSON.parse((await server.nextMessage) as string);
|
||
|
const messagingChannelId = msg.body.id;
|
||
|
expect(msg.type).toEqual("connect");
|
||
|
expect(msg.body.channel).toEqual("messaging");
|
||
|
expect(msg.body.params).toEqual({ otherparty: "aaa" });
|
||
|
expect(messagingChannelId != null).toEqual(true);
|
||
|
|
||
|
server.send(
|
||
|
JSON.stringify({
|
||
|
type: "channel",
|
||
|
body: {
|
||
|
id: messagingChannelId,
|
||
|
type: "message",
|
||
|
body: {
|
||
|
id: "foo",
|
||
|
},
|
||
|
},
|
||
|
}),
|
||
|
);
|
||
|
|
||
|
expect(messagingChannelReceived[0]).toEqual({
|
||
|
id: "foo",
|
||
|
});
|
||
|
|
||
|
stream.close();
|
||
|
server.close();
|
||
|
});
|
||
|
|
||
|
test("ちゃんとチャンネルごとにidが異なる", async () => {
|
||
|
const server = new WS("wss://firefish.test/streaming");
|
||
|
const stream = new Stream("https://firefish.test", { token: "TOKEN" });
|
||
|
|
||
|
stream.useChannel("messaging", { otherparty: "aaa" });
|
||
|
stream.useChannel("messaging", { otherparty: "bbb" });
|
||
|
|
||
|
const ws = await server.connected;
|
||
|
expect(new URLSearchParams(new URL(ws.url).search).get("i")).toEqual(
|
||
|
"TOKEN",
|
||
|
);
|
||
|
|
||
|
const msg = JSON.parse((await server.nextMessage) as string);
|
||
|
const messagingChannelId = msg.body.id;
|
||
|
const msg2 = JSON.parse((await server.nextMessage) as string);
|
||
|
const messagingChannelId2 = msg2.body.id;
|
||
|
|
||
|
expect(messagingChannelId != null).toEqual(true);
|
||
|
expect(messagingChannelId2 != null).toEqual(true);
|
||
|
expect(messagingChannelId).not.toEqual(messagingChannelId2);
|
||
|
|
||
|
stream.close();
|
||
|
server.close();
|
||
|
});
|
||
|
|
||
|
test("Connection#send", async () => {
|
||
|
const server = new WS("wss://firefish.test/streaming");
|
||
|
const stream = new Stream("https://firefish.test", { token: "TOKEN" });
|
||
|
|
||
|
const messaging = stream.useChannel("messaging", { otherparty: "aaa" });
|
||
|
messaging.send("read", { id: "aaa" });
|
||
|
|
||
|
const ws = await server.connected;
|
||
|
expect(new URLSearchParams(new URL(ws.url).search).get("i")).toEqual(
|
||
|
"TOKEN",
|
||
|
);
|
||
|
|
||
|
const connectMsg = JSON.parse((await server.nextMessage) as string);
|
||
|
const channelId = connectMsg.body.id;
|
||
|
const msg = JSON.parse((await server.nextMessage) as string);
|
||
|
|
||
|
expect(msg.type).toEqual("ch");
|
||
|
expect(msg.body.id).toEqual(channelId);
|
||
|
expect(msg.body.type).toEqual("read");
|
||
|
expect(msg.body.body).toEqual({ id: "aaa" });
|
||
|
|
||
|
stream.close();
|
||
|
server.close();
|
||
|
});
|
||
|
|
||
|
test("Connection#dispose", async () => {
|
||
|
const server = new WS("wss://firefish.test/streaming");
|
||
|
const stream = new Stream("https://firefish.test", { token: "TOKEN" });
|
||
|
const mainChannelReceived: any[] = [];
|
||
|
const main = stream.useChannel("main");
|
||
|
main.on("meUpdated", (payload) => {
|
||
|
mainChannelReceived.push(payload);
|
||
|
});
|
||
|
|
||
|
const ws = await server.connected;
|
||
|
expect(new URLSearchParams(new URL(ws.url).search).get("i")).toEqual(
|
||
|
"TOKEN",
|
||
|
);
|
||
|
|
||
|
const msg = JSON.parse((await server.nextMessage) as string);
|
||
|
const mainChannelId = msg.body.id;
|
||
|
expect(msg.type).toEqual("connect");
|
||
|
expect(msg.body.channel).toEqual("main");
|
||
|
expect(mainChannelId != null).toEqual(true);
|
||
|
main.dispose();
|
||
|
|
||
|
server.send(
|
||
|
JSON.stringify({
|
||
|
type: "channel",
|
||
|
body: {
|
||
|
id: mainChannelId,
|
||
|
type: "meUpdated",
|
||
|
body: {
|
||
|
id: "foo",
|
||
|
},
|
||
|
},
|
||
|
}),
|
||
|
);
|
||
|
|
||
|
expect(mainChannelReceived.length).toEqual(0);
|
||
|
|
||
|
stream.close();
|
||
|
server.close();
|
||
|
});
|
||
|
|
||
|
// TODO: SharedConnection#dispose して一定時間経ったら disconnect メッセージがサーバーに送られてくるかのテスト
|
||
|
|
||
|
// TODO: チャンネル接続が使いまわされるかのテスト
|
||
|
});
|