import path from "node:path"; import * as NodeServices from "@effect/platform-node/NodeServices"; import { it } from "@effect/vitest"; import { Effect, FileSystem, Layer, PlatformError, Scope } from "effect"; import { describe, expect } from "vitest"; import { checkpointRefForThreadTurn } from "../Utils.ts"; import { CheckpointStoreLive } from "./CheckpointStore.ts"; import { CheckpointStore } from "../Services/CheckpointStore.ts"; import { GitCoreLive } from "../../git/Layers/GitCore.ts"; import { GitCore } from "../../git/Services/GitCore.ts"; import { GitCommandError } from "../../git/Errors.ts"; import { ServerConfig } from "../../config.ts"; import { ThreadId } from "@t3tools/contracts"; const ServerConfigLayer = ServerConfig.layerTest(process.cwd(), { prefix: "t3-checkpoint-store-test-", }); const GitCoreTestLayer = GitCoreLive.pipe( Layer.provide(ServerConfigLayer), Layer.provide(NodeServices.layer), ); const CheckpointStoreTestLayer = CheckpointStoreLive.pipe( Layer.provide(GitCoreTestLayer), Layer.provide(NodeServices.layer), ); const TestLayer = Layer.mergeAll(NodeServices.layer, GitCoreTestLayer, CheckpointStoreTestLayer); function makeTmpDir( prefix = "checkpoint-store-test-", ): Effect.Effect { return Effect.gen(function* () { const fileSystem = yield* FileSystem.FileSystem; return yield* fileSystem.makeTempDirectoryScoped({ prefix }); }); } function writeTextFile( filePath: string, contents: string, ): Effect.Effect { return Effect.gen(function* () { const fileSystem = yield* FileSystem.FileSystem; yield* fileSystem.writeFileString(filePath, contents); }); } function git( cwd: string, args: ReadonlyArray, ): Effect.Effect { return Effect.gen(function* () { const gitCore = yield* GitCore; const result = yield* gitCore.execute({ operation: "CheckpointStore.test.git", cwd, args, timeoutMs: 10_000, }); return result.stdout.trim(); }); } function initRepoWithCommit( cwd: string, ): Effect.Effect< void, GitCommandError | PlatformError.PlatformError, GitCore | FileSystem.FileSystem > { return Effect.gen(function* () { const core = yield* GitCore; yield* core.initRepo({ cwd }); yield* git(cwd, ["config", "user.email", "test@test.com"]); yield* git(cwd, ["config", "user.name", "Test"]); yield* writeTextFile(path.join(cwd, "README.md"), "# test\n"); yield* git(cwd, ["add", "."]); yield* git(cwd, ["commit", "-m", "initial commit"]); }); } function buildLargeText(lineCount = 20_000): string { return Array.from({ length: lineCount }, (_, index) => `line ${String(index).padStart(5, "0")}`) .join("\n") .concat("\n"); } it.layer(TestLayer)("CheckpointStoreLive", (it) => { describe("diffCheckpoints", () => { it.effect("returns full oversized checkpoint diffs without truncation", () => Effect.gen(function* () { const tmp = yield* makeTmpDir(); yield* initRepoWithCommit(tmp); const checkpointStore = yield* CheckpointStore; const threadId = ThreadId.makeUnsafe("thread-checkpoint-store"); const fromCheckpointRef = checkpointRefForThreadTurn(threadId, 0); const toCheckpointRef = checkpointRefForThreadTurn(threadId, 1); yield* checkpointStore.captureCheckpoint({ cwd: tmp, checkpointRef: fromCheckpointRef, }); yield* writeTextFile(path.join(tmp, "README.md"), buildLargeText()); yield* checkpointStore.captureCheckpoint({ cwd: tmp, checkpointRef: toCheckpointRef, }); const diff = yield* checkpointStore.diffCheckpoints({ cwd: tmp, fromCheckpointRef, toCheckpointRef, }); expect(diff).toContain("diff --git"); expect(diff).not.toContain("[truncated]"); expect(diff).toContain("+line 19999"); }), ); }); });