forked from EduCraft/curriculum-project-hub
feat: secure organization Feishu credentials
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
||||
import { FeishuReadinessError, probeFeishuApplication } from "../../src/connections/feishuReadiness.js";
|
||||
|
||||
describe("Feishu application readiness", () => {
|
||||
afterEach(() => {
|
||||
vi.unstubAllGlobals();
|
||||
});
|
||||
|
||||
it("authenticates the app and verifies the exact bot identity", async () => {
|
||||
const fetchMock = vi.fn()
|
||||
.mockResolvedValueOnce(Response.json({ code: 0, tenant_access_token: "tenant-secret" }))
|
||||
.mockResolvedValueOnce(Response.json({ code: 0, bot: { open_id: "ou_expected" } }));
|
||||
vi.stubGlobal("fetch", fetchMock);
|
||||
|
||||
await expect(probeFeishuApplication({
|
||||
appId: "cli_expected",
|
||||
appSecret: "app-secret",
|
||||
botOpenId: "ou_expected",
|
||||
})).resolves.toBeUndefined();
|
||||
|
||||
expect(fetchMock).toHaveBeenCalledTimes(2);
|
||||
expect(fetchMock.mock.calls[1]?.[0]).toBe("https://open.feishu.cn/open-apis/bot/v3/info");
|
||||
expect(fetchMock.mock.calls[1]?.[1]).toMatchObject({
|
||||
method: "GET",
|
||||
redirect: "manual",
|
||||
headers: { authorization: "Bearer tenant-secret" },
|
||||
});
|
||||
});
|
||||
|
||||
it("rejects a valid app credential paired with the wrong bot id", async () => {
|
||||
vi.stubGlobal("fetch", vi.fn()
|
||||
.mockResolvedValueOnce(Response.json({ code: 0, tenant_access_token: "tenant-secret" }))
|
||||
.mockResolvedValueOnce(Response.json({ code: 0, bot: { open_id: "ou_actual" } })));
|
||||
|
||||
const failure = probeFeishuApplication({
|
||||
appId: "cli_expected",
|
||||
appSecret: "app-secret",
|
||||
botOpenId: "ou_wrong",
|
||||
});
|
||||
await expect(failure).rejects.toBeInstanceOf(FeishuReadinessError);
|
||||
await expect(failure).rejects.toMatchObject({
|
||||
code: "feishu_readiness_rejected",
|
||||
category: "provider_rejection",
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user