Files
Agent-System/web/src/lib/createProjectSubmitGuard.test.ts
T
weichenandCursor eee42d1d16 feat(workflow-design): catalog-driven software create wizard and docs_only PI
Software projects mount only bootstrap/delivery keys and skip the medical
seven-template clone. SWBOOT-10 stays a fail-closed stub.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 04:11:03 +00:00

58 lines
2.0 KiB
TypeScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {
beginCreateProjectSubmit,
createProjectSubmitButtonLabel,
endCreateProjectSubmit,
resolveCreateProjectSubmitPhase,
shouldBlockCreateProjectClose,
shouldCloneMedicalTemplates,
} from './createProjectSubmitGuard';
test('beginCreateProjectSubmit rejects concurrent second entry until end', async () => {
const lock = { current: false };
let entered = 0;
let creates = 0;
const run = async () => {
if (!beginCreateProjectSubmit(lock)) return;
entered += 1;
try {
creates += 1;
await new Promise((r) => setTimeout(r, 30));
} finally {
endCreateProjectSubmit(lock);
}
};
await Promise.all([run(), run(), run()]);
assert.equal(entered, 1);
assert.equal(creates, 1);
assert.equal(lock.current, false);
// 失败/结束后允许串行重试
assert.equal(beginCreateProjectSubmit(lock), true);
endCreateProjectSubmit(lock);
assert.equal(lock.current, false);
});
test('resolveCreateProjectSubmitPhase uses bootstrap to choose syncing label', () => {
assert.equal(resolveCreateProjectSubmitPhase(null), 'creating');
assert.equal(resolveCreateProjectSubmitPhase(0), 'creating');
assert.equal(resolveCreateProjectSubmitPhase(6071), 'syncing_members');
});
test('createProjectSubmitButtonLabel and close block while submitting', () => {
assert.equal(createProjectSubmitButtonLabel(false, null), '确认立项并创建会话');
assert.equal(createProjectSubmitButtonLabel(true, 'creating'), '立项中');
assert.equal(createProjectSubmitButtonLabel(true, 'syncing_members'), '同步成员中');
assert.equal(shouldBlockCreateProjectClose(true), true);
assert.equal(shouldBlockCreateProjectClose(false), false);
});
test('shouldCloneMedicalTemplates skips the 7-pack for software domain', () => {
assert.equal(shouldCloneMedicalTemplates('non_medical_software'), false);
assert.equal(shouldCloneMedicalTemplates('medical_device'), true);
assert.equal(shouldCloneMedicalTemplates(undefined), true);
});