hn-hlw-service/hlw/tencent-im/index.test.js
2026-07-30 16:49:41 +08:00

179 lines
4.4 KiB
JavaScript

jest.mock("../../request", () => ({
main: jest.fn(),
}));
jest.mock("../utils/config", () => ({
getConfig: jest.fn(),
}));
jest.mock("./TLSSigAPIv2", () => ({
Api: jest.fn(),
}));
const request = require("../../request");
const { getConfig } = require("../utils/config");
const TLSSigAPIv2 = require("./TLSSigAPIv2");
const tencentIM = require("./index");
describe("tencent-im", () => {
beforeEach(() => {
jest.clearAllMocks();
jest.spyOn(console, "log").mockImplementation(() => {});
jest.spyOn(console, "error").mockImplementation(() => {});
getConfig.mockResolvedValue({
sdkAppId: 1600000000,
identifier: "administrator",
secretKey: "test-secret",
});
TLSSigAPIv2.Api.mockImplementation(() => ({
genSig: jest.fn(() => "test-user-sig"),
}));
});
afterEach(() => {
jest.restoreAllMocks();
});
test("imports a new account", async () => {
request.main.mockResolvedValue({
ActionStatus: "OK",
ErrorCode: 0,
ErrorInfo: "",
});
const result = await tencentIM({
type: "importAccount",
account: "WZTEST001",
corpId: "corp-1",
});
expect(result).toEqual({
success: true,
message: "腾讯 IM 账号导入成功",
});
expect(request.main).toHaveBeenCalledWith(
expect.stringContaining("/v4/im_open_login_svc/account_import?"),
{ Identifier: "WZTEST001" },
"POST"
);
});
test("treats repeated successful imports as success", async () => {
request.main.mockResolvedValue({
ActionStatus: "OK",
ErrorCode: 0,
ErrorInfo: "",
});
const first = await tencentIM({
type: "importAccount",
account: "WZTEST001",
corpId: "corp-1",
});
const second = await tencentIM({
type: "importAccount",
account: "WZTEST001",
corpId: "corp-1",
});
expect(first.success).toBe(true);
expect(second.success).toBe(true);
expect(request.main).toHaveBeenCalledTimes(2);
});
test("preserves Tencent error details when an import returns HTTP 200 with FAIL", async () => {
request.main.mockResolvedValue({
ActionStatus: "FAIL",
ErrorCode: 70001,
ErrorInfo: "import failed",
});
const result = await tencentIM({
type: "importAccount",
account: "WZTEST002",
corpId: "corp-1",
});
expect(result).toMatchObject({
success: false,
message: "腾讯 IM 账号导入失败",
errorCode: 70001,
errorInfo: "import failed",
});
});
test("does not report sendmsg ErrorCode 20003 as success", async () => {
request.main.mockResolvedValue({
ActionStatus: "FAIL",
ErrorCode: 20003,
ErrorInfo: "Invalid sender or receiver identifier!",
});
const result = await tencentIM({
type: "sendSystemNotification",
formAccount: "WZTEST003",
toAccount: "000001",
SyncOtherMachine: 2,
corpId: "corp-1",
msgBody: [],
});
expect(result).toMatchObject({
success: false,
errorCode: 20003,
errorInfo: "Invalid sender or receiver identifier!",
});
});
test("returns a diagnostic error when IM configuration is incomplete", async () => {
getConfig.mockResolvedValue({});
const result = await tencentIM({
type: "importAccount",
account: "WZTEST004",
corpId: "corp-1",
});
expect(result).toMatchObject({
success: false,
message: "未找到完整的企业 IM 配置",
});
expect(request.main).not.toHaveBeenCalled();
});
test("returns a diagnostic error when UserSig generation fails", async () => {
TLSSigAPIv2.Api.mockImplementation(() => ({
genSig: jest.fn(() => {
throw new Error("signature failure");
}),
}));
const result = await tencentIM({
type: "importAccount",
account: "WZTEST005",
corpId: "corp-1",
});
expect(result).toMatchObject({
success: false,
message: "生成 UserSig 失败",
error: "signature failure",
});
expect(request.main).not.toHaveBeenCalled();
});
test("returns a diagnostic error on network failure", async () => {
request.main.mockRejectedValue(new Error("network unavailable"));
const result = await tencentIM({
type: "importAccount",
account: "WZTEST006",
corpId: "corp-1",
});
expect(result).toMatchObject({
success: false,
message: "腾讯 IM 账号导入失败",
error: "network unavailable",
});
});
});