99 lines
2.7 KiB
TypeScript
99 lines
2.7 KiB
TypeScript
import fs from "node:fs";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
import { writeContext } from "../client/context.js";
|
|
import { resolveCommandContext } from "../commands/client/common.js";
|
|
|
|
const ORIGINAL_ENV = { ...process.env };
|
|
|
|
function createTempPath(name: string): string {
|
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "paperclip-cli-common-"));
|
|
return path.join(dir, name);
|
|
}
|
|
|
|
describe("resolveCommandContext", () => {
|
|
beforeEach(() => {
|
|
process.env = { ...ORIGINAL_ENV };
|
|
delete process.env.PAPERCLIP_API_URL;
|
|
delete process.env.PAPERCLIP_API_KEY;
|
|
delete process.env.PAPERCLIP_COMPANY_ID;
|
|
});
|
|
|
|
afterEach(() => {
|
|
process.env = { ...ORIGINAL_ENV };
|
|
});
|
|
|
|
it("uses profile defaults when options/env are not provided", () => {
|
|
const contextPath = createTempPath("context.json");
|
|
|
|
writeContext(
|
|
{
|
|
version: 1,
|
|
currentProfile: "ops",
|
|
profiles: {
|
|
ops: {
|
|
apiBase: "http://127.0.0.1:9999",
|
|
companyId: "company-profile",
|
|
apiKeyEnvVarName: "AGENT_KEY",
|
|
},
|
|
},
|
|
},
|
|
contextPath,
|
|
);
|
|
process.env.AGENT_KEY = "key-from-env";
|
|
|
|
const resolved = resolveCommandContext({ context: contextPath }, { requireCompany: true });
|
|
expect(resolved.api.apiBase).toBe("http://127.0.0.1:9999");
|
|
expect(resolved.companyId).toBe("company-profile");
|
|
expect(resolved.api.apiKey).toBe("key-from-env");
|
|
});
|
|
|
|
it("prefers explicit options over profile values", () => {
|
|
const contextPath = createTempPath("context.json");
|
|
writeContext(
|
|
{
|
|
version: 1,
|
|
currentProfile: "default",
|
|
profiles: {
|
|
default: {
|
|
apiBase: "http://profile:3100",
|
|
companyId: "company-profile",
|
|
},
|
|
},
|
|
},
|
|
contextPath,
|
|
);
|
|
|
|
const resolved = resolveCommandContext(
|
|
{
|
|
context: contextPath,
|
|
apiBase: "http://override:3200",
|
|
apiKey: "direct-token",
|
|
companyId: "company-override",
|
|
},
|
|
{ requireCompany: true },
|
|
);
|
|
|
|
expect(resolved.api.apiBase).toBe("http://override:3200");
|
|
expect(resolved.companyId).toBe("company-override");
|
|
expect(resolved.api.apiKey).toBe("direct-token");
|
|
});
|
|
|
|
it("throws when company is required but unresolved", () => {
|
|
const contextPath = createTempPath("context.json");
|
|
writeContext(
|
|
{
|
|
version: 1,
|
|
currentProfile: "default",
|
|
profiles: { default: {} },
|
|
},
|
|
contextPath,
|
|
);
|
|
|
|
expect(() =>
|
|
resolveCommandContext({ context: contextPath, apiBase: "http://localhost:3100" }, { requireCompany: true }),
|
|
).toThrow(/Company ID is required/);
|
|
});
|
|
});
|