test(auto-update-checker): cover deferred update check
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
import type { PluginInput } from "@opencode-ai/plugin"
|
||||
import { describe, expect, mock, test } from "bun:test"
|
||||
|
||||
const latestVersionMock = mock.fn(async () => "3.0.1")
|
||||
const scheduleDeferredIdleCheckMock = mock.fn((runCheck: () => void) => {
|
||||
scheduledCheck = runCheck
|
||||
})
|
||||
|
||||
let scheduledCheck: (() => void) | null = null
|
||||
|
||||
mock.module("./checker/latest-version", () => ({
|
||||
getLatestVersion: latestVersionMock,
|
||||
}))
|
||||
|
||||
mock.module("./hook/deferred-idle-check", () => ({
|
||||
scheduleDeferredIdleCheck: scheduleDeferredIdleCheckMock,
|
||||
}))
|
||||
|
||||
const createHook = async () => {
|
||||
const module = await import("./hook")
|
||||
return module.createAutoUpdateCheckerHook(
|
||||
{
|
||||
directory: "/tmp/project",
|
||||
client: {
|
||||
tui: {
|
||||
showToast: async () => undefined,
|
||||
},
|
||||
},
|
||||
} satisfies PluginInput,
|
||||
{
|
||||
showStartupToast: false,
|
||||
autoUpdate: false,
|
||||
},
|
||||
{
|
||||
getCachedVersion: () => "3.0.0",
|
||||
getLocalDevVersion: () => null,
|
||||
showConfigErrorsIfAny: async () => undefined,
|
||||
updateAndShowConnectedProvidersCacheStatus: async () => undefined,
|
||||
refreshModelCapabilitiesOnStartup: async () => undefined,
|
||||
showModelCacheWarningIfNeeded: async () => undefined,
|
||||
showLocalDevToast: async () => undefined,
|
||||
showVersionToast: async () => undefined,
|
||||
runBackgroundUpdateCheck: async () => {
|
||||
await latestVersionMock()
|
||||
},
|
||||
log: () => undefined,
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
describe("auto-update-checker hook", () => {
|
||||
test("defers update check until first session idle", async () => {
|
||||
// given
|
||||
latestVersionMock.mockClear()
|
||||
scheduleDeferredIdleCheckMock.mockClear()
|
||||
scheduledCheck = null
|
||||
const hook = await createHook()
|
||||
|
||||
// when
|
||||
hook.event({ event: { type: "session.created" } })
|
||||
|
||||
// then
|
||||
expect(scheduleDeferredIdleCheckMock).toHaveBeenCalledTimes(0)
|
||||
expect(latestVersionMock).toHaveBeenCalledTimes(0)
|
||||
|
||||
// when
|
||||
hook.event({ event: { type: "session.idle" } })
|
||||
|
||||
// then
|
||||
expect(scheduleDeferredIdleCheckMock).toHaveBeenCalledTimes(1)
|
||||
expect(latestVersionMock).toHaveBeenCalledTimes(0)
|
||||
|
||||
// when
|
||||
scheduledCheck?.()
|
||||
|
||||
// then
|
||||
expect(latestVersionMock).toHaveBeenCalledTimes(1)
|
||||
|
||||
// when
|
||||
hook.event({ event: { type: "session.idle" } })
|
||||
scheduledCheck?.()
|
||||
|
||||
// then
|
||||
expect(scheduleDeferredIdleCheckMock).toHaveBeenCalledTimes(1)
|
||||
expect(latestVersionMock).toHaveBeenCalledTimes(1)
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user