Files
boss/tests/dispatch-plan-ui.test.ts

134 lines
4.4 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import test from "node:test";
import assert from "node:assert/strict";
import {
extractApprovedTargetProjectIds,
latestRejectedDispatchPlan,
latestPendingDispatchPlan,
resolveDispatchPlanComposerState,
summarizeDispatchPlan,
} from "@/lib/dispatch-plan-ui";
test("summarizeDispatchPlan combines summary and recommended target titles", () => {
const summary = summarizeDispatchPlan({
planId: "dispatch-plan-0",
summary: "主 Agent 建议先同步 UI 和设备线程",
targets: [
{ projectId: "p1", threadDisplayName: "Boss UI 主线程" },
{ projectId: "p2", threadDisplayName: "设备接入线程" },
],
});
assert.equal(summary, "主 Agent 建议先同步 UI 和设备线程\n推荐线程Boss UI 主线程、设备接入线程");
});
test("extractApprovedTargetProjectIds keeps target order and drops blanks", () => {
const ids = extractApprovedTargetProjectIds({
planId: "dispatch-plan-0",
targets: [
{ projectId: "p2", threadDisplayName: "设备接入线程" },
{ projectId: "p1", threadDisplayName: "Boss UI 主线程" },
],
});
assert.deepEqual(ids, ["p2", "p1"]);
});
test("latestPendingDispatchPlan returns the latest waiting confirmation item", () => {
const plan = latestPendingDispatchPlan([
{
planId: "dispatch-plan-1",
status: "dispatched",
summary: "已完成的推荐",
targets: [{ projectId: "p1", threadDisplayName: "Boss UI 主线程" }],
},
{
planId: "dispatch-plan-2",
status: "pending_user_confirmation",
summary: "等待确认的推荐",
targets: [{ projectId: "p2", threadDisplayName: "设备接入线程" }],
},
]);
assert.deepEqual(plan, {
planId: "dispatch-plan-2",
status: "pending_user_confirmation",
summary: "等待确认的推荐",
targets: [{ projectId: "p2", threadDisplayName: "设备接入线程" }],
});
});
test("latestRejectedDispatchPlan returns the latest rejected item", () => {
const plan = latestRejectedDispatchPlan([
{
planId: "dispatch-plan-1",
status: "dispatched",
summary: "已完成的推荐",
targets: [{ projectId: "p1", threadDisplayName: "Boss UI 主线程" }],
},
{
planId: "dispatch-plan-3",
status: "rejected",
summary: "已拒绝的推荐",
targets: [{ projectId: "p3", threadDisplayName: "调度修复线程" }],
},
]);
assert.deepEqual(plan, {
planId: "dispatch-plan-3",
status: "rejected",
summary: "已拒绝的推荐",
targets: [{ projectId: "p3", threadDisplayName: "调度修复线程" }],
});
});
test("resolveDispatchPlanComposerState folds older rejected plans once a newer pending plan exists", () => {
const state = resolveDispatchPlanComposerState([
{
planId: "dispatch-plan-1",
status: "rejected",
summary: "已拒绝的推荐",
targets: [{ projectId: "p3", threadDisplayName: "调度修复线程" }],
},
{
planId: "dispatch-plan-2",
status: "pending_user_confirmation",
summary: "重新生成的推荐",
targets: [{ projectId: "p2", threadDisplayName: "设备接入线程" }],
},
]);
assert.deepEqual(state.pendingDispatchPlan, {
planId: "dispatch-plan-2",
status: "pending_user_confirmation",
summary: "重新生成的推荐",
targets: [{ projectId: "p2", threadDisplayName: "设备接入线程" }],
});
assert.equal(state.rejectedDispatchPlan, null);
assert.equal(state.recoveryHint, "当前有待确认推荐,已折叠旧的拒绝状态。");
assert.equal(state.recoveryActionLabel, null);
});
test("resolveDispatchPlanComposerState exposes a retry action for a rejected plan", () => {
const state = resolveDispatchPlanComposerState([
{
planId: "dispatch-plan-3",
status: "rejected",
summary: "已拒绝的推荐",
targets: [{ projectId: "p3", threadDisplayName: "调度修复线程" }],
},
]);
assert.equal(state.pendingDispatchPlan, null);
assert.deepEqual(state.rejectedDispatchPlan, {
planId: "dispatch-plan-3",
status: "rejected",
summary: "已拒绝的推荐",
targets: [{ projectId: "p3", threadDisplayName: "调度修复线程" }],
});
assert.equal(state.recoveryActionLabel, "重新生成新的推荐");
assert.equal(
state.recoveryHint,
"上次推荐已拒绝。直接点击“重新生成新的推荐”即可继续协作,不用重新发送整条消息。",
);
});