From a8504be70c3896417c1af8e82b930a84e6318a25 Mon Sep 17 00:00:00 2001 From: Sisyphus Date: Sat, 18 Apr 2026 17:19:18 +0900 Subject: [PATCH] test(auto-update-checker): cover session.created trigger with parentID guard --- src/hooks/auto-update-checker/hook.test.ts | 86 +++++++++++++++------- src/hooks/zauc-mocks-hook/hook.test.ts | 21 +----- 2 files changed, 65 insertions(+), 42 deletions(-) diff --git a/src/hooks/auto-update-checker/hook.test.ts b/src/hooks/auto-update-checker/hook.test.ts index 4a8096bb9..4dba87298 100644 --- a/src/hooks/auto-update-checker/hook.test.ts +++ b/src/hooks/auto-update-checker/hook.test.ts @@ -109,53 +109,82 @@ const resetDeferredState = (): void => { scheduledCheck = null } -const triggerDeferredIdleCheck = async ( - hook: ReturnType, -): Promise => { - hook.event({ event: { type: "session.idle" } }) +const runScheduledCheck = async (): Promise => { scheduledCheck?.() await flushMicrotasks(8) } +const triggerSessionCreated = ( + hook: ReturnType, + properties?: { info?: { parentID?: string } }, +): void => { + hook.event({ event: { type: "session.created", properties } }) +} + +const triggerSessionIdle = (hook: ReturnType): 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) diff --git a/src/hooks/zauc-mocks-hook/hook.test.ts b/src/hooks/zauc-mocks-hook/hook.test.ts index 9303b0ffb..ce1e3e3d3 100644 --- a/src/hooks/zauc-mocks-hook/hook.test.ts +++ b/src/hooks/zauc-mocks-hook/hook.test.ts @@ -46,14 +46,6 @@ function runSessionCreatedEvent( }) } -function runSessionIdleEvent(hook: ReturnType): 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()