Refine auto-update checker hook tests
Make the hook tests deterministic by replacing repeated fixed waits with a small scheduling helper and shared event trigger paths. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -54,6 +54,26 @@ function createPluginInput() {
|
|||||||
} as never
|
} as never
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function flushScheduledWork(): Promise<void> {
|
||||||
|
await new Promise<void>((resolve) => {
|
||||||
|
setTimeout(resolve, 0)
|
||||||
|
})
|
||||||
|
await Promise.resolve()
|
||||||
|
await Promise.resolve()
|
||||||
|
}
|
||||||
|
|
||||||
|
function runSessionCreatedEvent(
|
||||||
|
hook: ReturnType<HookFactory>,
|
||||||
|
properties?: { info?: { parentID?: string } }
|
||||||
|
): void {
|
||||||
|
hook.event({
|
||||||
|
event: {
|
||||||
|
type: "session.created",
|
||||||
|
properties,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
mockShowConfigErrorsIfAny.mockClear()
|
mockShowConfigErrorsIfAny.mockClear()
|
||||||
mockShowModelCacheWarningIfNeeded.mockClear()
|
mockShowModelCacheWarningIfNeeded.mockClear()
|
||||||
@@ -85,13 +105,8 @@ describe("createAutoUpdateCheckerHook", () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
//#when - session.created event arrives
|
//#when - session.created event arrives
|
||||||
hook.event({
|
runSessionCreatedEvent(hook, { info: { parentID: undefined } })
|
||||||
event: {
|
await flushScheduledWork()
|
||||||
type: "session.created",
|
|
||||||
properties: { info: { parentID: undefined } },
|
|
||||||
},
|
|
||||||
})
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
||||||
|
|
||||||
//#then - no update checker side effects run
|
//#then - no update checker side effects run
|
||||||
expect(mockShowConfigErrorsIfAny).not.toHaveBeenCalled()
|
expect(mockShowConfigErrorsIfAny).not.toHaveBeenCalled()
|
||||||
@@ -108,12 +123,8 @@ describe("createAutoUpdateCheckerHook", () => {
|
|||||||
const hook = createAutoUpdateCheckerHook(createPluginInput())
|
const hook = createAutoUpdateCheckerHook(createPluginInput())
|
||||||
|
|
||||||
//#when - session.created event arrives on primary session
|
//#when - session.created event arrives on primary session
|
||||||
hook.event({
|
runSessionCreatedEvent(hook)
|
||||||
event: {
|
await flushScheduledWork()
|
||||||
type: "session.created",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
||||||
|
|
||||||
//#then - startup checks, toast, and background check run
|
//#then - startup checks, toast, and background check run
|
||||||
expect(mockShowConfigErrorsIfAny).toHaveBeenCalledTimes(1)
|
expect(mockShowConfigErrorsIfAny).toHaveBeenCalledTimes(1)
|
||||||
@@ -129,13 +140,8 @@ describe("createAutoUpdateCheckerHook", () => {
|
|||||||
const hook = createAutoUpdateCheckerHook(createPluginInput())
|
const hook = createAutoUpdateCheckerHook(createPluginInput())
|
||||||
|
|
||||||
//#when - session.created event contains parentID
|
//#when - session.created event contains parentID
|
||||||
hook.event({
|
runSessionCreatedEvent(hook, { info: { parentID: "parent-123" } })
|
||||||
event: {
|
await flushScheduledWork()
|
||||||
type: "session.created",
|
|
||||||
properties: { info: { parentID: "parent-123" } },
|
|
||||||
},
|
|
||||||
})
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
||||||
|
|
||||||
//#then - no startup actions run
|
//#then - no startup actions run
|
||||||
expect(mockShowConfigErrorsIfAny).not.toHaveBeenCalled()
|
expect(mockShowConfigErrorsIfAny).not.toHaveBeenCalled()
|
||||||
@@ -152,17 +158,9 @@ describe("createAutoUpdateCheckerHook", () => {
|
|||||||
const hook = createAutoUpdateCheckerHook(createPluginInput())
|
const hook = createAutoUpdateCheckerHook(createPluginInput())
|
||||||
|
|
||||||
//#when - session.created event is fired twice
|
//#when - session.created event is fired twice
|
||||||
hook.event({
|
runSessionCreatedEvent(hook)
|
||||||
event: {
|
runSessionCreatedEvent(hook)
|
||||||
type: "session.created",
|
await flushScheduledWork()
|
||||||
},
|
|
||||||
})
|
|
||||||
hook.event({
|
|
||||||
event: {
|
|
||||||
type: "session.created",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
||||||
|
|
||||||
//#then - side effects execute only once
|
//#then - side effects execute only once
|
||||||
expect(mockShowConfigErrorsIfAny).toHaveBeenCalledTimes(1)
|
expect(mockShowConfigErrorsIfAny).toHaveBeenCalledTimes(1)
|
||||||
@@ -179,12 +177,8 @@ describe("createAutoUpdateCheckerHook", () => {
|
|||||||
const hook = createAutoUpdateCheckerHook(createPluginInput())
|
const hook = createAutoUpdateCheckerHook(createPluginInput())
|
||||||
|
|
||||||
//#when - session.created event arrives
|
//#when - session.created event arrives
|
||||||
hook.event({
|
runSessionCreatedEvent(hook)
|
||||||
event: {
|
await flushScheduledWork()
|
||||||
type: "session.created",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
||||||
|
|
||||||
//#then - local dev toast is shown and background check is skipped
|
//#then - local dev toast is shown and background check is skipped
|
||||||
expect(mockShowConfigErrorsIfAny).toHaveBeenCalledTimes(1)
|
expect(mockShowConfigErrorsIfAny).toHaveBeenCalledTimes(1)
|
||||||
@@ -206,7 +200,7 @@ describe("createAutoUpdateCheckerHook", () => {
|
|||||||
type: "session.deleted",
|
type: "session.deleted",
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
await new Promise((resolve) => setTimeout(resolve, 50))
|
await flushScheduledWork()
|
||||||
|
|
||||||
//#then - no startup actions run
|
//#then - no startup actions run
|
||||||
expect(mockShowConfigErrorsIfAny).not.toHaveBeenCalled()
|
expect(mockShowConfigErrorsIfAny).not.toHaveBeenCalled()
|
||||||
@@ -225,12 +219,8 @@ describe("createAutoUpdateCheckerHook", () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
//#when - session.created event arrives
|
//#when - session.created event arrives
|
||||||
hook.event({
|
runSessionCreatedEvent(hook)
|
||||||
event: {
|
await flushScheduledWork()
|
||||||
type: "session.created",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
||||||
|
|
||||||
//#then - startup toast includes sisyphus wording
|
//#then - startup toast includes sisyphus wording
|
||||||
expect(mockShowVersionToast).toHaveBeenCalledTimes(1)
|
expect(mockShowVersionToast).toHaveBeenCalledTimes(1)
|
||||||
|
|||||||
Reference in New Issue
Block a user