History

refactor workspace reads to Effect FileSystem

Cursor Agent committed 3 months ago

Commit 217fbf11 parent ebe8afb2 files · +138 −118Browse files

Showing the changes to apps/server/src/workspace/WorkspaceFileSystem.test.ts (1 of 2 files). Show all

Unified · Split

apps/server/src/workspace/WorkspaceFileSystem.test.ts+51−29
@@ -1,9 +1,11 @@
11 import * as NodeServices from "@effect/platform-node/NodeServices";
2−import { it, describe, expect } from "@effect/vitest";
2+import { assert, describe, it } from "@effect/vitest";
33 import * as Effect from "effect/Effect";
44 import * as FileSystem from "effect/FileSystem";
55 import * as Layer from "effect/Layer";
6+import * as Option from "effect/Option";
67 import * as Path from "effect/Path";
8+import * as PlatformError from "effect/PlatformError";
79
810 import * as ServerConfig from "../config.ts";
911 import * as VcsDriverRegistry from "../vcs/VcsDriverRegistry.ts";
@@ -64,7 +66,7 @@ it.layer(TestLayer, { excludeTestServices: true })("WorkspaceFileSystemLive", (i · 54 unmodified lines
6466 relativePath: "src/index.ts",
6567 });
6668
67− expect(result).toEqual({
69+ assert.deepStrictEqual(result, {
6870 relativePath: "src/index.ts",
6971 contents: "export const answer = 42;\n",
7072 byteLength: 26,
@@ -82,7 +84,8 @@ it.layer(TestLayer, { excludeTestServices: true })("WorkspaceFileSystemLive", (i · 11 unmodified lines
8284 .readFile({ cwd, relativePath: "../escape.md" })
8385 .pipe(Effect.flip);
8486
85− expect(error.message).toContain(
87+ assert.include(
88+ error.message,
8689 "Workspace file path must be relative to the project root: ../escape.md",
8790 );
8891 }),
@@ -107,14 +110,14 @@ it.layer(TestLayer, { excludeTestServices: true })("WorkspaceFileSystemLive", (i · 18 unmodified lines
107110 const resolvedWorkspaceRoot = yield* fileSystem.realPath(cwd);
108111 const resolvedPath = yield* fileSystem.realPath(path.join(outsideDir, "secret.txt"));
109112
110− expect(error).toBeInstanceOf(WorkspaceFileSystem.WorkspaceFilePathEscapeError);
111− expect(error).toMatchObject({
113+ assert.strictEqual(error._tag, "WorkspaceFilePathEscapeError");
114+ assert.deepInclude(error, {
112115 workspaceRoot: cwd,
113116 relativePath: "linked-secret.txt",
114117 resolvedWorkspaceRoot,
115118 resolvedPath,
116119 });
117− expect("cause" in error).toBe(false);
120+ assert.notProperty(error, "cause");
118121 }),
119122 );
120123
@@ -131,13 +134,13 @@ it.layer(TestLayer, { excludeTestServices: true })("WorkspaceFileSystemLive", (i · 10 unmodified lines
131134 .pipe(Effect.flip);
132135 const resolvedPath = yield* fileSystem.realPath(path.join(cwd, "src"));
133136
134− expect(error).toBeInstanceOf(WorkspaceFileSystem.WorkspacePathNotFileError);
135− expect(error).toMatchObject({
137+ assert.strictEqual(error._tag, "WorkspacePathNotFileError");
138+ assert.deepInclude(error, {
136139 workspaceRoot: cwd,
137140 relativePath: "src",
138141 resolvedPath,
139142 });
140− expect("cause" in error).toBe(false);
143+ assert.notProperty(error, "cause");
141144 }),
142145 );
143146
@@ -155,14 +158,31 @@ it.layer(TestLayer, { excludeTestServices: true })("WorkspaceFileSystemLive", (i · 11 unmodified lines
155158 .pipe(Effect.flip);
156159 const resolvedPath = yield* fileSystem.realPath(absolutePath);
157160
158− expect(error).toBeInstanceOf(WorkspaceFileSystem.WorkspaceBinaryFileError);
159− expect(error).toMatchObject({
161+ assert.strictEqual(error._tag, "WorkspaceBinaryFileError");
162+ assert.deepInclude(error, {
160163 workspaceRoot: cwd,
161164 relativePath: "asset.bin",
162165 resolvedPath,
163166 });
164− expect("cause" in error).toBe(false);
165− expect("contents" in error).toBe(false);
167+ assert.notProperty(error, "cause");
168+ assert.notProperty(error, "contents");
169+ }),
170+ );
171+
172+ it.effect("reads at most the preview limit", () =>
173+ Effect.gen(function* () {
174+ const workspaceFileSystem = yield* WorkspaceFileSystem.WorkspaceFileSystem;
175+ const cwd = yield* makeTempDir;
176+ yield* writeTextFile(cwd, "large.txt", "a".repeat(1024 * 1024 + 1));
177+
178+ const result = yield* workspaceFileSystem.readFile({
179+ cwd,
180+ relativePath: "large.txt",
181+ });
182+
183+ assert.strictEqual(result.contents.length, 1024 * 1024);
184+ assert.strictEqual(result.byteLength, 1024 * 1024 + 1);
185+ assert.isTrue(result.truncated);
166186 }),
167187 );
168188
@@ -177,16 +197,19 @@ it.layer(TestLayer, { excludeTestServices: true })("WorkspaceFileSystemLive", (i · 8 unmodified lines
177197 .readFile({ cwd, relativePath: "missing.txt" })
178198 .pipe(Effect.flip);
179199
180− expect(error).toBeInstanceOf(WorkspaceFileSystem.WorkspaceFileSystemOperationError);
181− expect(error).toMatchObject({
200+ assert.strictEqual(error._tag, "WorkspaceFileSystemOperationError");
201+ assert.deepInclude(error, {
182202 workspaceRoot: cwd,
183203 relativePath: "missing.txt",
184204 resolvedPath,
185205 operationPath: resolvedPath,
186206 operation: "realpath-target",
187207 });
188− expect(error.cause).toBeInstanceOf(Error);
189− expect((error.cause as NodeJS.ErrnoException).code).toBe("ENOENT");
208+ assert.instanceOf(error.cause, PlatformError.PlatformError);
209+ assert.strictEqual(
210+ (error.cause as PlatformError.PlatformError).reason._tag,
211+ "NotFound",
212+ );
190213 }),
191214 );
192215 });
@@ -207,8 +230,8 @@ it.layer(TestLayer, { excludeTestServices: true })("WorkspaceFileSystemLive", (i · 14 unmodified lines
207230 .readFileString(path.join(cwd, "plans/effect-rpc.md"))
208231 .pipe(Effect.orDie);
209232
210− expect(result).toEqual({ relativePath: "plans/effect-rpc.md" });
211− expect(saved).toBe("# Plan\n");
233+ assert.deepStrictEqual(result, { relativePath: "plans/effect-rpc.md" });
234+ assert.strictEqual(saved, "# Plan\n");
212235 }),
213236 );
214237
@@ -220,8 +243,8 @@ it.layer(TestLayer, { excludeTestServices: true })("WorkspaceFileSystemLive", (i · 5 unmodified lines
220243 yield* writeTextFile(cwd, "src/existing.ts", "export {};\n");
221244
222245 const beforeWrite = yield* workspaceEntries.list({ cwd });
223− expect(beforeWrite.entries.some((entry) => entry.path === "plans/effect-rpc.md")).toBe(
224− false,
246+ assert.isFalse(
247+ beforeWrite.entries.some((entry) => entry.path === "plans/effect-rpc.md"),
225248 );
226249
227250 yield* workspaceFileSystem.writeFile({
@@ -231,10 +254,10 @@ it.layer(TestLayer, { excludeTestServices: true })("WorkspaceFileSystemLive", (i · 3 unmodified lines
231254 });
232255
233256 const afterWrite = yield* workspaceEntries.list({ cwd });
234− expect(afterWrite.entries).toEqual(
235− expect.arrayContaining([expect.objectContaining({ path: "plans/effect-rpc.md" })]),
257+ assert.isTrue(
258+ afterWrite.entries.some((entry) => entry.path === "plans/effect-rpc.md"),
236259 );
237− expect(afterWrite.truncated).toBe(false);
260+ assert.isFalse(afterWrite.truncated);
238261 }),
239262 );
240263
@@ -253,15 +276,14 @@ it.layer(TestLayer, { excludeTestServices: true })("WorkspaceFileSystemLive", (i · 12 unmodified lines
253276 })
254277 .pipe(Effect.flip);
255278
256− expect(error.message).toContain(
279+ assert.include(
280+ error.message,
257281 "Workspace file path must be relative to the project root: ../escape.md",
258282 );
259283
260284 const escapedPath = path.resolve(cwd, "..", "escape.md");
261− const escapedStat = yield* fileSystem
262− .stat(escapedPath)
263− .pipe(Effect.orElseSucceed(() => null));
264− expect(escapedStat).toBeNull();
285+ const escapedStat = yield* fileSystem.stat(escapedPath).pipe(Effect.option);
286+ assert.isTrue(Option.isNone(escapedStat));
265287 }),
266288 );
267289 });