import test from 'node:test'; import assert from 'node:assert/strict'; import { privacyDeletionProgress, privacyRequestsWithDetail } from '../src/pages/privacy-detail.ts'; const request = { id: 'request-a', request_type: 'DELETE', status: 'EXECUTING', legal_hold: false, version: 2, updated_at: '2026-10-05T00:00:00Z', subtasks: [] }; const tasks = statuses => statuses.map((status, index) => ({ id: `task-${index}`, status })); test('list-only evidence never claims 0/0 or completion', () => { const progress = privacyDeletionProgress({ ...request, status: 'COMPLETED' }); assert.equal(progress.complete, false); assert.equal(progress.label, '尚未全部清除'); assert.doesNotMatch(progress.progress, /0\/0/); assert.match(progress.summary, /暂不能确认/); }); test('four checked, one failed and one waiting stays incomplete', () => { const progress = privacyDeletionProgress({ ...request, subtasks: tasks(['COMPLETED', 'SKIPPED', 'COMPLETED', 'COMPLETED', 'FAILED', 'PENDING']) }); assert.equal(progress.progress, '已核对 4/6'); assert.equal(progress.complete, false); assert.doesNotMatch(progress.summary, /自动重试|正在重试|已全部清除/); }); test('historical completed parent with a failed child cannot claim completion', () => { const progress = privacyDeletionProgress({ ...request, status: 'COMPLETED', subtasks: tasks(['COMPLETED', 'FAILED']) }); assert.equal(progress.complete, false); assert.match(progress.summary, /信息不一致/); }); test('all checked subtasks still require final parent confirmation and no hold', () => { const subtasks = tasks(['COMPLETED', 'SKIPPED']); assert.equal(privacyDeletionProgress({ ...request, subtasks }).complete, false); assert.equal(privacyDeletionProgress({ ...request, status: 'COMPLETED', legal_hold: true, subtasks }).complete, false); assert.equal(privacyDeletionProgress({ ...request, status: 'COMPLETED', subtasks }).complete, true); }); test('a newer list invalidates both the progress evidence and its read timestamp identity', () => { const detail = { ...request, subtasks: tasks(['COMPLETED', 'FAILED']) }; const summary = { ...request, version: 3 }; const displayed = privacyRequestsWithDetail([summary], detail, true)[0]; assert.notEqual(displayed, detail); assert.equal(privacyDeletionProgress(displayed).total, 0); });