| import { describe, expect, it } from "vitest"; |
| import type { OpenClawConfig } from "../config/config.js"; |
| import { evaluateGatewayAuthSurfaceStates } from "./runtime-gateway-auth-surfaces.js"; |
|
|
| const EMPTY_ENV = {} as NodeJS.ProcessEnv; |
|
|
| function envRef(id: string) { |
| return { source: "env", provider: "default", id } as const; |
| } |
|
|
| function evaluate(config: OpenClawConfig, env: NodeJS.ProcessEnv = EMPTY_ENV) { |
| return evaluateGatewayAuthSurfaceStates({ |
| config, |
| env, |
| }); |
| } |
|
|
| describe("evaluateGatewayAuthSurfaceStates", () => { |
| it("marks gateway.auth.token active when token mode is explicit", () => { |
| const states = evaluate({ |
| gateway: { |
| auth: { |
| mode: "token", |
| token: envRef("GW_AUTH_TOKEN"), |
| }, |
| }, |
| } as OpenClawConfig); |
|
|
| expect(states["gateway.auth.token"]).toMatchObject({ |
| hasSecretRef: true, |
| active: true, |
| reason: 'gateway.auth.mode is "token".', |
| }); |
| }); |
|
|
| it("marks gateway.auth.token inactive when env token is configured", () => { |
| const states = evaluate( |
| { |
| gateway: { |
| auth: { |
| mode: "token", |
| token: envRef("GW_AUTH_TOKEN"), |
| }, |
| }, |
| } as OpenClawConfig, |
| { OPENCLAW_GATEWAY_TOKEN: "env-token" } as NodeJS.ProcessEnv, |
| ); |
|
|
| expect(states["gateway.auth.token"]).toMatchObject({ |
| hasSecretRef: true, |
| active: false, |
| reason: "gateway token env var is configured.", |
| }); |
| }); |
|
|
| it("marks gateway.auth.token inactive when password mode is explicit", () => { |
| const states = evaluate({ |
| gateway: { |
| auth: { |
| mode: "password", |
| token: envRef("GW_AUTH_TOKEN"), |
| }, |
| }, |
| } as OpenClawConfig); |
|
|
| expect(states["gateway.auth.token"]).toMatchObject({ |
| hasSecretRef: true, |
| active: false, |
| reason: 'gateway.auth.mode is "password".', |
| }); |
| }); |
|
|
| it("marks gateway.auth.password active when password mode is explicit", () => { |
| const states = evaluate({ |
| gateway: { |
| auth: { |
| mode: "password", |
| password: envRef("GW_AUTH_PASSWORD"), |
| }, |
| }, |
| } as OpenClawConfig); |
|
|
| expect(states["gateway.auth.password"]).toMatchObject({ |
| hasSecretRef: true, |
| active: true, |
| reason: 'gateway.auth.mode is "password".', |
| }); |
| }); |
|
|
| it("marks gateway.auth.password inactive when env token is configured", () => { |
| const states = evaluate( |
| { |
| gateway: { |
| auth: { |
| password: envRef("GW_AUTH_PASSWORD"), |
| }, |
| }, |
| } as OpenClawConfig, |
| { OPENCLAW_GATEWAY_TOKEN: "env-token" } as NodeJS.ProcessEnv, |
| ); |
|
|
| expect(states["gateway.auth.password"]).toMatchObject({ |
| hasSecretRef: true, |
| active: false, |
| reason: "gateway token env var is configured.", |
| }); |
| }); |
|
|
| it("marks gateway.remote.token active when remote token fallback is active", () => { |
| const states = evaluate({ |
| gateway: { |
| mode: "local", |
| remote: { |
| token: envRef("GW_REMOTE_TOKEN"), |
| }, |
| }, |
| } as OpenClawConfig); |
|
|
| expect(states["gateway.remote.token"]).toMatchObject({ |
| hasSecretRef: true, |
| active: true, |
| reason: "local token auth can win and no env/auth token is configured.", |
| }); |
| }); |
|
|
| it("marks gateway.remote.token inactive when token auth cannot win", () => { |
| const states = evaluate({ |
| gateway: { |
| auth: { |
| mode: "password", |
| }, |
| remote: { |
| token: envRef("GW_REMOTE_TOKEN"), |
| }, |
| }, |
| } as OpenClawConfig); |
|
|
| expect(states["gateway.remote.token"]).toMatchObject({ |
| hasSecretRef: true, |
| active: false, |
| reason: 'token auth cannot win with gateway.auth.mode="password".', |
| }); |
| }); |
|
|
| it("marks gateway.remote.token inactive when local token SecretRef is configured", () => { |
| const states = evaluate({ |
| gateway: { |
| mode: "local", |
| auth: { |
| mode: "token", |
| token: envRef("GW_AUTH_TOKEN"), |
| }, |
| remote: { |
| token: envRef("GW_REMOTE_TOKEN"), |
| }, |
| }, |
| } as OpenClawConfig); |
|
|
| expect(states["gateway.remote.token"]).toMatchObject({ |
| hasSecretRef: true, |
| active: false, |
| reason: "gateway.auth.token is configured.", |
| }); |
| }); |
|
|
| it("marks gateway.remote.password active when remote url is configured", () => { |
| const states = evaluate({ |
| gateway: { |
| remote: { |
| url: "wss://gateway.example.com", |
| password: envRef("GW_REMOTE_PASSWORD"), |
| }, |
| }, |
| } as OpenClawConfig); |
|
|
| expect(states["gateway.remote.password"].hasSecretRef).toBe(true); |
| expect(states["gateway.remote.password"].active).toBe(true); |
| expect(states["gateway.remote.password"].reason).toContain("remote surface is active:"); |
| expect(states["gateway.remote.password"].reason).toContain("gateway.remote.url is configured"); |
| }); |
|
|
| it("marks gateway.remote.password inactive when password auth cannot win", () => { |
| const states = evaluate({ |
| gateway: { |
| auth: { |
| mode: "token", |
| }, |
| remote: { |
| password: envRef("GW_REMOTE_PASSWORD"), |
| }, |
| }, |
| } as OpenClawConfig); |
|
|
| expect(states["gateway.remote.password"]).toMatchObject({ |
| hasSecretRef: true, |
| active: false, |
| reason: 'password auth cannot win with gateway.auth.mode="token".', |
| }); |
| }); |
| }); |
|
|