Spaces:
Paused
Paused
| 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/); | |
| }); | |
| }); | |