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