Files
opencode/packages/tui/test/component/dialog-update.test.tsx

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()
}
})