| import path from "node:path"; |
| import { describe, expect, it } from "vitest"; |
| import { |
| ACPX_BUNDLED_BIN, |
| ACPX_PINNED_VERSION, |
| createAcpxPluginConfigSchema, |
| resolveAcpxPluginConfig, |
| } from "./config.js"; |
|
|
| describe("acpx plugin config parsing", () => { |
| it("resolves bundled acpx with pinned version by default", () => { |
| const resolved = resolveAcpxPluginConfig({ |
| rawConfig: { |
| cwd: "/tmp/workspace", |
| }, |
| workspaceDir: "/tmp/workspace", |
| }); |
|
|
| expect(resolved.command).toBe(ACPX_BUNDLED_BIN); |
| expect(resolved.expectedVersion).toBe(ACPX_PINNED_VERSION); |
| expect(resolved.allowPluginLocalInstall).toBe(true); |
| expect(resolved.stripProviderAuthEnvVars).toBe(true); |
| expect(resolved.cwd).toBe(path.resolve("/tmp/workspace")); |
| expect(resolved.strictWindowsCmdWrapper).toBe(true); |
| }); |
|
|
| it("accepts command override and disables plugin-local auto-install", () => { |
| const command = "/home/user/repos/acpx/dist/cli.js"; |
| const resolved = resolveAcpxPluginConfig({ |
| rawConfig: { |
| command, |
| }, |
| workspaceDir: "/tmp/workspace", |
| }); |
|
|
| expect(resolved.command).toBe(path.resolve(command)); |
| expect(resolved.expectedVersion).toBeUndefined(); |
| expect(resolved.allowPluginLocalInstall).toBe(false); |
| expect(resolved.stripProviderAuthEnvVars).toBe(false); |
| }); |
|
|
| it("resolves relative command paths against workspace directory", () => { |
| const resolved = resolveAcpxPluginConfig({ |
| rawConfig: { |
| command: "../acpx/dist/cli.js", |
| }, |
| workspaceDir: "/home/user/repos/openclaw", |
| }); |
|
|
| expect(resolved.command).toBe(path.resolve("/home/user/repos/openclaw", "../acpx/dist/cli.js")); |
| expect(resolved.expectedVersion).toBeUndefined(); |
| expect(resolved.allowPluginLocalInstall).toBe(false); |
| expect(resolved.stripProviderAuthEnvVars).toBe(false); |
| }); |
|
|
| it("keeps bare command names as-is", () => { |
| const resolved = resolveAcpxPluginConfig({ |
| rawConfig: { |
| command: "acpx", |
| }, |
| workspaceDir: "/tmp/workspace", |
| }); |
|
|
| expect(resolved.command).toBe("acpx"); |
| expect(resolved.expectedVersion).toBeUndefined(); |
| expect(resolved.allowPluginLocalInstall).toBe(false); |
| expect(resolved.stripProviderAuthEnvVars).toBe(false); |
| }); |
|
|
| it("accepts exact expectedVersion override", () => { |
| const command = "/home/user/repos/acpx/dist/cli.js"; |
| const resolved = resolveAcpxPluginConfig({ |
| rawConfig: { |
| command, |
| expectedVersion: "0.1.99", |
| }, |
| workspaceDir: "/tmp/workspace", |
| }); |
|
|
| expect(resolved.command).toBe(path.resolve(command)); |
| expect(resolved.expectedVersion).toBe("0.1.99"); |
| expect(resolved.allowPluginLocalInstall).toBe(false); |
| expect(resolved.stripProviderAuthEnvVars).toBe(false); |
| }); |
|
|
| it("treats expectedVersion=any as no version constraint", () => { |
| const resolved = resolveAcpxPluginConfig({ |
| rawConfig: { |
| command: "/home/user/repos/acpx/dist/cli.js", |
| expectedVersion: "any", |
| }, |
| workspaceDir: "/tmp/workspace", |
| }); |
|
|
| expect(resolved.expectedVersion).toBeUndefined(); |
| }); |
|
|
| it("rejects commandArgs overrides", () => { |
| expect(() => |
| resolveAcpxPluginConfig({ |
| rawConfig: { |
| commandArgs: ["--foo"], |
| }, |
| workspaceDir: "/tmp/workspace", |
| }), |
| ).toThrow("unknown config key: commandArgs"); |
| }); |
|
|
| it("schema rejects empty cwd", () => { |
| const schema = createAcpxPluginConfigSchema(); |
| if (!schema.safeParse) { |
| throw new Error("acpx config schema missing safeParse"); |
| } |
| const parsed = schema.safeParse({ cwd: " " }); |
|
|
| expect(parsed.success).toBe(false); |
| }); |
|
|
| it("accepts strictWindowsCmdWrapper override", () => { |
| const resolved = resolveAcpxPluginConfig({ |
| rawConfig: { |
| strictWindowsCmdWrapper: true, |
| }, |
| workspaceDir: "/tmp/workspace", |
| }); |
|
|
| expect(resolved.strictWindowsCmdWrapper).toBe(true); |
| }); |
|
|
| it("rejects non-boolean strictWindowsCmdWrapper", () => { |
| expect(() => |
| resolveAcpxPluginConfig({ |
| rawConfig: { |
| strictWindowsCmdWrapper: "yes", |
| }, |
| workspaceDir: "/tmp/workspace", |
| }), |
| ).toThrow("strictWindowsCmdWrapper must be a boolean"); |
| }); |
| }); |
|
|