mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 10:11:24 +00:00
101 lines
3.0 KiB
TypeScript
101 lines
3.0 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
import type { RuntimeEnv } from "../runtime.js";
|
|
|
|
const mocks = vi.hoisted(() => ({
|
|
text: vi.fn(),
|
|
select: vi.fn(),
|
|
confirm: vi.fn(),
|
|
resolveGatewayPort: vi.fn(),
|
|
buildGatewayAuthConfig: vi.fn(),
|
|
note: vi.fn(),
|
|
randomToken: vi.fn(),
|
|
}));
|
|
|
|
vi.mock("../config/config.js", async (importActual) => {
|
|
const actual = await importActual<typeof import("../config/config.js")>();
|
|
return {
|
|
...actual,
|
|
resolveGatewayPort: mocks.resolveGatewayPort,
|
|
};
|
|
});
|
|
|
|
vi.mock("./configure.shared.js", () => ({
|
|
text: mocks.text,
|
|
select: mocks.select,
|
|
confirm: mocks.confirm,
|
|
}));
|
|
|
|
vi.mock("../terminal/note.js", () => ({
|
|
note: mocks.note,
|
|
}));
|
|
|
|
vi.mock("./configure.gateway-auth.js", () => ({
|
|
buildGatewayAuthConfig: mocks.buildGatewayAuthConfig,
|
|
}));
|
|
|
|
vi.mock("../infra/tailscale.js", () => ({
|
|
findTailscaleBinary: vi.fn(async () => undefined),
|
|
}));
|
|
|
|
vi.mock("./onboard-helpers.js", async (importActual) => {
|
|
const actual = await importActual<typeof import("./onboard-helpers.js")>();
|
|
return {
|
|
...actual,
|
|
randomToken: mocks.randomToken,
|
|
};
|
|
});
|
|
|
|
import { promptGatewayConfig } from "./configure.gateway.js";
|
|
|
|
describe("promptGatewayConfig", () => {
|
|
it("generates a token when the prompt returns undefined", async () => {
|
|
mocks.resolveGatewayPort.mockReturnValue(18789);
|
|
const selectQueue = ["loopback", "token", "off"];
|
|
mocks.select.mockImplementation(async () => selectQueue.shift());
|
|
const textQueue = ["18789", undefined];
|
|
mocks.text.mockImplementation(async () => textQueue.shift());
|
|
mocks.randomToken.mockReturnValue("generated-token");
|
|
mocks.buildGatewayAuthConfig.mockImplementation(({ mode, token, password }) => ({
|
|
mode,
|
|
token,
|
|
password,
|
|
}));
|
|
|
|
const runtime: RuntimeEnv = {
|
|
log: vi.fn(),
|
|
error: vi.fn(),
|
|
exit: vi.fn(),
|
|
};
|
|
|
|
const result = await promptGatewayConfig({}, runtime);
|
|
expect(result.token).toBe("generated-token");
|
|
});
|
|
it("does not set password to literal 'undefined' when prompt returns undefined", async () => {
|
|
vi.clearAllMocks();
|
|
mocks.resolveGatewayPort.mockReturnValue(18789);
|
|
// Flow: loopback bind → password auth → tailscale off
|
|
const selectQueue = ["loopback", "password", "off"];
|
|
mocks.select.mockImplementation(async () => selectQueue.shift());
|
|
// Port prompt → OK, then password prompt → returns undefined (simulating prompter edge case)
|
|
const textQueue = ["18789", undefined];
|
|
mocks.text.mockImplementation(async () => textQueue.shift());
|
|
mocks.randomToken.mockReturnValue("unused");
|
|
mocks.buildGatewayAuthConfig.mockImplementation(({ mode, token, password }) => ({
|
|
mode,
|
|
token,
|
|
password,
|
|
}));
|
|
|
|
const runtime: RuntimeEnv = {
|
|
log: vi.fn(),
|
|
error: vi.fn(),
|
|
exit: vi.fn(),
|
|
};
|
|
|
|
await promptGatewayConfig({}, runtime);
|
|
const call = mocks.buildGatewayAuthConfig.mock.calls[0]?.[0];
|
|
expect(call?.password).not.toBe("undefined");
|
|
expect(call?.password).toBe("");
|
|
});
|
|
});
|