Files

138 lines
4.5 KiB
TypeScript

import { describe, expect, it } from "bun:test";
import type { UIMessage } from "ai";
import type { OpenTarget } from "../src/react-app/domains/session/artifacts/open-target";
import { canOpenArtifact, canPreviewArtifact, getArtifactsFromMessages } from "../src/lib/artifacts";
describe("getArtifactsFromMessages", () => {
it("includes verified slide deck targets mentioned in assistant summaries", () => {
const messages: UIMessage[] = [{
id: "msg_deck",
role: "assistant",
parts: [{ type: "text", text: "Updated file: decks/openwork-vertebrae-deck.pptx", state: "done" }],
}];
const targets: OpenTarget[] = [{
id: "file:decks/openwork-vertebrae-deck.pptx",
kind: "file",
value: "decks/openwork-vertebrae-deck.pptx",
name: "openwork-vertebrae-deck.pptx",
preview: "slides",
confidence: 65,
reason: "message",
exists: true,
}];
expect(getArtifactsFromMessages(messages, targets)[0]).toMatchObject({
name: "openwork-vertebrae-deck.pptx",
path: "decks/openwork-vertebrae-deck.pptx",
type: "slides",
legacy_target: { preview: "slides", exists: true },
});
});
it("uses verified relative targets for absolute attachment paths", () => {
const messages: UIMessage[] = [{
id: "msg_attachment",
role: "assistant",
parts: [{
type: "source-document",
sourceId: "attachment-source",
mediaType: "text/csv",
title: "customers.csv",
filename: "/Users/test/workspace/customers.csv",
}],
}];
const targets: OpenTarget[] = [{
id: "file:customers.csv",
kind: "file",
value: "customers.csv",
name: "customers.csv",
preview: "sheet",
confidence: 95,
reason: "attachment source",
exists: true,
}];
expect(getArtifactsFromMessages(messages, targets)[0]?.legacy_target).toMatchObject({
value: "customers.csv",
exists: true,
});
});
it("can list artifacts from assistant text without target fallbacks", () => {
const messages: UIMessage[] = [{
id: "msg_text",
role: "assistant",
parts: [{ type: "text", text: "Created reports/artifact-eval.md, decks/update.pptx, and src/widget.tsx", state: "done" }],
}];
expect(getArtifactsFromMessages(messages, [], { includeTargetFallbacks: false }).map((artifact) => artifact.path)).toEqual([
"src/widget.tsx",
"decks/update.pptx",
"reports/artifact-eval.md",
]);
});
it("orders verified artifacts by newest update time and marks unsupported previews", () => {
const messages: UIMessage[] = [{
id: "msg_order",
role: "assistant",
parts: [{ type: "text", text: "Created reports/old.md and reports/new.md and src/widget.tsx", state: "done" }],
}];
const targets: OpenTarget[] = [
{
id: "file:reports/old.md",
kind: "file",
value: "reports/old.md",
name: "old.md",
preview: "markdown",
confidence: 65,
reason: "message",
exists: true,
updatedAt: 1,
},
{
id: "file:reports/new.md",
kind: "file",
value: "reports/new.md",
name: "new.md",
preview: "markdown",
confidence: 65,
reason: "message",
exists: true,
updatedAt: 2,
},
];
const artifacts = getArtifactsFromMessages(messages, targets, { includeTargetFallbacks: false });
expect(artifacts.map((artifact) => artifact.path)).toEqual(["reports/new.md", "reports/old.md", "src/widget.tsx"]);
expect(canPreviewArtifact(artifacts[0])).toBe(true);
expect(canPreviewArtifact(artifacts[2])).toBe(false);
});
it("previews verified code artifacts in the sidebar", () => {
const messages: UIMessage[] = [{
id: "msg_unsupported",
role: "assistant",
parts: [{ type: "text", text: "Created src/widget.tsx", state: "done" }],
}];
const targets: OpenTarget[] = [{
id: "file:src/widget.tsx",
kind: "file",
value: "src/widget.tsx",
name: "widget.tsx",
preview: "code",
confidence: 65,
reason: "message",
exists: true,
}];
const artifact = getArtifactsFromMessages(messages, targets, { includeTargetFallbacks: false })[0];
expect(artifact).toMatchObject({ path: "src/widget.tsx", legacy_target: { exists: true, preview: "code" } });
expect(artifact ? canPreviewArtifact(artifact) : false).toBe(true);
expect(artifact ? canOpenArtifact(artifact) : false).toBe(true);
});
});