authorgravatar for julius0216@outlook.comjulius <julius0216@outlook.com> 2026-03-04 04:37:42-08:00
committergravatar for jmarminge@gmail.comJulius Marminge <jmarminge@gmail.com> 2026-03-03 21:03:16-08:00
log3d0233e3b0071ba3cab0d0a8a3585d955979e234
tree1ebd90985e2cd22d050bb67d3ca55b83bd0286bd
parent64f2c3a46565d8cd401351072b5b11494b5eccd0

fmt test


1 files changed, 59 insertions(+), 70 deletions(-)

apps/server/src/provider/Layers/ProviderHealth.test.ts+59-70
......@@ -2,7 +2,6 @@ import { assert, it } from "@effect/vitest";
22import { Effect, Layer, Sink, Stream } from "effect";
33import * as PlatformError from "effect/PlatformError";
44import { ChildProcessSpawner } from "effect/unstable/process";
5import { expect } from "vitest";
65
76import { checkCodexProviderStatus, parseAuthStatusFromOutput } from "./ProviderHealth";
87
......@@ -56,17 +55,13 @@ function failingSpawnerLayer(description: string) {
5655// ── Tests ───────────────────────────────────────────────────────────
5756
5857it.effect("returns ready when codex is installed and authenticated", () =>
59 checkCodexProviderStatus.pipe(
60 Effect.map((status) => {
61 expect(status).toEqual(
62 expect.objectContaining({
63 provider: "codex",
64 status: "ready",
65 available: true,
66 authStatus: "authenticated",
67 }),
68 );
69 }),
58 Effect.gen(function* () {
59 const status = yield* checkCodexProviderStatus;
60 assert.strictEqual(status.provider, "codex");
61 assert.strictEqual(status.status, "ready");
62 assert.strictEqual(status.available, true);
63 assert.strictEqual(status.authStatus, "authenticated");
64 }).pipe(
7065 Effect.provide(
7166 mockSpawnerLayer((args) => {
7267 const joined = args.join(" ");
......@@ -79,35 +74,28 @@ it.effect("returns ready when codex is installed and authenticated", () =>
7974);
8075
8176it.effect("returns unavailable when codex is missing", () =>
82 checkCodexProviderStatus.pipe(
83 Effect.map((status) => {
84 expect(status).toEqual(
85 expect.objectContaining({
86 provider: "codex",
87 status: "error",
88 available: false,
89 authStatus: "unknown",
90 message: "Codex CLI (`codex`) is not installed or not on PATH.",
91 }),
92 );
93 }),
94 Effect.provide(failingSpawnerLayer("spawn codex ENOENT")),
95 ),
77 Effect.gen(function* () {
78 const status = yield* checkCodexProviderStatus;
79 assert.strictEqual(status.provider, "codex");
80 assert.strictEqual(status.status, "error");
81 assert.strictEqual(status.available, false);
82 assert.strictEqual(status.authStatus, "unknown");
83 assert.strictEqual(status.message, "Codex CLI (`codex`) is not installed or not on PATH.");
84 }).pipe(Effect.provide(failingSpawnerLayer("spawn codex ENOENT"))),
9685);
9786
9887it.effect("returns unauthenticated when auth probe reports login required", () =>
99 checkCodexProviderStatus.pipe(
100 Effect.map((status) => {
101 expect(status).toEqual(
102 expect.objectContaining({
103 provider: "codex",
104 status: "error",
105 available: true,
106 authStatus: "unauthenticated",
107 message: "Codex CLI is not authenticated. Run `codex login` and try again.",
108 }),
109 );
110 }),
88 Effect.gen(function* () {
89 const status = yield* checkCodexProviderStatus;
90 assert.strictEqual(status.provider, "codex");
91 assert.strictEqual(status.status, "error");
92 assert.strictEqual(status.available, true);
93 assert.strictEqual(status.authStatus, "unauthenticated");
94 assert.strictEqual(
95 status.message,
96 "Codex CLI is not authenticated. Run `codex login` and try again.",
97 );
98 }).pipe(
11199 Effect.provide(
112100 mockSpawnerLayer((args) => {
113101 const joined = args.join(" ");
......@@ -121,43 +109,44 @@ it.effect("returns unauthenticated when auth probe reports login required", () =
121109 ),
122110);
123111
124it.effect("returns unauthenticated when login status output includes 'not logged in'", () =>
125 checkCodexProviderStatus.pipe(
126 Effect.map((status) => {
127 expect(status).toEqual(
128 expect.objectContaining({
129 provider: "codex",
130 status: "error",
131 available: true,
132 authStatus: "unauthenticated",
133 message: "Codex CLI is not authenticated. Run `codex login` and try again.",
134 }),
112it.effect(
113 "returns unauthenticated when login status output includes 'not logged in'",
114 () =>
115 Effect.gen(function* () {
116 const status = yield* checkCodexProviderStatus;
117 assert.strictEqual(status.provider, "codex");
118 assert.strictEqual(status.status, "error");
119 assert.strictEqual(status.available, true);
120 assert.strictEqual(status.authStatus, "unauthenticated");
121 assert.strictEqual(
122 status.message,
123 "Codex CLI is not authenticated. Run `codex login` and try again.",
135124 );
136 }),
137 Effect.provide(
138 mockSpawnerLayer((args) => {
139 const joined = args.join(" ");
140 if (joined === "--version") return { stdout: "codex 1.0.0\n", stderr: "", code: 0 };
141 if (joined === "login status") return { stdout: "Not logged in\n", stderr: "", code: 1 };
142 throw new Error(`Unexpected args: ${joined}`);
143 }),
125 }).pipe(
126 Effect.provide(
127 mockSpawnerLayer((args) => {
128 const joined = args.join(" ");
129 if (joined === "--version") return { stdout: "codex 1.0.0\n", stderr: "", code: 0 };
130 if (joined === "login status")
131 return { stdout: "Not logged in\n", stderr: "", code: 1 };
132 throw new Error(`Unexpected args: ${joined}`);
133 }),
134 ),
144135 ),
145 ),
146136);
147137
148138it.effect("returns warning when login status command is unsupported", () =>
149 checkCodexProviderStatus.pipe(
150 Effect.map((status) => {
151 expect(status).toEqual(
152 expect.objectContaining({
153 provider: "codex",
154 status: "warning",
155 available: true,
156 authStatus: "unknown",
157 message: "Codex CLI authentication status command is unavailable in this Codex version.",
158 }),
159 );
160 }),
139 Effect.gen(function* () {
140 const status = yield* checkCodexProviderStatus;
141 assert.strictEqual(status.provider, "codex");
142 assert.strictEqual(status.status, "warning");
143 assert.strictEqual(status.available, true);
144 assert.strictEqual(status.authStatus, "unknown");
145 assert.strictEqual(
146 status.message,
147 "Codex CLI authentication status command is unavailable in this Codex version.",
148 );
149 }).pipe(
161150 Effect.provide(
162151 mockSpawnerLayer((args) => {
163152 const joined = args.join(" ");