Files
trade-message-center/apps/chrome-extension/test/onetalk-websocket-tap.test.js
T

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, []);
});