76 lines
1.8 KiB
TypeScript
76 lines
1.8 KiB
TypeScript
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
import {
|
|
runCleanupBeforeDeadline,
|
|
settleCleanupPhases,
|
|
waitForCleanup
|
|
} from './shutdown'
|
|
|
|
afterEach(() => {
|
|
vi.useRealTimers()
|
|
})
|
|
|
|
describe('waitForCleanup', () => {
|
|
it('reports completed and failed cleanup as settled', async () => {
|
|
await expect(
|
|
waitForCleanup(Promise.resolve(), 100)
|
|
).resolves.toBe(true)
|
|
await expect(
|
|
waitForCleanup(Promise.reject(new Error('cleanup failed')), 100)
|
|
).resolves.toBe(true)
|
|
})
|
|
|
|
it('stops waiting after the shutdown deadline', async () => {
|
|
vi.useFakeTimers()
|
|
const result = waitForCleanup(new Promise(() => {}), 100)
|
|
|
|
await vi.advanceTimersByTimeAsync(100)
|
|
|
|
await expect(result).resolves.toBe(false)
|
|
})
|
|
|
|
it('runs dependent cleanup phases in order despite failures', async () => {
|
|
const order: string[] = []
|
|
|
|
await settleCleanupPhases([
|
|
[
|
|
async () => {
|
|
order.push('ipc')
|
|
throw new Error('cleanup failed')
|
|
}
|
|
],
|
|
[
|
|
async () => {
|
|
order.push('gateway')
|
|
}
|
|
],
|
|
[
|
|
async () => {
|
|
order.push('knowledge')
|
|
}
|
|
]
|
|
])
|
|
|
|
expect(order).toEqual(['ipc', 'gateway', 'knowledge'])
|
|
})
|
|
|
|
it('finalizes databases only after cleanup beats the deadline', async () => {
|
|
const finalize = vi.fn()
|
|
await expect(
|
|
runCleanupBeforeDeadline(Promise.resolve(), 100, finalize)
|
|
).resolves.toBe(true)
|
|
expect(finalize).toHaveBeenCalledOnce()
|
|
|
|
vi.useFakeTimers()
|
|
const timedOutFinalize = vi.fn()
|
|
const result = runCleanupBeforeDeadline(
|
|
new Promise(() => {}),
|
|
100,
|
|
timedOutFinalize
|
|
)
|
|
await vi.advanceTimersByTimeAsync(100)
|
|
|
|
await expect(result).resolves.toBe(false)
|
|
expect(timedOutFinalize).not.toHaveBeenCalled()
|
|
})
|
|
})
|