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", ); });});
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",
);
});
});