task-25: applyFilePhaseDefaults 兼容旧 Java 响应的文件阶段字段默认值
This commit is contained in:
@@ -35,3 +35,23 @@ export interface TaskProgressBatchVo<T = { taskId: number; status: string }> {
|
|||||||
items: T[]
|
items: T[]
|
||||||
missingTaskIds: number[]
|
missingTaskIds: number[]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 旧 Java 版本响应缺少文件阶段新字段时补齐默认值,保证页面行为一致。
|
||||||
|
*/
|
||||||
|
export function applyFilePhaseDefaults<T extends ResultFilePhase>(item: T | null | undefined): T & ResultFilePhase {
|
||||||
|
const source = (item ?? {}) as Partial<ResultFilePhase>
|
||||||
|
const defaults: ResultFilePhase = {
|
||||||
|
fileReady: false,
|
||||||
|
fileStatus: 'PENDING',
|
||||||
|
fileProgress: 0,
|
||||||
|
fileProgressLabel: '',
|
||||||
|
fileProgressStage: '',
|
||||||
|
freshDownloadUrl: null,
|
||||||
|
}
|
||||||
|
const merged: ResultFilePhase = { ...defaults, ...source }
|
||||||
|
if (merged.fileStatus === 'SUCCESS' && source.fileReady === undefined) {
|
||||||
|
merged.fileReady = true
|
||||||
|
}
|
||||||
|
return merged as T & ResultFilePhase
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
import { test } from 'node:test'
|
||||||
|
import assert from 'node:assert/strict'
|
||||||
|
import { applyFilePhaseDefaults, type ResultFilePhase } from '../src/shared/api/types/task.ts'
|
||||||
|
|
||||||
|
function setupWindow() {
|
||||||
|
;(globalThis as Record<string, unknown>).window = {
|
||||||
|
localStorage: { getItem: () => '42' },
|
||||||
|
location: { origin: 'http://localhost' },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
test('test_defaults_filled', () => {
|
||||||
|
setupWindow()
|
||||||
|
const result = applyFilePhaseDefaults({})
|
||||||
|
assert.equal(result.fileReady, false)
|
||||||
|
assert.equal(result.fileStatus, 'PENDING')
|
||||||
|
assert.equal(result.fileProgress, 0)
|
||||||
|
assert.equal(result.fileProgressLabel, '')
|
||||||
|
assert.equal(result.fileProgressStage, '')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_existing_values_kept', () => {
|
||||||
|
setupWindow()
|
||||||
|
const result = applyFilePhaseDefaults({ fileStatus: 'RUNNING', fileProgress: 50 })
|
||||||
|
assert.equal(result.fileStatus, 'RUNNING')
|
||||||
|
assert.equal(result.fileProgress, 50)
|
||||||
|
assert.equal(result.fileReady, false)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_file_ready_true_preserved', () => {
|
||||||
|
setupWindow()
|
||||||
|
const result = applyFilePhaseDefaults({ fileReady: true })
|
||||||
|
assert.equal(result.fileReady, true)
|
||||||
|
assert.equal(result.fileStatus, 'PENDING')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_partial_input', () => {
|
||||||
|
setupWindow()
|
||||||
|
const result = applyFilePhaseDefaults({ fileStatus: 'FAILED', fileProgressStage: 'unzip' })
|
||||||
|
assert.equal(result.fileStatus, 'FAILED')
|
||||||
|
assert.equal(result.fileProgressStage, 'unzip')
|
||||||
|
assert.equal(result.fileReady, false)
|
||||||
|
assert.equal(result.fileProgress, 0)
|
||||||
|
assert.equal(result.fileProgressLabel, '')
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_null_input_safe', () => {
|
||||||
|
setupWindow()
|
||||||
|
const result = applyFilePhaseDefaults(null as unknown as ResultFilePhase)
|
||||||
|
assert.equal(result.fileReady, false)
|
||||||
|
assert.equal(result.fileStatus, 'PENDING')
|
||||||
|
assert.equal(result.fileProgress, 0)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_defaults_idempotent', () => {
|
||||||
|
setupWindow()
|
||||||
|
const once = applyFilePhaseDefaults({})
|
||||||
|
const twice = applyFilePhaseDefaults(once)
|
||||||
|
assert.deepEqual(twice, once)
|
||||||
|
assert.equal(twice.fileReady, false)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_status_success_maps_ready', () => {
|
||||||
|
setupWindow()
|
||||||
|
const result = applyFilePhaseDefaults({ fileStatus: 'SUCCESS' })
|
||||||
|
assert.equal(result.fileReady, true)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('test_unknown_status_untouched', () => {
|
||||||
|
setupWindow()
|
||||||
|
const result = applyFilePhaseDefaults({ fileStatus: 'WEIRD_STATE' })
|
||||||
|
assert.equal(result.fileReady, false)
|
||||||
|
assert.equal(result.fileStatus, 'WEIRD_STATE')
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user