| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- /** @jsxImportSource @opentui/solid */
- import { expect, test } from "bun:test"
- import { RGBA } from "@opentui/core"
- import { testRender } from "@opentui/solid"
- import type { Context } from "@opencode-ai/plugin/tui/context"
- import { SidebarContext } from "../../src/feature-plugins/sidebar/context"
- function context(options?: { cost?: number; tokens?: number }) {
- const color = RGBA.fromInts(200, 200, 200)
- return {
- theme: { text: { default: color, subdued: color } },
- data: {
- session: {
- get: () => ({ location: { directory: "/workspace" } }),
- cost: () => options?.cost ?? 0,
- message: {
- list: () =>
- options?.tokens
- ? [
- {
- id: "message",
- type: "assistant",
- model: { providerID: "provider", id: "model" },
- tokens: {
- input: options.tokens,
- output: 0,
- reasoning: 0,
- cache: { read: 0, write: 0 },
- },
- },
- ]
- : [],
- },
- },
- location: {
- model: { list: () => [] },
- },
- },
- } as unknown as Context
- }
- test("sidebar omits context before usage is available", async () => {
- const app = await testRender(() => <SidebarContext context={context()} sessionID="session" />, {
- width: 42,
- height: 8,
- })
- try {
- await app.renderOnce()
- expect(app.captureCharFrame()).not.toContain("Context")
- expect(app.captureCharFrame()).not.toContain("Not measured")
- } finally {
- app.renderer.destroy()
- }
- })
- test("sidebar shows available context usage", async () => {
- const app = await testRender(() => <SidebarContext context={context({ tokens: 1234 })} sessionID="session" />, {
- width: 42,
- height: 8,
- })
- try {
- await app.renderOnce()
- expect(app.captureCharFrame()).toContain("Context")
- expect(app.captureCharFrame()).toContain("1,234 tokens")
- } finally {
- app.renderer.destroy()
- }
- })
|