diff options
| author | Adam Malczewski <[email protected]> | 2026-05-19 19:40:21 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-05-19 19:40:21 +0900 |
| commit | f78a91c20f658dd404277919a0b872b352c99bb6 (patch) | |
| tree | 58cfffb655da4443f4b7a39543b86f988f15239f /packages/core/tests/tools/write-file.test.ts | |
| download | dispatch-main.tar.gz dispatch-main.zip | |
- Bun monorepo with @dispatch/core, @dispatch/api, @dispatch/frontend
- Agent runtime with Vercel AI SDK, streaming via WebSocket
- Tools: read_file, write_file, list_files (scoped to working directory)
- Hono API server with POST /chat, GET /status, GET /health, WS /ws
- Svelte 5 + DaisyUI frontend with chat UI, theme switcher, copy button
- OpenCode Go (Zen) as LLM provider, deepseek-v4-flash-free model
- Docker setup (dev + prod) with bin/ scripts and gopass secrets
- Biome v2 linting/formatting, Vitest tests (44 passing)
- Debug info attached to error messages for diagnostics
Diffstat (limited to 'packages/core/tests/tools/write-file.test.ts')
| -rw-r--r-- | packages/core/tests/tools/write-file.test.ts | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/packages/core/tests/tools/write-file.test.ts b/packages/core/tests/tools/write-file.test.ts new file mode 100644 index 0000000..01d7253 --- /dev/null +++ b/packages/core/tests/tools/write-file.test.ts @@ -0,0 +1,45 @@ +import { mkdtemp, readFile, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import { createWriteFileTool } from "../../src/tools/write-file.js"; + +describe("write_file tool", () => { + let workDir: string; + + beforeEach(async () => { + workDir = await mkdtemp(join(tmpdir(), "dispatch-test-")); + }); + + afterEach(async () => { + await rm(workDir, { recursive: true, force: true }); + }); + + it("writes a new file", async () => { + const tool = createWriteFileTool(workDir); + const result = await tool.execute({ + path: "output.txt", + content: "test content", + }); + expect(result).toMatch(/successfully wrote/i); + const written = await readFile(join(workDir, "output.txt"), "utf8"); + expect(written).toBe("test content"); + }); + + it("creates parent directories", async () => { + const tool = createWriteFileTool(workDir); + const result = await tool.execute({ + path: "nested/dir/file.txt", + content: "nested", + }); + expect(result).toMatch(/successfully wrote/i); + const written = await readFile(join(workDir, "nested/dir/file.txt"), "utf8"); + expect(written).toBe("nested"); + }); + + it("blocks path traversal", async () => { + const tool = createWriteFileTool(workDir); + const result = await tool.execute({ path: "../evil.txt", content: "bad" }); + expect(result).toMatch(/outside the working directory/i); + }); +}); |
