Files
ftb-project-management/apps/web/lib/linkage-engine.test.ts
2026-06-29 15:07:07 +08:00

40 lines
1.3 KiB
TypeScript

import test from 'node:test';
import assert from 'node:assert/strict';
import type { DevTask } from './dev-task';
import { canEditRequirement } from './linkage-engine';
import * as linkageEngine from './linkage-engine';
function task(patch: Partial<DevTask> = {}): DevTask {
return {
id: 'task-1',
taskNo: 'DEV-001',
requirementId: 'req-1',
title: 'Implement requirement',
categoryId: 'cat-frontend',
assigneeId: 'Alice',
priority: 'P2',
expectedStartAt: '2026-06-25T01:00:00.000Z',
expectedEndAt: '2026-06-25T02:00:00.000Z',
status: 'todo',
isBlocked: false,
createdBy: 'PM',
createdAt: '2026-06-25T00:00:00.000Z',
updatedAt: '2026-06-25T00:00:00.000Z',
...patch,
};
}
test('completed requirement development status cannot be edited', () => {
assert.equal(canEditRequirement('req-1', [task({ status: 'submitted' })]), false);
});
test('active or completed requirement development status cannot be closed', () => {
const canCloseRequirement = (linkageEngine as any).canCloseRequirement;
assert.equal(typeof canCloseRequirement, 'function');
assert.equal(canCloseRequirement('req-1', [task({ status: 'in_progress' })]), false);
assert.equal(canCloseRequirement('req-1', [task({ status: 'testing' })]), false);
assert.equal(canCloseRequirement('req-1', [task({ status: 'submitted' })]), false);
});