Files
www/test/dev-reload.test.js
T
paul 146d516f24
Deploy website / deploy (push) Successful in 24s
Refactor site generation into a modular content pipeline
2026-09-22 20:51:13 -04:00

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()
}
})