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>
108 lines
3.2 KiB
TypeScript
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);
|
|
});
|
|
});
|