tui: let users review branch changes against main

This commit is contained in:
vimtor
2026-06-05 13:00:31 +02:00
parent d85f8cd4d8
commit c99ccb7e90
2 changed files with 84 additions and 5 deletions
@@ -85,6 +85,66 @@ test("closing the diff viewer returns to the route it opened from", async () =>
}
})
test("branch diff source requests branch VCS diff", async () => {
const calls: Parameters<TuiPluginApi["client"]["vcs"]["diff"]>[0][] = []
const current: TuiRouteCurrent = { name: "diff", params: { mode: "branch" } }
let renderDiff: TuiRouteDefinition["render"] | undefined
await mkdir(Global.Path.state, { recursive: true })
await Bun.write(path.join(Global.Path.state, "kv.json"), "{}")
function Harness() {
const renderer = useRenderer()
const keymap = createDefaultOpenTuiKeymap(renderer)
const base = createTuiPluginApi({
keymap,
client: {
vcs: {
diff: async (parameters: Parameters<TuiPluginApi["client"]["vcs"]["diff"]>[0]) => {
calls.push(parameters)
return { data: [] }
},
},
session: { diff: async () => ({ data: [] }) },
} as unknown as TuiPluginApi["client"],
})
const api = {
...base,
route: {
register(routes) {
renderDiff = routes.find((route) => route.name === "diff")?.render
return () => {}
},
navigate() {},
get current() {
return current
},
},
} satisfies TuiPluginApi
void diffViewerPlugin.tui(api, undefined, pluginMeta)
return (
<OpencodeKeymapProvider keymap={keymap}>
<TuiConfigProvider config={createTuiResolvedConfig()}>
<KVProvider>
<ThemeProvider mode="dark">
{renderDiff?.({ params: "params" in current ? current.params : undefined })}
</ThemeProvider>
</KVProvider>
</TuiConfigProvider>
</OpencodeKeymapProvider>
)
}
const app = await testRender(() => <Harness />, { width: 80, height: 20 })
try {
await waitForCall(app, calls)
expect(calls[0]).toEqual({ mode: "branch", context: 12 })
} finally {
app.renderer.destroy()
}
})
async function waitForCommand(
app: Awaited<ReturnType<typeof testRender>>,
commands: Map<string, unknown>,
@@ -97,6 +157,14 @@ async function waitForCommand(
}
}
async function waitForCall(app: Awaited<ReturnType<typeof testRender>>, calls: unknown[]) {
for (let attempt = 0; attempt < 10; attempt++) {
await app.renderOnce()
if (calls.length > 0) return
await new Promise((resolve) => setTimeout(resolve, 25))
}
}
const pluginMeta = {
id: "diff-viewer",
source: "internal",