fix(web): isolate project refresh recovery

This commit is contained in:
2026-07-22 13:39:48 +08:00
parent 89d2f4659f
commit 51c6fea343
5 changed files with 175 additions and 49 deletions

View File

@@ -0,0 +1,57 @@
import assert from 'node:assert/strict'
import test from 'node:test'
import {
clearPendingRefreshProjects,
createProjectRefreshCoordinator,
mergePendingRefreshProjects,
} from '../src/app/project-refresh-coordinator.ts'
test('project A and B refresh generations do not abort each other', () => {
const coordinator = createProjectRefreshCoordinator()
const projectA = coordinator.beginProject('project-a')
const projectB = coordinator.beginProject('project-b')
assert.equal(projectA.signal.aborted, false)
assert.equal(projectA.isCurrent(), true)
assert.equal(projectB.signal.aborted, false)
assert.equal(projectB.isCurrent(), true)
const newerProjectA = coordinator.beginProject('project-a')
assert.equal(projectA.signal.aborted, true)
assert.equal(projectB.signal.aborted, false)
assert.equal(newerProjectA.isCurrent(), true)
})
test('project B success cannot clear project A pending recovery', () => {
let pending = mergePendingRefreshProjects([], ['project-a'])
pending = clearPendingRefreshProjects(pending, ['project-b'])
assert.deepEqual(pending, ['project-a'])
})
test('recovery clears only successful targets and full success clears all', () => {
let pending = mergePendingRefreshProjects([], ['project-a', 'project-b'])
pending = clearPendingRefreshProjects(pending, ['project-a'])
assert.deepEqual(pending, ['project-b'])
pending = clearPendingRefreshProjects(pending)
assert.deepEqual(pending, [])
})
test('full and targeted refreshes supersede only when their coverage overlaps globally', () => {
const coordinator = createProjectRefreshCoordinator()
const projectA = coordinator.beginProject('project-a')
const projectB = coordinator.beginProject('project-b')
const full = coordinator.beginFull()
assert.equal(projectA.signal.aborted, true)
assert.equal(projectB.signal.aborted, true)
assert.equal(full.isCurrent(), true)
const newerProjectA = coordinator.beginProject('project-a')
assert.equal(full.signal.aborted, true)
assert.equal(newerProjectA.isCurrent(), true)
})