test(auto-update-checker): cover session.created trigger with parentID guard
This commit is contained in:
@@ -109,53 +109,82 @@ const resetDeferredState = (): void => {
|
|||||||
scheduledCheck = null
|
scheduledCheck = null
|
||||||
}
|
}
|
||||||
|
|
||||||
const triggerDeferredIdleCheck = async (
|
const runScheduledCheck = async (): Promise<void> => {
|
||||||
hook: ReturnType<CreateAutoUpdateCheckerHook>,
|
|
||||||
): Promise<void> => {
|
|
||||||
hook.event({ event: { type: "session.idle" } })
|
|
||||||
scheduledCheck?.()
|
scheduledCheck?.()
|
||||||
await flushMicrotasks(8)
|
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", () => {
|
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
|
// given
|
||||||
resetDeferredState()
|
resetDeferredState()
|
||||||
const { hook, mocks } = await createHook()
|
const { hook, mocks } = await createHook()
|
||||||
|
|
||||||
// when
|
// when
|
||||||
hook.event({ event: { type: "session.created" } })
|
triggerSessionCreated(hook)
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(scheduleDeferredIdleCheckCallCount).toBe(0)
|
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
|
||||||
expect(mocks.showVersionToast).not.toHaveBeenCalled()
|
expect(mocks.showVersionToast).not.toHaveBeenCalled()
|
||||||
expect(mocks.runBackgroundUpdateCheck).not.toHaveBeenCalled()
|
expect(mocks.runBackgroundUpdateCheck).not.toHaveBeenCalled()
|
||||||
expect(latestVersionCallCount).toBe(0)
|
expect(latestVersionCallCount).toBe(0)
|
||||||
|
|
||||||
// when
|
// when
|
||||||
await triggerDeferredIdleCheck(hook)
|
await runScheduledCheck()
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
|
|
||||||
expect(mocks.showVersionToast).toHaveBeenCalledTimes(1)
|
expect(mocks.showVersionToast).toHaveBeenCalledTimes(1)
|
||||||
expect(mocks.runBackgroundUpdateCheck).toHaveBeenCalledTimes(1)
|
expect(mocks.runBackgroundUpdateCheck).toHaveBeenCalledTimes(1)
|
||||||
expect(latestVersionCallCount).toBe(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
|
// given
|
||||||
resetDeferredState()
|
resetDeferredState()
|
||||||
const { hook, mocks } = await createHook()
|
const { hook, mocks } = await createHook()
|
||||||
|
|
||||||
// when
|
// 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
|
// then
|
||||||
expect(mocks.showConfigErrorsIfAny).toHaveBeenCalledTimes(1)
|
expect(mocks.showConfigErrorsIfAny).toHaveBeenCalledTimes(1)
|
||||||
@@ -166,16 +195,21 @@ describe("auto-update-checker hook", () => {
|
|||||||
expect(mocks.runBackgroundUpdateCheck).toHaveBeenCalledTimes(1)
|
expect(mocks.runBackgroundUpdateCheck).toHaveBeenCalledTimes(1)
|
||||||
})
|
})
|
||||||
|
|
||||||
test("runs only once (hasChecked guard)", async () => {
|
test("guards double execution across repeated session.created events", async () => {
|
||||||
// given
|
// given
|
||||||
resetDeferredState()
|
resetDeferredState()
|
||||||
const { hook, mocks } = await createHook()
|
const { hook, mocks } = await createHook()
|
||||||
|
|
||||||
// when
|
// when
|
||||||
hook.event({ event: { type: "session.idle" } })
|
triggerSessionCreated(hook)
|
||||||
hook.event({ event: { type: "session.idle" } })
|
triggerSessionCreated(hook)
|
||||||
scheduledCheck?.()
|
|
||||||
await flushMicrotasks(8)
|
// then
|
||||||
|
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
|
||||||
|
|
||||||
|
// when
|
||||||
|
await runScheduledCheck()
|
||||||
|
triggerSessionCreated(hook)
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
|
expect(scheduleDeferredIdleCheckCallCount).toBe(1)
|
||||||
@@ -194,7 +228,8 @@ describe("auto-update-checker hook", () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// when
|
// when
|
||||||
await triggerDeferredIdleCheck(hook)
|
triggerSessionCreated(hook)
|
||||||
|
await runScheduledCheck()
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(mocks.showConfigErrorsIfAny).toHaveBeenCalledTimes(1)
|
expect(mocks.showConfigErrorsIfAny).toHaveBeenCalledTimes(1)
|
||||||
@@ -212,7 +247,8 @@ describe("auto-update-checker hook", () => {
|
|||||||
const { hook, mocks } = await createHook({ isSisyphusEnabled: true })
|
const { hook, mocks } = await createHook({ isSisyphusEnabled: true })
|
||||||
|
|
||||||
// when
|
// when
|
||||||
await triggerDeferredIdleCheck(hook)
|
triggerSessionCreated(hook)
|
||||||
|
await runScheduledCheck()
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(mocks.showVersionToast).toHaveBeenCalledTimes(1)
|
expect(mocks.showVersionToast).toHaveBeenCalledTimes(1)
|
||||||
|
|||||||
@@ -46,14 +46,6 @@ function runSessionCreatedEvent(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function runSessionIdleEvent(hook: ReturnType<typeof createAutoUpdateCheckerHook>): void {
|
|
||||||
hook.event({
|
|
||||||
event: {
|
|
||||||
type: "session.idle",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function drainDeferredCheck(): void {
|
function drainDeferredCheck(): void {
|
||||||
const run = scheduledDeferredCheck
|
const run = scheduledDeferredCheck
|
||||||
scheduledDeferredCheck = null
|
scheduledDeferredCheck = null
|
||||||
@@ -132,9 +124,8 @@ describe("createAutoUpdateCheckerHook", () => {
|
|||||||
log: () => {},
|
log: () => {},
|
||||||
})
|
})
|
||||||
|
|
||||||
//#when - session.created schedules work and session.idle drains it
|
//#when - session.created schedules work and deferred check drains it
|
||||||
runSessionCreatedEvent(hook)
|
runSessionCreatedEvent(hook)
|
||||||
runSessionIdleEvent(hook)
|
|
||||||
drainDeferredCheck()
|
drainDeferredCheck()
|
||||||
await flushScheduledWork()
|
await flushScheduledWork()
|
||||||
|
|
||||||
@@ -191,11 +182,9 @@ describe("createAutoUpdateCheckerHook", () => {
|
|||||||
log: () => {},
|
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)
|
||||||
runSessionCreatedEvent(hook)
|
runSessionCreatedEvent(hook)
|
||||||
runSessionIdleEvent(hook)
|
|
||||||
runSessionIdleEvent(hook)
|
|
||||||
drainDeferredCheck()
|
drainDeferredCheck()
|
||||||
await flushScheduledWork()
|
await flushScheduledWork()
|
||||||
|
|
||||||
@@ -224,9 +213,8 @@ describe("createAutoUpdateCheckerHook", () => {
|
|||||||
log: () => {},
|
log: () => {},
|
||||||
})
|
})
|
||||||
|
|
||||||
//#when - session.created schedules and session.idle drains
|
//#when - session.created schedules and deferred check drains
|
||||||
runSessionCreatedEvent(hook)
|
runSessionCreatedEvent(hook)
|
||||||
runSessionIdleEvent(hook)
|
|
||||||
drainDeferredCheck()
|
drainDeferredCheck()
|
||||||
await flushScheduledWork()
|
await flushScheduledWork()
|
||||||
|
|
||||||
@@ -290,9 +278,8 @@ describe("createAutoUpdateCheckerHook", () => {
|
|||||||
log: () => {},
|
log: () => {},
|
||||||
})
|
})
|
||||||
|
|
||||||
//#when - session.created schedules and session.idle drains
|
//#when - session.created schedules and deferred check drains
|
||||||
runSessionCreatedEvent(hook)
|
runSessionCreatedEvent(hook)
|
||||||
runSessionIdleEvent(hook)
|
|
||||||
drainDeferredCheck()
|
drainDeferredCheck()
|
||||||
await flushScheduledWork()
|
await flushScheduledWork()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user