/** * Tests for .opencode/tools/draw-image.ts — the draw-image custom tool. * * Mirror of tests/test_commit_tool.ts: the tool is a spawnSync wrapper * around `node cli.ts render ...`. Runtime note: opencode ships a standalone * binary with Bun bundled inside; there is no separate `bun` CLI on the host * (CI runner uses node + pytest). The CI runs the equivalent Python tests in * tests/test_draw_image_tool.py via the JS loader tests/_ts_loader.mjs * (exec_stub_json mode for multi-arg tools). This file documents the intended * TS-side test cases and is runnable under `bun test` once a bun runtime is * available on the host. * * Test cases (mirror tests/test_draw_image_tool.py): * - test_loader_can_load_tool — tool loads, declares args * - test_valid_render — valid args + spawnSync exit 0 → JSON result * - test_render_failure — spawnSync exit 1 → error string * - test_execute_uses_cwd_from_context — cwd=context.worktree propagated */ import { describe, test, expect, mock } from "bun:test" with { type: "'bun-test'" } import { spawnSync } from "child_process" import path from "path" const TOOL_SRC = path.resolve(import.meta.dir, "..", ".opencode", "tools", "draw-image.ts") function ctx() { return { sessionID: "t", messageID: "t", agent: "t", directory: ".", worktree: ".", abort: new AbortController().signal, metadata() {}, async ask() {}, } } describe("draw-image tool", () => { test("test_valid_render — valid args + spawnSync exit 0 returns JSON", async () => { const okResponse = '{"path":"/tmp/out.png","hash":"abc123","status":"rendered"}' mock.module("child_process", () => ({ spawnSync: () => ({ status: 0, stdout: okResponse, stderr: "" }), })) const mod = await import(TOOL_SRC + "?t=" + Date.now()) const result = await mod.default.execute({ template: "cover", title: "Test" }, ctx()) expect(result).toContain("rendered") expect(result).toContain("/tmp/out.png") }) test("test_render_failure — spawnSync exit 1 returns error", async () => { mock.module("child_process", () => ({ spawnSync: () => ({ status: 1, stdout: "", stderr: "render failed" }), })) const mod = await import(TOOL_SRC + "?t=" + Date.now()) const result = await mod.default.execute({ template: "cover", title: "Test" }, ctx()) expect(result).toContain("draw-image failed") }) test("test_execute_uses_cwd_from_context — cwd propagated to spawnSync", async () => { const okResponse = '{"path":"./out.png","hash":"abc","status":"rendered"}' let capturedOpts: any = null mock.module("child_process", () => ({ spawnSync: (_cmd: string, _args: string[], opts: any) => { capturedOpts = opts return { status: 0, stdout: okResponse, stderr: "" } }, })) const mod = await import(TOOL_SRC + "?t=" + Date.now()) await mod.default.execute({ template: "cover", title: "Test" }, ctx()) expect(capturedOpts).not.toBeNull() expect(capturedOpts.cwd).toBe(".") }) })