import { describe, expect, it } from "vitest"; import type { OpenClawConfig } from "../config/config.js"; import { withEnvAsync } from "../test-utils/env.js"; import { resolveNodeHostGatewayCredentials } from "./runner.js"; function createRemoteGatewayTokenRefConfig(tokenId: string): OpenClawConfig { return { secrets: { providers: { default: { source: "env" }, }, }, gateway: { mode: "remote", remote: { token: { source: "env", provider: "default", id: tokenId }, }, }, } as OpenClawConfig; } describe("resolveNodeHostGatewayCredentials", () => { it("resolves remote token SecretRef values", async () => { const config = createRemoteGatewayTokenRefConfig("REMOTE_GATEWAY_TOKEN"); await withEnvAsync( { OPENCLAW_GATEWAY_TOKEN: undefined, REMOTE_GATEWAY_TOKEN: "token-from-ref", }, async () => { const credentials = await resolveNodeHostGatewayCredentials({ config }); expect(credentials.token).toBe("token-from-ref"); }, ); }); it("prefers OPENCLAW_GATEWAY_TOKEN over configured refs", async () => { const config = createRemoteGatewayTokenRefConfig("REMOTE_GATEWAY_TOKEN"); await withEnvAsync( { OPENCLAW_GATEWAY_TOKEN: "token-from-env", REMOTE_GATEWAY_TOKEN: "token-from-ref", }, async () => { const credentials = await resolveNodeHostGatewayCredentials({ config }); expect(credentials.token).toBe("token-from-env"); }, ); }); it("throws when a configured remote token ref cannot resolve", async () => { const config = createRemoteGatewayTokenRefConfig("MISSING_REMOTE_GATEWAY_TOKEN"); await withEnvAsync( { OPENCLAW_GATEWAY_TOKEN: undefined, MISSING_REMOTE_GATEWAY_TOKEN: undefined, }, async () => { await expect(resolveNodeHostGatewayCredentials({ config })).rejects.toThrow( "gateway.remote.token", ); }, ); }); it("does not resolve remote password refs when token auth is already available", async () => { const config = { secrets: { providers: { default: { source: "env" }, }, }, gateway: { mode: "remote", remote: { token: { source: "env", provider: "default", id: "REMOTE_GATEWAY_TOKEN" }, password: { source: "env", provider: "default", id: "MISSING_REMOTE_GATEWAY_PASSWORD" }, }, }, } as OpenClawConfig; await withEnvAsync( { OPENCLAW_GATEWAY_TOKEN: undefined, OPENCLAW_GATEWAY_PASSWORD: undefined, REMOTE_GATEWAY_TOKEN: "token-from-ref", MISSING_REMOTE_GATEWAY_PASSWORD: undefined, }, async () => { const credentials = await resolveNodeHostGatewayCredentials({ config }); expect(credentials.token).toBe("token-from-ref"); expect(credentials.password).toBeUndefined(); }, ); }); });