55 lines
2.1 KiB
TypeScript
55 lines
2.1 KiB
TypeScript
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> = {}): 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天');
|
|
});
|