import { test } from 'node:test' import assert from 'node:assert/strict' import { createRowsVersionTracker } from '../src/shared/api/task-progress-polling.ts' test('首次见到的任务需要拉取行数据', () => { const tracker = createRowsVersionTracker() const need = tracker.selectTasksNeedingRows([{ taskId: 1, rowsVersion: '100' }], [1]) assert.deepEqual(need, [1]) }) test('版本未变时不再拉取,版本变化后重新拉取', () => { const tracker = createRowsVersionTracker() tracker.selectTasksNeedingRows([{ taskId: 1, rowsVersion: '100' }], [1]) assert.deepEqual(tracker.selectTasksNeedingRows([{ taskId: 1, rowsVersion: '100' }], [1]), [], '版本相同跳过') assert.deepEqual(tracker.selectTasksNeedingRows([{ taskId: 1, rowsVersion: '101' }], [1]), [1], '版本变化要拉') }) test('拿不到版本(老后端/字段缺失)时照旧拉取', () => { const tracker = createRowsVersionTracker() assert.deepEqual(tracker.selectTasksNeedingRows([{ taskId: 1 }], [1]), [1]) assert.deepEqual(tracker.selectTasksNeedingRows([{ taskId: 1, rowsVersion: null }], [1]), [1]) assert.deepEqual(tracker.selectTasksNeedingRows([], [7]), [7], '响应里没有该任务也拉') }) test('多任务各自独立判断', () => { const tracker = createRowsVersionTracker() tracker.selectTasksNeedingRows( [{ taskId: 1, rowsVersion: 'a' }, { taskId: 2, rowsVersion: 'b' }], [1, 2], ) const need = tracker.selectTasksNeedingRows( [{ taskId: 1, rowsVersion: 'a' }, { taskId: 2, rowsVersion: 'b2' }], [1, 2], ) assert.deepEqual(need, [2]) }) test('forget 后该任务会被重新拉取(任务重跑场景)', () => { const tracker = createRowsVersionTracker() tracker.selectTasksNeedingRows([{ taskId: 5, rowsVersion: 'v1' }], [5]) tracker.forget(5) assert.deepEqual(tracker.selectTasksNeedingRows([{ taskId: 5, rowsVersion: 'v1' }], [5]), [5]) }) test('任务状态推进(行没变)也要重新拉取', () => { const tracker = createRowsVersionTracker() tracker.selectTasksNeedingRows([{ taskId: 1, rowsVersion: '100', status: 'RUNNING' }], [1]) assert.deepEqual( tracker.selectTasksNeedingRows([{ taskId: 1, rowsVersion: '100', status: 'RUNNING' }], [1]), [], '行版本与状态都没变:跳过', ) assert.deepEqual( tracker.selectTasksNeedingRows([{ taskId: 1, rowsVersion: '100', status: 'SUCCESS' }], [1]), [1], '行版本没变但任务已成功:必须拉取,否则界面卡在运行中', ) }) test('结果文件状态变化也要重新拉取', () => { const tracker = createRowsVersionTracker() tracker.selectTasksNeedingRows([{ taskId: 1, status: 'RUNNING', fileStatus: 'RUNNING', fileReady: false }], [1]) assert.deepEqual( tracker.selectTasksNeedingRows([{ taskId: 1, status: 'RUNNING', fileStatus: 'RUNNING', fileReady: false }], [1]), [], ) assert.deepEqual( tracker.selectTasksNeedingRows([{ taskId: 1, status: 'RUNNING', fileStatus: 'SUCCESS', fileReady: true }], [1]), [1], '文件就绪变化要能触发拉取(下载按钮依赖它)', ) }) test('四项信号全空视为拿不到信号:每轮都拉取', () => { const tracker = createRowsVersionTracker() assert.deepEqual(tracker.selectTasksNeedingRows([{ taskId: 1 }], [1]), [1]) assert.deepEqual(tracker.selectTasksNeedingRows([{ taskId: 1 }], [1]), [1], '老后端不给信号时保持旧行为') })