Files
Agent-System/web/src/lib/projectSettingsMode.test.ts
T
weichenandCursor 8e4beff5f8 feat(web): allow duty reassignment in frozen project settings
Show editable duty selects after activation when the user has
project:assign_lead, calling the new PATCH API instead of workflow-plan PUT.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-20 09:48:27 +00:00

108 lines
3.2 KiB
TypeScript

import { describe, it } from 'node:test';
import assert from 'node:assert/strict';
import {
afterFrozenConflictReload,
frozenDutySnapshot,
projectSettingsChrome,
resolveProjectSettingsMode,
shouldShowPlanEditor,
shouldShowSavePreview,
} from './projectSettingsMode';
import type { WorkflowPlan } from '../types/projectSettings';
describe('projectSettingsMode', () => {
it('enters frozen when can_edit_plan is false or the project is active', () => {
assert.equal(
resolveProjectSettingsMode({
settings: { can_edit_plan: false, lifecycle_status: 'planning' },
}),
'frozen',
);
assert.equal(
resolveProjectSettingsMode({
settings: { can_edit_plan: true, lifecycle_status: 'active' },
}),
'frozen',
);
assert.equal(
resolveProjectSettingsMode({
settings: {
can_edit_plan: true,
lifecycle_status: 'planning',
live_instance: { id: 89, status: 'active', config_revision: 1 },
},
}),
'frozen',
);
assert.equal(shouldShowPlanEditor('frozen'), false);
assert.equal(shouldShowSavePreview('frozen'), false);
const chrome = projectSettingsChrome('frozen');
assert.equal(chrome.showWorkflowSelector, false);
assert.equal(chrome.showDutySelects, false);
assert.equal(chrome.showSavePreview, false);
assert.equal(chrome.showFrozenSnapshot, true);
assert.equal(chrome.showDutyReassign, true);
});
it('stays planning only for an editable draft', () => {
assert.equal(
resolveProjectSettingsMode({
settings: { can_edit_plan: true, lifecycle_status: 'planning' },
}),
'planning',
);
assert.equal(shouldShowPlanEditor('planning'), true);
assert.equal(shouldShowSavePreview('planning'), true);
});
it('lists enabled duties for the frozen snapshot and skips disabled tasks', () => {
const plan: WorkflowPlan = {
workflow_definition_key: 'main',
workflow_version: 2,
stages: [
{
stage_key: 'V0.1_triage',
enabled: true,
doc_tasks: [
{
task_key: 'intake',
task_title: '用户初始需求收集表',
enabled: true,
duties: { author_user_id: 9, reviewer_user_id: 2, approver_user_id: 3 },
},
{
task_key: 'research',
enabled: false,
duties: { author_user_id: 9 },
},
],
},
],
};
assert.deepEqual(frozenDutySnapshot(plan), [
{
taskKey: 'intake',
title: '用户初始需求收集表',
author: 9,
reviewer: 2,
approver: 3,
},
]);
});
it('keeps the local draft after PLAN_FROZEN refresh and switches to frozen', () => {
const draft: WorkflowPlan = {
workflow_definition_key: 'main',
workflow_version: 1,
stages: [],
};
const recovered = afterFrozenConflictReload(
{ can_edit_plan: false, lifecycle_status: 'active' },
draft,
);
assert.equal(recovered.plan, draft);
assert.equal(recovered.mode, 'frozen');
assert.equal(projectSettingsChrome(recovered.mode).showSavePreview, false);
});
});