import * as NodeServices from "@effect/platform-node/NodeServices"; import { describe, expect, it } from "@effect/vitest"; import * as Effect from "effect/Effect"; import * as FileSystem from "effect/FileSystem"; import * as Path from "effect/Path"; import * as Schema from "effect/Schema"; import { GrokSettings } from "@t3tools/contracts"; import { buildInitialGrokProviderSnapshot, checkGrokProviderStatus } from "./GrokProvider.ts"; const decodeGrokSettings = Schema.decodeSync(GrokSettings); describe("buildInitialGrokProviderSnapshot", () => { it.effect("returns a disabled snapshot when settings.enabled is false", () => Effect.gen(function* () { const snapshot = yield* buildInitialGrokProviderSnapshot( decodeGrokSettings({ enabled: false }), ); expect(snapshot.enabled).toBe(false); expect(snapshot.status).toBe("disabled"); expect(snapshot.installed).toBe(false); expect(snapshot.message).toContain("disabled"); }), ); it.effect("returns a pending snapshot by default", () => Effect.gen(function* () { const snapshot = yield* buildInitialGrokProviderSnapshot(decodeGrokSettings({})); expect(snapshot.enabled).toBe(true); expect(snapshot.installed).toBe(true); expect(snapshot.status).toBe("warning"); expect(snapshot.version).toBeNull(); expect(snapshot.message).toContain("Checking Grok"); expect(snapshot.requiresNewThreadForModelChange).toBe(true); }), ); }); it.layer(NodeServices.layer)("checkGrokProviderStatus", (it) => { it.effect("reports the binary as missing when the binary path does not resolve", () => Effect.gen(function* () { const snapshot = yield* checkGrokProviderStatus( decodeGrokSettings({ enabled: true, binaryPath: "/definitely/not/installed/grok-binary", }), ); expect(snapshot.enabled).toBe(true); expect(snapshot.installed).toBe(false); expect(snapshot.status).toBe("error"); expect(snapshot.message).toMatch(/not installed|not on PATH|Failed to execute/); }), ); it.effect("reports an installed CLI as unhealthy when --version exits non-zero", () => Effect.gen(function* () { const secretStderr = "broken grok install: secret-token-value"; const snapshot = yield* Effect.scoped( Effect.gen(function* () { const fs = yield* FileSystem.FileSystem; const path = yield* Path.Path; const dir = yield* fs.makeTempDirectoryScoped({ prefix: "t3code-grok-version-" }); const grokPath = path.join(dir, "grok"); yield* fs.writeFileString( grokPath, ["#!/bin/sh", `printf "%s\\n" "${secretStderr}" >&2`, "exit 2", ""].join("\n"), ); yield* fs.chmod(grokPath, 0o755); return yield* checkGrokProviderStatus( decodeGrokSettings({ enabled: true, binaryPath: grokPath }), ); }), ); expect(snapshot.enabled).toBe(true); expect(snapshot.installed).toBe(true); expect(snapshot.status).toBe("error"); expect(snapshot.message).toBe("Grok CLI is installed but failed to run."); expect(snapshot.message).not.toContain(secretStderr); }), ); it.effect("reports an error when ACP model discovery is unavailable", () => Effect.gen(function* () { const snapshot = yield* Effect.scoped( Effect.gen(function* () { const fs = yield* FileSystem.FileSystem; const path = yield* Path.Path; const dir = yield* fs.makeTempDirectoryScoped({ prefix: "t3code-grok-success-" }); const grokPath = path.join(dir, "grok"); yield* fs.writeFileString( grokPath, ["#!/bin/sh", 'printf "grok-cli 0.0.99\\n"', "exit 0", ""].join("\n"), ); yield* fs.chmod(grokPath, 0o755); return yield* checkGrokProviderStatus( decodeGrokSettings({ enabled: true, binaryPath: grokPath }), ); }), ); expect(snapshot.status).toBe("error"); expect(snapshot.installed).toBe(true); expect(snapshot.models.map((model) => model.slug)).toEqual(["grok-build"]); expect(snapshot.message).toContain("ACP startup failed"); }), ); });