test(auto-update-checker): cover session.created trigger with parentID guard

This commit is contained in:
Sisyphus
2026-04-18 17:19:18 +09:00
parent 1d187097f3
commit a8504be70c
2 changed files with 65 additions and 42 deletions
+61 -25
View File
@@ -109,53 +109,82 @@ const resetDeferredState = (): void => {
scheduledCheck = null
}
const triggerDeferredIdleCheck = async (
hook: ReturnType<CreateAutoUpdateCheckerHook>,
): Promise<void> => {
hook.event({ event: { type: "session.idle" } })
const runScheduledCheck = async (): Promise<void> => {
scheduledCheck?.()
await flushMicrotasks(8)
}
const triggerSessionCreated = (
hook: ReturnType<CreateAutoUpdateCheckerHook>,
properties?: { info?: { parentID?: string } },
): void => {
hook.event({ event: { type: "session.created", properties } })
}
const triggerSessionIdle = (hook: ReturnType<CreateAutoUpdateCheckerHook>): void => {
hook.event({ event: { type: "session.idle" } })
}
describe("auto-update-checker hook", () => {
test("defers update check until first session idle", async () => {
test("schedules deferred check on session.created without parentID", async () => {
// given
resetDeferredState()
const { hook, mocks } = await createHook()
// when
hook.event({ event: { type: "session.created" } })
triggerSessionCreated(hook)
// then
expect(scheduleDeferredIdleCheckCallCount).toBe(0)
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
expect(mocks.showVersionToast).not.toHaveBeenCalled()
expect(mocks.runBackgroundUpdateCheck).not.toHaveBeenCalled()
expect(latestVersionCallCount).toBe(0)
// when
await triggerDeferredIdleCheck(hook)
await runScheduledCheck()
// then
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
expect(mocks.showVersionToast).toHaveBeenCalledTimes(1)
expect(mocks.runBackgroundUpdateCheck).toHaveBeenCalledTimes(1)
expect(latestVersionCallCount).toBe(1)
// when
hook.event({ event: { type: "session.idle" } })
// then
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
expect(mocks.runBackgroundUpdateCheck).toHaveBeenCalledTimes(1)
})
test("runs all startup checks on normal session.idle", async () => {
test("does not schedule deferred check on session.created with parentID", async () => {
// given
resetDeferredState()
const { hook, mocks } = await createHook()
// when
await triggerDeferredIdleCheck(hook)
triggerSessionCreated(hook, { info: { parentID: "parent-123" } })
// then
expect(scheduleDeferredIdleCheckCallCount).toBe(0)
expect(mocks.showVersionToast).not.toHaveBeenCalled()
expect(mocks.runBackgroundUpdateCheck).not.toHaveBeenCalled()
})
test("does not schedule deferred check on session.idle without session.created", async () => {
// given
resetDeferredState()
const { hook, mocks } = await createHook()
// when
triggerSessionIdle(hook)
// then
expect(scheduleDeferredIdleCheckCallCount).toBe(0)
expect(mocks.showVersionToast).not.toHaveBeenCalled()
expect(mocks.runBackgroundUpdateCheck).not.toHaveBeenCalled()
})
test("runs all startup checks after deferred session.created check executes", async () => {
// given
resetDeferredState()
const { hook, mocks } = await createHook()
// when
triggerSessionCreated(hook)
await runScheduledCheck()
// then
expect(mocks.showConfigErrorsIfAny).toHaveBeenCalledTimes(1)
@@ -166,16 +195,21 @@ describe("auto-update-checker hook", () => {
expect(mocks.runBackgroundUpdateCheck).toHaveBeenCalledTimes(1)
})
test("runs only once (hasChecked guard)", async () => {
test("guards double execution across repeated session.created events", async () => {
// given
resetDeferredState()
const { hook, mocks } = await createHook()
// when
hook.event({ event: { type: "session.idle" } })
hook.event({ event: { type: "session.idle" } })
scheduledCheck?.()
await flushMicrotasks(8)
triggerSessionCreated(hook)
triggerSessionCreated(hook)
// then
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
// when
await runScheduledCheck()
triggerSessionCreated(hook)
// then
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
@@ -194,7 +228,8 @@ describe("auto-update-checker hook", () => {
})
// when
await triggerDeferredIdleCheck(hook)
triggerSessionCreated(hook)
await runScheduledCheck()
// then
expect(mocks.showConfigErrorsIfAny).toHaveBeenCalledTimes(1)
@@ -212,7 +247,8 @@ describe("auto-update-checker hook", () => {
const { hook, mocks } = await createHook({ isSisyphusEnabled: true })
// when
await triggerDeferredIdleCheck(hook)
triggerSessionCreated(hook)
await runScheduledCheck()
// then
expect(mocks.showVersionToast).toHaveBeenCalledTimes(1)
+4 -17
View File
@@ -46,14 +46,6 @@ function runSessionCreatedEvent(
})
}
function runSessionIdleEvent(hook: ReturnType<typeof createAutoUpdateCheckerHook>): void {
hook.event({
event: {
type: "session.idle",
},
})
}
function drainDeferredCheck(): void {
const run = scheduledDeferredCheck
scheduledDeferredCheck = null
@@ -132,9 +124,8 @@ describe("createAutoUpdateCheckerHook", () => {
log: () => {},
})
//#when - session.created schedules work and session.idle drains it
//#when - session.created schedules work and deferred check drains it
runSessionCreatedEvent(hook)
runSessionIdleEvent(hook)
drainDeferredCheck()
await flushScheduledWork()
@@ -191,11 +182,9 @@ describe("createAutoUpdateCheckerHook", () => {
log: () => {},
})
//#when - session.created fires twice then session.idle fires twice
//#when - session.created fires twice and deferred check drains once
runSessionCreatedEvent(hook)
runSessionCreatedEvent(hook)
runSessionIdleEvent(hook)
runSessionIdleEvent(hook)
drainDeferredCheck()
await flushScheduledWork()
@@ -224,9 +213,8 @@ describe("createAutoUpdateCheckerHook", () => {
log: () => {},
})
//#when - session.created schedules and session.idle drains
//#when - session.created schedules and deferred check drains
runSessionCreatedEvent(hook)
runSessionIdleEvent(hook)
drainDeferredCheck()
await flushScheduledWork()
@@ -290,9 +278,8 @@ describe("createAutoUpdateCheckerHook", () => {
log: () => {},
})
//#when - session.created schedules and session.idle drains
//#when - session.created schedules and deferred check drains
runSessionCreatedEvent(hook)
runSessionIdleEvent(hook)
drainDeferredCheck()
await flushScheduledWork()