opencode/packages/tui/test/prompt/codec.test.ts

61 lines
1.8 KiB
TypeScript

import { describe, expect, test } from "bun:test"
import type { Prompt } from "@opencode-ai/schema"
import { projectedPromptInput } from "../../src/prompt/codec"
describe("prompt codec", () => {
test("converts projected URI and inline attachments without mutation", () => {
const input = {
text: "Review @note.ts and image.png with @scan",
files: [
{
data: "",
mime: "text/plain",
source: { type: "uri", uri: "file:///tmp/note.ts" },
name: "note.ts",
mention: { start: 7, end: 15, text: "@note.ts" },
},
{
data: "YWJj",
mime: "image/png",
source: { type: "inline" },
name: "image.png",
description: "screenshot",
},
],
agents: [{ name: "scan", mention: { start: 35, end: 40, text: "@scan" } }],
} satisfies Prompt
const before = structuredClone(input)
const output = projectedPromptInput(input)
expect(output).toEqual({
text: input.text,
files: [
{
uri: "file:///tmp/note.ts",
name: "note.ts",
description: undefined,
mention: { start: 7, end: 15, text: "@note.ts" },
},
{
uri: "data:image/png;base64,YWJj",
name: "image.png",
description: "screenshot",
mention: undefined,
},
],
agents: [{ name: "scan", mention: { start: 35, end: 40, text: "@scan" } }],
})
expect(input).toEqual(before)
expect(output.files?.[0]?.mention).not.toBe(input.files[0].mention)
expect(output.agents?.[0]?.mention).not.toBe(input.agents[0].mention)
})
test("retains empty attachment keys for editable prompt replacement", () => {
expect(projectedPromptInput({ text: "plain" })).toEqual({
text: "plain",
files: undefined,
agents: undefined,
})
})
})