Files
ftb-project-management/apps/web/lib/version-form.test.ts
Script Generator 8947aeaac7 feat(工作台): 细化计划进展工时证据
关键改动:

- 支持需求覆盖和调研方向开始工作记录

- 日报按计划记录开始时间和进度下次开始时间计算证据

- 更新版本编辑校验、项目展示和 workflow 说明

Co-Authored-By: Codex GPT-5 <codex@openai.com>
2026-07-01 11:02:38 +08:00

100 lines
3.2 KiB
TypeScript

import assert from 'node:assert/strict';
import test from 'node:test';
import {
VERSION_DEVELOPMENT_TYPE_OPTIONS,
buildVersionName,
canSubmitNewVersionForm,
canSubmitVersionEditForm,
getEditableVersionNumber,
getRecommendedExpectedReleaseDate,
getVersionDevelopmentTypeOption,
} from './version-form';
test('canSubmitNewVersionForm requires expected release date', () => {
assert.equal(canSubmitNewVersionForm({
productId: 'prod-1',
projectId: 'proj-1',
versionNumber: '1.0',
developmentType: 'agile',
expectedReleaseDate: '',
submitting: false,
}), false);
assert.equal(canSubmitNewVersionForm({
productId: 'prod-1',
projectId: 'proj-1',
versionNumber: '1.0',
developmentType: 'agile',
expectedReleaseDate: '2026-07-15',
submitting: false,
}), true);
});
test('canSubmitNewVersionForm requires project development type', () => {
assert.equal(canSubmitNewVersionForm({
productId: 'prod-1',
projectId: 'proj-1',
versionNumber: '1.0',
developmentType: '',
expectedReleaseDate: '2026-07-15',
submitting: false,
}), false);
});
test('canSubmitNewVersionForm blocks duplicate submits', () => {
assert.equal(canSubmitNewVersionForm({
productId: 'prod-1',
projectId: 'proj-1',
versionNumber: '1.0',
developmentType: 'agile',
expectedReleaseDate: '2026-07-15',
submitting: true,
}), false);
});
test('canSubmitVersionEditForm requires version number and expected release date', () => {
assert.equal(canSubmitVersionEditForm({
versionNumber: '',
expectedReleaseDate: '2026-07-15',
submitting: false,
}), false);
assert.equal(canSubmitVersionEditForm({
versionNumber: '1.2',
expectedReleaseDate: '',
submitting: false,
}), false);
assert.equal(canSubmitVersionEditForm({
versionNumber: '1.2',
expectedReleaseDate: '2026-07-15',
submitting: false,
}), true);
});
test('version edit helpers keep the project prefix and editable version number separate', () => {
assert.equal(getEditableVersionNumber('小白项目', '小白项目V1.2.3'), '1.2.3');
assert.equal(getEditableVersionNumber('小白项目', '其他项目V2.0'), '2.0');
assert.equal(buildVersionName('小白项目', '1.2.3'), '小白项目V1.2.3');
});
test('version development type estimates include product design development and testing', () => {
const agile = getVersionDevelopmentTypeOption('agile');
assert.deepEqual(agile?.stages.map((stage) => stage.label), ['产品设计', '开发', '测试']);
assert.equal(agile?.totalWorkDays, 13);
assert.ok(VERSION_DEVELOPMENT_TYPE_OPTIONS.some((option) => option.key === 'waterfall'));
});
test('getRecommendedExpectedReleaseDate skips non-workdays from the stage total', () => {
assert.equal(getRecommendedExpectedReleaseDate('hotfix', new Date('2026-06-30T09:00:00')), '2026-07-02');
assert.equal(getRecommendedExpectedReleaseDate('agile', new Date('2026-06-30T09:00:00')), '2026-07-16');
});
test('getRecommendedExpectedReleaseDate excludes product design when it is already completed', () => {
assert.equal(
getRecommendedExpectedReleaseDate('agile', new Date('2026-06-30T09:00:00'), { productDesignCompleted: true }),
'2026-07-14',
);
});