import assert from 'node:assert/strict'; import test from 'node:test'; import type { VersionWithContext } from './derive'; import { filterXiaobaoWarningVersions, formatRemainingWork } from './xiaobao-warning-view'; function version(patch: Partial = {}): VersionWithContext { return { id: 'ver-1', name: 'V1.0', status: 'developing', releaseDate: null, createdAt: '2026-06-29T00:00:00.000Z', productId: 'prod-1', productName: 'FTB', projectId: 'proj-1', projectName: 'Project', expectedReleaseDate: '2026-07-05T10:00:00.000Z', members: [{ name: 'Alice', role: 'frontend' }], ...patch, }; } test('filterXiaobaoWarningVersions lets managers see every unfinished version', () => { const result = filterXiaobaoWarningVersions( [ version({ id: 'ver-1', status: 'developing', members: [{ name: 'Alice', role: 'frontend' }] }), version({ id: 'ver-2', status: 'planned', members: [{ name: 'Bob', role: 'testing' }] }), version({ id: 'ver-3', status: 'released', members: [{ name: 'Alice', role: 'frontend' }] }), ], { canManage: true, userName: 'Alice' }, ); assert.deepEqual(result.map((item) => item.id), ['ver-1', 'ver-2']); }); test('filterXiaobaoWarningVersions limits non-managers to versions where they are a member', () => { const result = filterXiaobaoWarningVersions( [ version({ id: 'ver-1', status: 'developing', members: [{ name: 'Alice', role: 'frontend' }] }), version({ id: 'ver-2', status: 'developing', members: [{ name: 'Bob', role: 'testing' }] }), version({ id: 'ver-3', status: 'closed', members: [{ name: 'Alice', role: 'frontend' }] }), ], { canManage: false, userName: 'Alice' }, ); assert.deepEqual(result.map((item) => item.id), ['ver-1']); }); test('formatRemainingWork keeps hours and adds work-day conversion', () => { assert.equal(formatRemainingWork(0), '0h / 0天'); assert.equal(formatRemainingWork(8), '8h / 1天'); assert.equal(formatRemainingWork(12), '12h / 1.5天'); assert.equal(formatRemainingWork(0.5), '0.5h / 0.1天'); });