import { describe, expect, it } from "vitest"; import type { OpenClawConfig } from "../../config/config.js"; import { resolveGatewayTokenForDriftCheck } from "./gateway-token-drift.js"; describe("resolveGatewayTokenForDriftCheck", () => { it("prefers persisted config token over shell env", () => { const token = resolveGatewayTokenForDriftCheck({ cfg: { gateway: { mode: "local", auth: { token: "config-token", }, }, } as OpenClawConfig, env: { OPENCLAW_GATEWAY_TOKEN: "env-token", } as NodeJS.ProcessEnv, }); expect(token).toBe("config-token"); }); it("does not fall back to caller env for unresolved config token refs", () => { expect(() => resolveGatewayTokenForDriftCheck({ cfg: { secrets: { providers: { default: { source: "env" }, }, }, gateway: { mode: "local", auth: { token: { source: "env", provider: "default", id: "OPENCLAW_GATEWAY_TOKEN" }, }, }, } as OpenClawConfig, env: { OPENCLAW_GATEWAY_TOKEN: "env-token", } as NodeJS.ProcessEnv, }), ).toThrow(/gateway\.auth\.token/i); }); it("does not fall back to gateway.remote token for unresolved local token refs", () => { expect(() => resolveGatewayTokenForDriftCheck({ cfg: { secrets: { providers: { default: { source: "env" }, }, }, gateway: { mode: "local", auth: { mode: "token", token: { source: "env", provider: "default", id: "MISSING_LOCAL_TOKEN" }, }, remote: { token: "remote-token", }, }, } as OpenClawConfig, env: {} as NodeJS.ProcessEnv, }), ).toThrow(/gateway\.auth\.token/i); }); });