repositories / pi-ext
pi-ext
bugabingas pi extensions
owned by admin
extensions/ultra/__tests__/display.test.ts
Rawimport { describe, expect, it } from "vitest";
import {
formatStructuredText,
formatUsage,
formatValueMarkdown,
summarizeValue,
} from "../display.ts";
describe("usage presentation", () => {
it("separates cost/output from uncached and cached input without changing usage", () => {
const usage = {
input: 332086,
output: 4283,
total: 775665,
cacheRead: 439296,
cacheWrite: 0,
cost: 0.16068544,
};
const original = { ...usage };
expect(formatUsage(usage)).toEqual({
summary: "$0.1607 · 4.28k output",
detail: "332k uncached input · 439k cache read · 0 cache write",
});
expect(usage).toEqual(original);
expect(formatUsage({ ...usage, total: 999999 })).toEqual(
formatUsage(usage),
);
});
it.each([
[0, "$0.0000"],
[0.000001, "<$0.0001"],
[0.0001, "$0.0001"],
[12.34567, "$12.3457"],
])(
"formats reported cost %s without making tiny positive charges look free",
(cost, expected) => {
expect(
formatUsage({
input: 0,
output: 0,
total: 0,
cacheRead: 0,
cacheWrite: 0,
cost,
}).summary,
).toBe(`${expected} · 0 output`);
},
);
});
describe("structured human views", () => {
it.each([
[
{ task: "integration", ownership: "ui-tests", files: ["a.ts"] },
"integration",
],
[{ title: "Check boundary", detail: "long evidence" }, "Check boundary"],
[{ summary: "Read\n source" }, "Read source"],
['{"task":"Encoded task"}', "Encoded task"],
[[{ task: "one" }, { task: "two" }], "2 items"],
[
{ nested: { x: 1 }, files: ["a", "b"], ready: true },
"Nested: 1 field · Files: 2 items · Ready: true",
],
[{}, "0 fields"],
[[], "0 items"],
[null, "None"],
[false, "false"],
[0, "0"],
[undefined, ""],
])("summarizes %j without serializing it", (value, expected) => {
expect(summarizeValue(value)).toBe(expected);
});
it("bounds long labels and indicates omitted fields", () => {
expect(summarizeValue({ title: "x".repeat(200) })).toBe(
`${"x".repeat(119)}…`,
);
expect(summarizeValue({ a: 1, b: 2, c: 3, d: 4 })).toContain("+1 fields");
});
it("renders nested fields, lists, multiline text, and empty values without dropping data", () => {
const value = {
answerStatus: "incomplete",
findings: [
{
file: "src/a.ts",
reason: "First line\nSecond line",
verified: false,
},
],
missing: null,
names: ["one", "two"],
empty_list: [],
empty_object: {},
};
const before = JSON.stringify(value);
const markdown = formatValueMarkdown(value);
expect(markdown).toContain("- **Answer Status:** incomplete");
expect(markdown).toContain(
"- **Findings:**\n - **Item 1**\n - **File:** src/a.ts",
);
expect(markdown).toContain("- **Reason:** First line \n Second line");
expect(markdown).toContain("- **Verified:** false");
expect(markdown).toContain("- **Missing:** None");
expect(markdown).toContain("- **Names:**\n - one\n - two");
expect(markdown).toContain("- **Empty list:**\n - No items");
expect(markdown).toContain("- **Empty object:**\n - No fields");
expect(markdown).not.toContain('"answerStatus":');
expect(JSON.stringify(value)).toBe(before);
});
it("renders serialized structured values inside fields and lists", () => {
expect(formatValueMarkdown({ details: '{"ready":true}' })).toBe(
"- **Details:**\n - **Ready:** true",
);
expect(formatValueMarkdown(['```json\n{"ready":true}\n```'])).toBe(
"- **Item 1**\n - **Ready:** true",
);
});
it("keeps field labels literal when they contain markdown syntax", () => {
expect(formatValueMarkdown({ "*name*": "value" })).toBe(
"- **\\*name\\*:** value",
);
});
it.each(['{"ok":true}', '```json\n{"ok":true}\n```'])(
"renders complete JSON text %s",
(text) => {
expect(formatStructuredText(text)).toBe("- **Ok:** true");
expect(formatStructuredText(text, summarizeValue)).toBe("Ok: true");
},
);
it.each([
"ordinary **markdown**",
'{"unfinished":',
"source example: { not JSON }",
])("preserves prose or incomplete JSON %s", (text) =>
expect(formatStructuredText(text)).toBe(text),
);
});