54 lines
1.5 KiB
JavaScript
54 lines
1.5 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import { test } from 'node:test'
|
|
import { createRegenerationQueue } from '../dev-reload.js'
|
|
|
|
const waitFor = async (predicate) => {
|
|
for (let attempt = 0; attempt < 100; attempt += 1) {
|
|
if (predicate()) return
|
|
await new Promise((resolve) => setTimeout(resolve, 5))
|
|
}
|
|
assert.fail('timed out waiting for generation')
|
|
}
|
|
|
|
test('rapid edits coalesce and only the latest generation reloads', async () => {
|
|
const pending = []
|
|
const events = []
|
|
const queue = createRegenerationQueue({
|
|
generate: () => new Promise((resolve) => pending.push(resolve)),
|
|
onSuccess: () => events.push('reload'),
|
|
onError: () => events.push('error'),
|
|
delay: 1,
|
|
})
|
|
try {
|
|
queue.request()
|
|
queue.request()
|
|
await waitFor(() => pending.length === 1)
|
|
queue.request()
|
|
pending[0]()
|
|
await waitFor(() => pending.length === 2)
|
|
assert.deepEqual(events, [])
|
|
pending[1]()
|
|
await waitFor(() => events.length === 1)
|
|
assert.deepEqual(events, ['reload'])
|
|
} finally {
|
|
queue.close()
|
|
}
|
|
})
|
|
|
|
test('failed latest generation reports an error without reloading', async () => {
|
|
const events = []
|
|
const queue = createRegenerationQueue({
|
|
generate: () => Promise.reject(new Error('broken content')),
|
|
onSuccess: () => events.push('reload'),
|
|
onError: (error) => events.push(error.message),
|
|
delay: 1,
|
|
})
|
|
try {
|
|
queue.request()
|
|
await waitFor(() => events.length === 1)
|
|
assert.deepEqual(events, ['broken content'])
|
|
} finally {
|
|
queue.close()
|
|
}
|
|
})
|