mirror of
https://github.com/sinanyuntu/trade-message-center.git
synced 2026-09-17 13:22:11 +08:00
194 lines
6.2 KiB
JavaScript
194 lines
6.2 KiB
JavaScript
// 验证 OneTalk WebSocket 消息观察行为
|
|
|
|
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
|
|
import { installOneTalkMessageObserver } from "../src/onetalk/main-page/message-observer/entry.ts";
|
|
|
|
class FakeWebSocket extends EventTarget {
|
|
static CONNECTING = 0;
|
|
static OPEN = 1;
|
|
static CLOSING = 2;
|
|
static CLOSED = 3;
|
|
|
|
constructor(url, protocols) {
|
|
super();
|
|
this.url = String(url);
|
|
this.protocols = protocols;
|
|
}
|
|
|
|
receive(data) {
|
|
this.dispatchEvent(new MessageEvent("message", { data }));
|
|
}
|
|
}
|
|
|
|
function testPageWindow() {
|
|
const logs = [];
|
|
return {
|
|
logs,
|
|
pageWindow: {
|
|
WebSocket: FakeWebSocket,
|
|
console: {
|
|
log(...args) {
|
|
logs.push(args);
|
|
},
|
|
},
|
|
},
|
|
};
|
|
}
|
|
|
|
test("prints raw messages from the OneTalk WebSocket", () => {
|
|
const { logs, pageWindow } = testPageWindow();
|
|
|
|
installOneTalkMessageObserver(pageWindow);
|
|
const socket = new pageWindow.WebSocket("wss://wss-icbu.dingtalk.com/");
|
|
const payload = { raw: "unchanged" };
|
|
socket.receive(payload);
|
|
|
|
assert.ok(socket instanceof FakeWebSocket);
|
|
assert.equal(pageWindow.WebSocket.OPEN, FakeWebSocket.OPEN);
|
|
assert.equal(logs.length, 1);
|
|
assert.equal(logs[0][1], payload);
|
|
});
|
|
|
|
test("prints plaintext messages from conversation response frames", () => {
|
|
const { logs, pageWindow } = testPageWindow();
|
|
|
|
installOneTalkMessageObserver(pageWindow);
|
|
const socket = new pageWindow.WebSocket("wss://wss-icbu.dingtalk.com/");
|
|
const message = {
|
|
messageId: "4264696193791.PNM",
|
|
cid: "2208314000798-2500002169502#11011@icbu",
|
|
createAt: 1787649815828,
|
|
content: { text: { content: "找你真难" }, contentType: 1 },
|
|
sender: { uid: "2208314000798@icbu" },
|
|
unreadCount: 0,
|
|
};
|
|
const frame = JSON.stringify({
|
|
code: 200,
|
|
body: [
|
|
{
|
|
singleChatUserConversation: {
|
|
lastMessage: { message, readStatus: 2, msgStatus: 1 },
|
|
singleChatConversation: {
|
|
pairFirst: "2208314000798@icbu",
|
|
pairSecond: "2500002169502@icbu",
|
|
},
|
|
},
|
|
},
|
|
],
|
|
});
|
|
socket.receive(frame);
|
|
|
|
assert.equal(logs.length, 2);
|
|
assert.equal(logs[1][0], "[Trade Message Center][OneTalk new message]");
|
|
assert.equal(logs[0][1], frame);
|
|
assert.deepEqual(logs[1][1], {
|
|
messageType: "new",
|
|
conversationId: "2208314000798-2500002169502#11011@icbu",
|
|
messageId: "4264696193791.PNM",
|
|
sentAt: 1787649815828,
|
|
contentType: 1,
|
|
text: "找你真难",
|
|
senderId: "2208314000798@icbu",
|
|
participantIds: ["2208314000798@icbu", "2500002169502@icbu"],
|
|
direction: "received",
|
|
readStatus: 2,
|
|
messageStatus: 1,
|
|
unreadCount: 0,
|
|
});
|
|
});
|
|
|
|
test("prints messages from history response frames", () => {
|
|
const { logs, pageWindow } = testPageWindow();
|
|
|
|
installOneTalkMessageObserver(pageWindow);
|
|
const socket = new pageWindow.WebSocket("wss://wss-icbu.dingtalk.com/");
|
|
const frame = JSON.stringify({
|
|
code: 200,
|
|
body: {
|
|
nextCursor: 1787157210197,
|
|
hasMore: 1,
|
|
userMessageModels: [
|
|
{
|
|
readStatus: 2,
|
|
msgStatus: 1,
|
|
message: {
|
|
messageId: "4268023992386.PNM",
|
|
cid: "2208314000798-2500002169502#11011@icbu",
|
|
createAt: 1787212003008,
|
|
content: { text: { content: "我需要深色的" }, contentType: 1 },
|
|
sender: { uid: "2500002169502@icbu" },
|
|
unreadCount: 0,
|
|
},
|
|
},
|
|
{
|
|
readStatus: 2,
|
|
msgStatus: 1,
|
|
message: {
|
|
messageId: "4260308763261.PNM",
|
|
cid: "2208314000798-2500002169502#11011@icbu",
|
|
createAt: 1787210475840,
|
|
content: { custom: { type: 10010 }, contentType: 101 },
|
|
sender: { uid: "2500002169502@icbu" },
|
|
unreadCount: 0,
|
|
},
|
|
},
|
|
],
|
|
},
|
|
});
|
|
socket.receive(frame);
|
|
|
|
assert.equal(logs.length, 3);
|
|
assert.equal(logs[1][0], "[Trade Message Center][OneTalk history message]");
|
|
assert.deepEqual(logs[1][1], {
|
|
messageType: "history",
|
|
conversationId: "2208314000798-2500002169502#11011@icbu",
|
|
messageId: "4268023992386.PNM",
|
|
sentAt: 1787212003008,
|
|
contentType: 1,
|
|
text: "我需要深色的",
|
|
senderId: "2500002169502@icbu",
|
|
participantIds: ["2208314000798@icbu", "2500002169502@icbu"],
|
|
direction: "sent",
|
|
readStatus: 2,
|
|
messageStatus: 1,
|
|
unreadCount: 0,
|
|
});
|
|
assert.equal(logs[2][0], "[Trade Message Center][OneTalk history message]");
|
|
assert.equal(logs[2][1].contentType, 101);
|
|
assert.equal(logs[2][1].text, null);
|
|
});
|
|
|
|
test("does not treat sync push packages as plaintext messages", () => {
|
|
const { logs, pageWindow } = testPageWindow();
|
|
|
|
installOneTalkMessageObserver(pageWindow);
|
|
const socket = new pageWindow.WebSocket("wss://wss-icbu.dingtalk.com/");
|
|
socket.receive(
|
|
JSON.stringify({
|
|
lwp: "/s/sync",
|
|
body: { syncPushPackage: { data: [{ data: "encoded" }] } },
|
|
}),
|
|
);
|
|
|
|
assert.equal(logs.length, 1);
|
|
});
|
|
|
|
test("ignores other hosts and installs only once", () => {
|
|
const { logs, pageWindow } = testPageWindow();
|
|
|
|
installOneTalkMessageObserver(pageWindow);
|
|
const installedConstructor = pageWindow.WebSocket;
|
|
installOneTalkMessageObserver(pageWindow);
|
|
|
|
assert.equal(pageWindow.WebSocket, installedConstructor);
|
|
|
|
const unrelated = new pageWindow.WebSocket("wss://example.com/");
|
|
const lookalike = new pageWindow.WebSocket("wss://wss-icbu.dingtalk.com.example.com/");
|
|
unrelated.receive("unrelated");
|
|
lookalike.receive("lookalike");
|
|
|
|
assert.deepEqual(logs, []);
|
|
});
|