179 lines
4.4 KiB
JavaScript
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",
|
|
});
|
|
});
|
|
});
|