This commit is contained in:
+74
-3
@@ -2,6 +2,7 @@ import { expect, test } from "bun:test";
|
||||
import type { Plugin } from "@opencode/plugin/tui";
|
||||
import type { Route, SlotMap } from "@opencode/plugin/tui/context";
|
||||
import { testRender, type JSX } from "@opentui/solid";
|
||||
import { jsx } from "@opentui/solid/jsx-runtime";
|
||||
import { createSignal } from "solid-js";
|
||||
import { build } from "../scripts/build.js";
|
||||
import type { QuotaStatus } from "../src/quota.js";
|
||||
@@ -87,12 +88,19 @@ test("built quota slot stays reactive across pending, empty, failure, update, an
|
||||
const renderHome = homeRender;
|
||||
const home = await testRender(() => renderHome({ mode: "normal", showDetails: false }), {
|
||||
width: 40,
|
||||
height: 5,
|
||||
height: 6,
|
||||
});
|
||||
await home.waitForFrame((frame) => frame.includes("ChatGPT quota (home)"));
|
||||
const homeFrame = home.captureCharFrame();
|
||||
expect(homeFrame).toContain(" ChatGPT quota (home)");
|
||||
expect(homeFrame).toContain(" 5h: 90% · due");
|
||||
expect(homeFrame.split("\n")).toEqual([
|
||||
" ",
|
||||
" ",
|
||||
" ChatGPT quota (home) ",
|
||||
" 5h: 90% · due ",
|
||||
" ",
|
||||
" ",
|
||||
"",
|
||||
]);
|
||||
expect(statusCalls).toBe(1);
|
||||
home.renderer.destroy();
|
||||
|
||||
@@ -152,3 +160,66 @@ test("built quota slot stays reactive across pending, empty, failure, update, an
|
||||
if (cleanup) await cleanup();
|
||||
}
|
||||
});
|
||||
|
||||
test("home quota stays out of the host footer row at wide and narrow widths", async () => {
|
||||
await build();
|
||||
const { default: plugin } = await import(new URL("../dist/tui.js", import.meta.url).href);
|
||||
let homeRender: HomeSlotRender | undefined;
|
||||
const contextFixture = {
|
||||
client: {
|
||||
rpc: () => ({
|
||||
status: async () => status("home", 90),
|
||||
events: { on: () => () => undefined },
|
||||
}),
|
||||
},
|
||||
ui: {
|
||||
slot(claim: { after?: "prompt.footer"; render: HomeSlotRender }) {
|
||||
if (claim.after === "prompt.footer") homeRender = claim.render;
|
||||
return () => undefined;
|
||||
},
|
||||
router: { current: () => ({ type: "home" as const }) },
|
||||
},
|
||||
theme: { text: { default: "#ffffff", muted: "#888888" } },
|
||||
};
|
||||
// SAFETY: This focused fixture implements every context member read by slot setup/rendering.
|
||||
const cleanup = await plugin.setup(Object.assign({} as Plugin.Context, contextFixture));
|
||||
if (!homeRender) throw new Error("Plugin did not register the home slot");
|
||||
const renderHome = homeRender;
|
||||
try {
|
||||
for (const width of [75, 40]) {
|
||||
const footer = (quota: boolean) =>
|
||||
jsx("box", {
|
||||
flexDirection: "row",
|
||||
children: [
|
||||
jsx("text", { children: "/project" }),
|
||||
jsx("box", { flexGrow: 1 }),
|
||||
jsx("text", { children: "NORMAL" }),
|
||||
jsx("text", { children: " ctrl+k commands" }),
|
||||
quota ? renderHome({ mode: "normal", showDetails: false }) : undefined,
|
||||
],
|
||||
});
|
||||
const baseline = await testRender(() => footer(false), { width, height: 6 });
|
||||
const rendered = await testRender(() => footer(true), { width, height: 6 });
|
||||
try {
|
||||
await baseline.renderOnce();
|
||||
await rendered.waitForFrame((frame) => frame.includes("ChatGPT quota (home)"));
|
||||
const baselineRows = baseline.captureCharFrame().split("\n");
|
||||
const quotaRows = rendered.captureCharFrame().split("\n");
|
||||
expect(quotaRows[0]).toBe(baselineRows[0]);
|
||||
expect(quotaRows[0]).toContain("/project");
|
||||
expect(quotaRows[0]).toContain("NORMAL ctrl+k commands");
|
||||
expect(quotaRows[1]?.trim()).toBe("");
|
||||
expect(quotaRows[2]?.trim()).toBe("ChatGPT quota (home)");
|
||||
expect(quotaRows[3]?.trim()).toBe("5h: 90% · due");
|
||||
expect(quotaRows[2]?.indexOf("ChatGPT quota (home)")).toBe(
|
||||
Math.ceil((width - "ChatGPT quota (home)".length) / 2),
|
||||
);
|
||||
} finally {
|
||||
baseline.renderer.destroy();
|
||||
rendered.renderer.destroy();
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
if (cleanup) await cleanup();
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user