90 lines
3.1 KiB
JavaScript
90 lines
3.1 KiB
JavaScript
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)
|
|
})
|
|
|
|
test('project A superseded by a failing full refresh is not considered covered', async () => {
|
|
const coordinator = createProjectRefreshCoordinator()
|
|
const projectA = coordinator.beginProject('project-a')
|
|
const full = coordinator.beginFull()
|
|
|
|
full.finish(false)
|
|
|
|
assert.equal(await projectA.waitForCoverage(), false)
|
|
})
|
|
|
|
test('only a successful replacement confirms coverage of a superseded project', async () => {
|
|
const coordinator = createProjectRefreshCoordinator()
|
|
const firstProjectA = coordinator.beginProject('project-a')
|
|
const newerProjectA = coordinator.beginProject('project-a')
|
|
|
|
newerProjectA.finish(true)
|
|
|
|
assert.equal(await firstProjectA.waitForCoverage(), true)
|
|
})
|
|
|
|
test('a successful full refresh covers every targeted request it superseded', async () => {
|
|
const coordinator = createProjectRefreshCoordinator()
|
|
const projectA = coordinator.beginProject('project-a')
|
|
const projectB = coordinator.beginProject('project-b')
|
|
const full = coordinator.beginFull()
|
|
|
|
full.finish(true)
|
|
|
|
assert.equal(await projectA.waitForCoverage(), true)
|
|
assert.equal(await projectB.waitForCoverage(), true)
|
|
})
|