Files
Starlight_Launcher/apps/app-frontend/src/helpers/hosted-download-failures.test.ts
T
Disy bf95d715a4
Sync source to CNB / Sync Git ref (push) Skipped
Axolotl desktop CI / guardrails (push) Canceled after 0s
Axolotl desktop CI / desktop (macos-latest) (push) Canceled after 0s
Axolotl desktop CI / desktop (ubuntu-latest) (push) Canceled after 0s
Axolotl desktop CI / desktop (windows-latest) (push) Canceled after 0s
Axolotl desktop CI / website (push) Canceled after 0s
Repository checks / typos (push) Canceled after 0s
Repository checks / tombi (push) Canceled after 0s
Rust checks / shear (push) Canceled after 0s
fix: make hosted downloads controllable and failures diagnosable
2026-10-20 21:25:19 +08:00

74 lines
2.7 KiB
TypeScript

import assert from 'node:assert/strict'
import test from 'node:test'
import { createHostedDownloadFailures } from './hosted-download-failures.ts'
test('stopped hosted downloads retain their state and instance for direct retry', () => {
const state = createHostedDownloadFailures()
state.update({
fraction: null,
loader_uuid: 'stopped',
event: {
type: 'hosted_pack_sync',
instance_id: 'existing-instance',
state: 'canceled',
error: 'Stopped by user',
can_pause: false,
can_cancel: false,
},
})
assert.equal(state.values()[0]?.bar_type?.state, 'canceled')
assert.equal(state.values()[0]?.bar_type?.instance_id, 'existing-instance')
state.begin('existing-instance', state.values())
assert.equal(state.has('existing-instance'), false)
assert.equal(state.isRetired('stopped'), true)
})
test('retry clears only its own failure before progress arrives and ignores late old events', () => {
const state = createHostedDownloadFailures()
const failed = (instanceId: string, loader: string, error: string) => ({
fraction: null,
loader_uuid: loader,
event: { type: 'hosted_pack_sync', instance_id: instanceId, instance_name: instanceId, error },
})
const oldFailure = failed('one', 'old', 'old failure')
state.update(oldFailure)
state.update(failed('two', 'other', 'other failure'))
state.begin('one', state.values())
assert.equal(state.has('one'), false)
assert.equal(state.has('two'), true)
assert.equal(state.isRetired('old'), true)
state.update(oldFailure)
assert.equal(state.has('one'), false)
state.update(failed('one', 'new', 'new failure'))
state.update({ ...oldFailure, fraction: 0.5 })
assert.equal(
state.values().find((bar) => bar.bar_type?.instance_id === 'one')?.message,
'new failure',
)
})
test('a new native task retires the previous failed task without a frontend retry', () => {
const state = createHostedDownloadFailures()
const old = {
fraction: null,
loader_uuid: 'old',
event: { type: 'hosted_pack_sync', instance_id: 'instance', error: 'old failure' },
}
state.update(old)
state.update({ fraction: 0, loader_uuid: 'new', event: { ...old.event, error: null } })
state.update(old)
assert.equal(state.has('instance'), false)
})
test('late failure from an older active task cannot replace the new task', () => {
const state = createHostedDownloadFailures()
const event = { type: 'hosted_pack_sync', instance_id: 'instance' }
state.update({ fraction: 0.5, loader_uuid: 'old', event })
state.update({ fraction: 0, loader_uuid: 'new', event })
state.update({ fraction: null, loader_uuid: 'old', event: { ...event, error: 'old failure' } })
assert.equal(state.has('instance'), false)
assert.equal(state.isRetired('old'), true)
assert.equal(state.isRetired('new'), false)
})