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); });