mirror of
https://github.com/anomalyco/opencode.git
synced 2026-11-14 20:21:39 +03:00
63 lines
2.5 KiB
TypeScript
63 lines
2.5 KiB
TypeScript
/** @jsxImportSource @opentui/solid */
|
|
import { testRender } from "@opentui/solid"
|
|
import { expect, test } from "bun:test"
|
|
import { createSignal } from "solid-js"
|
|
import { DialogUpdate } from "../../src/component/dialog-update"
|
|
import { ConfigProvider } from "../../src/config"
|
|
import type { UpdateState } from "../../src/context/update-notification"
|
|
import { Keymap } from "../../src/context/keymap"
|
|
import { ThemeProvider } from "../../src/context/theme"
|
|
import { DialogProvider } from "../../src/ui/dialog"
|
|
import { ToastProvider } from "../../src/ui/toast"
|
|
import { emptyThemeSource, tmpdir } from "../fixture/fixture"
|
|
import { TestTuiContexts } from "../fixture/tui-environment"
|
|
import { createTuiResolvedConfig } from "../fixture/tui-runtime"
|
|
|
|
test("installation progress replaces checking while the update job is still pending", async () => {
|
|
await using temporary = await tmpdir()
|
|
const [state, setState] = createSignal<UpdateState>()
|
|
const pending = Promise.withResolvers<string | undefined>()
|
|
const app = await testRender(
|
|
() => (
|
|
<TestTuiContexts directory={temporary.path} paths={{ state: temporary.path }}>
|
|
<ConfigProvider config={createTuiResolvedConfig()}>
|
|
<ThemeProvider mode="dark" source={emptyThemeSource}>
|
|
<Keymap.Provider>
|
|
<ToastProvider>
|
|
<DialogProvider>
|
|
<DialogUpdate
|
|
check={() => pending.promise}
|
|
state={state}
|
|
skip={() => {}}
|
|
install={() => Promise.resolve()}
|
|
restart={() => {}}
|
|
/>
|
|
</DialogProvider>
|
|
</ToastProvider>
|
|
</Keymap.Provider>
|
|
</ThemeProvider>
|
|
</ConfigProvider>
|
|
</TestTuiContexts>
|
|
),
|
|
{ width: 80, height: 24, kittyKeyboard: true },
|
|
)
|
|
|
|
try {
|
|
app.renderer.start()
|
|
await app.waitForFrame((frame) => frame.includes("Checking for updates"))
|
|
setState({ type: "installing", version: "2.0.0" })
|
|
await app.waitForFrame(
|
|
(frame) =>
|
|
frame.includes("Updating OpenCode") &&
|
|
frame.includes("Installing OpenCode 2.0.0") &&
|
|
!frame.includes("Checking"),
|
|
)
|
|
expect(app.captureCharFrame()).not.toContain("Skip")
|
|
pending.reject(new Error("Update service unavailable"))
|
|
await app.waitForFrame((frame) => frame.includes("Update service unavailable") && !frame.includes("Installing"))
|
|
} finally {
|
|
pending.resolve(undefined)
|
|
app.renderer.destroy()
|
|
}
|
|
})
|