61 lines
1.8 KiB
TypeScript
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,
|
|
})
|
|
})
|
|
})
|