openclaw/extensions/zalouser/src/probe.test.ts

61 lines
1.6 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { probeZalouser } from "./probe.js";
import { getZaloUserInfo } from "./zalo-js.js";
vi.mock("./zalo-js.js", () => ({
getZaloUserInfo: vi.fn(),
}));
const mockGetUserInfo = vi.mocked(getZaloUserInfo);
describe("probeZalouser", () => {
beforeEach(() => {
mockGetUserInfo.mockReset();
});
afterEach(() => {
vi.useRealTimers();
});
it("returns ok=true with user when authenticated", async () => {
mockGetUserInfo.mockResolvedValueOnce({
userId: "123",
displayName: "Alice",
});
await expect(probeZalouser("default")).resolves.toEqual({
ok: true,
user: { userId: "123", displayName: "Alice" },
});
});
it("returns not authenticated when no user info is returned", async () => {
mockGetUserInfo.mockResolvedValueOnce(null);
await expect(probeZalouser("default")).resolves.toEqual({
ok: false,
error: "Not authenticated",
});
});
it("returns error when user lookup throws", async () => {
mockGetUserInfo.mockRejectedValueOnce(new Error("network down"));
await expect(probeZalouser("default")).resolves.toEqual({
ok: false,
error: "network down",
});
});
it("times out when lookup takes too long", async () => {
vi.useFakeTimers();
mockGetUserInfo.mockReturnValueOnce(new Promise(() => undefined));
const pending = probeZalouser("default", 10);
await vi.advanceTimersByTimeAsync(1000);
await expect(pending).resolves.toEqual({
ok: false,
error: "Not authenticated",
});
});
});