Files
orca/src/main/codex/codex-session-migration-scheduler.test.ts
T
Brennan Benson 0ed1d04b3b fix(codex): migrate legacy shared-home sessions before resume (#9624)
* fix(codex): migrate legacy shared-home resumes

* fix(mobile): allow legacy Codex resume preparation
2026-07-20 17:10:07 -07:00

94 lines
3.1 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest'
import { createCodexSessionMigrationScheduler } from './codex-session-migration-scheduler'
describe('createCodexSessionMigrationScheduler', () => {
beforeEach(() => {
vi.useFakeTimers()
})
it('runs after a managed-account startup switches to host system default', async () => {
let eligible = false
const startBackfill = vi.fn().mockResolvedValue(null)
const startIndexHeal = vi.fn().mockResolvedValue(null)
const scheduler = createCodexSessionMigrationScheduler({
isEligible: () => eligible,
isQuitting: () => false,
resolveSystemCodexHomePathOverride: () => undefined,
startBackfill,
startIndexHeal
})
scheduler.scheduleInitialRun()
await vi.advanceTimersByTimeAsync(15_000)
expect(startBackfill).not.toHaveBeenCalled()
eligible = true
scheduler.requestRun()
await vi.waitFor(() => expect(startIndexHeal).toHaveBeenCalledOnce())
expect(startBackfill).toHaveBeenCalledOnce()
})
it('coalesces concurrent run requests and stops before index heal after opt-out', async () => {
let eligible = true
let releaseBackfill: (() => void) | undefined
const startBackfill = vi.fn(
() =>
new Promise<void>((resolve) => {
releaseBackfill = resolve
})
)
const startIndexHeal = vi.fn().mockResolvedValue(null)
const scheduler = createCodexSessionMigrationScheduler({
isEligible: () => eligible,
isQuitting: () => false,
resolveSystemCodexHomePathOverride: () => '/custom/history',
startBackfill,
startIndexHeal
})
scheduler.requestRun()
scheduler.requestRun()
expect(startBackfill).toHaveBeenCalledOnce()
expect(startBackfill).toHaveBeenCalledWith(expect.any(Object), '/custom/history')
eligible = false
releaseBackfill?.()
await Promise.resolve()
await Promise.resolve()
expect(startIndexHeal).not.toHaveBeenCalled()
})
it('reruns after a stopping migration becomes eligible again', async () => {
let eligible = true
let releaseFirstBackfill: ((result: { stopped: boolean }) => void) | undefined
const startBackfill = vi
.fn()
.mockImplementationOnce(
(_options) =>
new Promise<{ stopped: boolean }>((resolve) => {
releaseFirstBackfill = resolve
})
)
.mockResolvedValueOnce({ stopped: false })
const startIndexHeal = vi.fn().mockResolvedValue(null)
const scheduler = createCodexSessionMigrationScheduler({
isEligible: () => eligible,
isQuitting: () => false,
resolveSystemCodexHomePathOverride: () => undefined,
startBackfill,
startIndexHeal
})
scheduler.requestRun()
const firstRunOptions = startBackfill.mock.calls[0]?.[0]
eligible = false
expect(firstRunOptions?.shouldStop()).toBe(true)
eligible = true
scheduler.requestRun()
releaseFirstBackfill?.({ stopped: true })
await vi.waitFor(() => expect(startBackfill).toHaveBeenCalledTimes(2))
await vi.waitFor(() => expect(startIndexHeal).toHaveBeenCalledOnce())
})
})