338 lines · 10.2 KB · TypeScript
RawDownload
import {  DEFAULT_SERVER_SETTINGS,  ProviderDriverKind,  ProviderInstanceId,  type ServerProvider,} from "@t3tools/contracts";import { describe, expect, it } from "vite-plus/test"; import {  getOnboardingProviderState,  resolveOnboardingProviderInstallCommand,  resolveOnboardingProviderLoginCommand,  selectOnboardingProvidersByDriver,} from "./providerReadiness.logic"; const readyCodex: ServerProvider = {  instanceId: ProviderInstanceId.make("codex"),  driver: ProviderDriverKind.make("codex"),  enabled: true,  installed: true,  version: "1.0.0",  status: "ready",  auth: { status: "unknown" },  checkedAt: "2026-08-23T00:00:00.000Z",  models: [],  slashCommands: [],  skills: [],}; describe("getOnboardingProviderState", () => {  it("treats an enabled Codex provider with ready status and unknown authentication as ready", () => {    expect(getOnboardingProviderState(readyCodex)).toBe("ready");  });   it("treats authenticated providers as ready only when their provider status is ready", () => {    expect(getOnboardingProviderState({ ...readyCodex, auth: { status: "authenticated" } })).toBe(      "ready",    );    expect(      getOnboardingProviderState({        ...readyCodex,        auth: { status: "authenticated" },        status: "error",      }),    ).toBe("attention");    expect(      getOnboardingProviderState({        ...readyCodex,        auth: { status: "authenticated" },        status: "warning",      }),    ).toBe("attention");  });   it("offers sign-in only when the server reports an authentication failure", () => {    expect(      getOnboardingProviderState({        ...readyCodex,        status: "error",        auth: { status: "unauthenticated" },      }),    ).toBe("signIn");    expect(getOnboardingProviderState({ ...readyCodex, status: "error" })).toBe("attention");    expect(getOnboardingProviderState({ ...readyCodex, status: "warning" })).toBe("attention");  });   it("does not offer installation or sign-in for disabled providers", () => {    expect(getOnboardingProviderState({ ...readyCodex, enabled: false, installed: false })).toBe(      "disabled",    );    expect(getOnboardingProviderState({ ...readyCodex, status: "disabled" })).toBe("disabled");  });   it("offers installation only when an enabled provider is missing", () => {    expect(getOnboardingProviderState({ ...readyCodex, installed: false, status: "error" })).toBe(      "install",    );  });   it("waits for a provider snapshot before offering an action", () => {    expect(getOnboardingProviderState(undefined)).toBe("checking");  });}); describe("selectOnboardingProvidersByDriver", () => {  it("prefers a ready instance with unknown authentication to an unauthenticated instance", () => {    const signedOutCodex: ServerProvider = {      ...readyCodex,      instanceId: ProviderInstanceId.make("codex_work"),      status: "error",      auth: { status: "unauthenticated" },    };     expect(selectOnboardingProvidersByDriver([signedOutCodex, readyCodex]).get("codex")).toBe(      readyCodex,    );  });   it("prefers a provider with an actionable sign-in over a failed provider", () => {    const failedCodex: ServerProvider = { ...readyCodex, status: "error" };    const signedOutCodex: ServerProvider = {      ...readyCodex,      instanceId: ProviderInstanceId.make("codex_work"),      status: "error",      auth: { status: "unauthenticated" },    };     expect(selectOnboardingProvidersByDriver([failedCodex, signedOutCodex]).get("codex")).toBe(      signedOutCodex,    );  });   it("prefers installed providers over missing or disabled instances", () => {    const disabledCodex: ServerProvider = { ...readyCodex, enabled: false };    const missingCodex: ServerProvider = {      ...readyCodex,      instanceId: ProviderInstanceId.make("codex_work"),      installed: false,      status: "error",    };     expect(      selectOnboardingProvidersByDriver([disabledCodex, missingCodex, readyCodex]).get("codex"),    ).toBe(readyCodex);  });   it("handles provider snapshots that have not arrived", () => {    expect(selectOnboardingProvidersByDriver(undefined).size).toBe(0);  });   it("keeps a ready custom account when the default account is signed out", () => {    const signedOutDefault: ServerProvider = {      ...readyCodex,      status: "error",      auth: { status: "unauthenticated" },    };    const readyCustom: ServerProvider = {      ...readyCodex,      instanceId: ProviderInstanceId.make("codex_work"),    };     expect(selectOnboardingProvidersByDriver([signedOutDefault, readyCustom]).get("codex")).toBe(      readyCustom,    );  });}); describe("resolveOnboardingProviderLoginCommand", () => {  it("uses the selected Codex account binary", () => {    const provider = { ...readyCodex, instanceId: ProviderInstanceId.make("codex_work") };     expect(      resolveOnboardingProviderLoginCommand(        provider,        {          ...DEFAULT_SERVER_SETTINGS,          providerInstances: {            [provider.instanceId]: {              driver: provider.driver,              config: { binaryPath: "/opt/codex-work/bin/codex" },            },          },        },        "linux",      ),    ).toBe("/opt/codex-work/bin/codex login");  });   it("uses the selected Claude account binary", () => {    const provider: ServerProvider = {      ...readyCodex,      driver: ProviderDriverKind.make("claudeAgent"),      instanceId: ProviderInstanceId.make("claude_work"),    };     expect(      resolveOnboardingProviderLoginCommand(        provider,        {          ...DEFAULT_SERVER_SETTINGS,          providerInstances: {            [provider.instanceId]: {              driver: provider.driver,              config: { binaryPath: "/opt/claude-work/bin/claude" },            },          },        },        "linux",      ),    ).toBe("/opt/claude-work/bin/claude auth login");  });   it("quotes a Codex path with spaces for PowerShell", () => {    expect(      resolveOnboardingProviderLoginCommand(        readyCodex,        {          ...DEFAULT_SERVER_SETTINGS,          providers: {            ...DEFAULT_SERVER_SETTINGS.providers,            codex: {              ...DEFAULT_SERVER_SETTINGS.providers.codex,              binaryPath: "C:\\Program Files\\Codex & Tools\\codex.exe",            },          },        },        "windows",      ),    ).toBe("& 'C:\\Program Files\\Codex & Tools\\codex.exe' login");  });   it("quotes a Claude path with shell metacharacters on POSIX", () => {    const provider: ServerProvider = {      ...readyCodex,      driver: ProviderDriverKind.make("claudeAgent"),      instanceId: ProviderInstanceId.make("claude"),    };     expect(      resolveOnboardingProviderLoginCommand(        provider,        {          ...DEFAULT_SERVER_SETTINGS,          providers: {            ...DEFAULT_SERVER_SETTINGS.providers,            claudeAgent: {              ...DEFAULT_SERVER_SETTINGS.providers.claudeAgent,              binaryPath: "/opt/Claude Tools/$current/claude",            },          },        },        "linux",      ),    ).toBe("'/opt/Claude Tools/$current/claude' auth login");  });   it.each([    ["~/my tools/codex", "~/'my tools/codex' login"],    ["~\\my tools/codex", "~/'my tools/codex' login"],    ["~/tools/codex's build", `~/'tools/codex'"'"'s build' login`],    ["~\\tools\\codex's build", `~/'tools\\codex'"'"'s build' login`],    ["~/tools/codex; echo unsafe", "~/'tools/codex; echo unsafe' login"],  ])("keeps the home prefix expandable while quoting %s", (binaryPath, expectedCommand) => {    expect(      resolveOnboardingProviderLoginCommand(        readyCodex,        {          ...DEFAULT_SERVER_SETTINGS,          providers: {            ...DEFAULT_SERVER_SETTINGS.providers,            codex: {              ...DEFAULT_SERVER_SETTINGS.providers.codex,              binaryPath,            },          },        },        "linux",      ),    ).toBe(expectedCommand);  });   it.each(["darwin", "linux"] as const)("quotes backslashes in a Codex path on %s", (platform) => {    expect(      resolveOnboardingProviderLoginCommand(        readyCodex,        {          ...DEFAULT_SERVER_SETTINGS,          providers: {            ...DEFAULT_SERVER_SETTINGS.providers,            codex: {              ...DEFAULT_SERVER_SETTINGS.providers.codex,              binaryPath: "/opt/codex\\work/codex",            },          },        },        platform,      ),    ).toBe("'/opt/codex\\work/codex' login");  });   it("keeps a plain Windows path unquoted", () => {    expect(      resolveOnboardingProviderLoginCommand(        readyCodex,        {          ...DEFAULT_SERVER_SETTINGS,          providers: {            ...DEFAULT_SERVER_SETTINGS.providers,            codex: {              ...DEFAULT_SERVER_SETTINGS.providers.codex,              binaryPath: "C:\\Tools\\codex.exe",            },          },        },        "windows",      ),    ).toBe("C:\\Tools\\codex.exe login");  });   it("uses the default command when an old server reports an unknown shell", () => {    expect(      resolveOnboardingProviderLoginCommand(        readyCodex,        {          ...DEFAULT_SERVER_SETTINGS,          providers: {            ...DEFAULT_SERVER_SETTINGS.providers,            codex: {              ...DEFAULT_SERVER_SETTINGS.providers.codex,              binaryPath: "/opt/Codex Tools/codex",            },          },        },        "unknown",      ),    ).toBe("codex login");  });}); describe("resolveOnboardingProviderInstallCommand", () => {  it("uses the PowerShell installer on Windows environments", () => {    expect(resolveOnboardingProviderInstallCommand("codex", "windows")).toBe(      "irm https://chatgpt.com/codex/install.ps1 | iex",    );    expect(resolveOnboardingProviderInstallCommand("claudeAgent", "windows")).toBe(      "irm https://claude.ai/install.ps1 | iex",    );  });   it.each(["darwin", "linux", "unknown"] as const)("uses the shell installer on %s", (platform) => {    expect(resolveOnboardingProviderInstallCommand("codex", platform)).toBe(      "curl -fsSL https://chatgpt.com/codex/install.sh | sh",    );    expect(resolveOnboardingProviderInstallCommand("claudeAgent", platform)).toBe(      "curl -fsSL https://claude.ai/install.sh | bash",    );  });});

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t