muse-agent-example/tests/单元/test_流程登记与保护.py
zizi e99a952dd0 W05 任务状态、租约、事件与恢复:任务状态机、短事务租约、事件续接、恢复控制与作用域互斥。
按 R2 串行阶段整理提交;包内文件为该阶段交付(含后续小增量),状态以工作包清单为准。
2026-09-10 19:25:40 +08:00

58 lines
2.1 KiB
Python

"""流程发布前的处理器身份、版本与保护路径合同。"""
import pytest
from muse.任务运行.接口 import 步骤处理器, 步骤结果, 步骤计划
from muse.编排.接口 import 流程定义, 流程校验错误, 流程登记
def 构造登记() -> 流程登记:
登记 = 流程登记()
登记.登记处理器(
步骤处理器("guard", "1", lambda _: 步骤结果({}), "v1", "v1", 保护职责="来源校验")
)
登记.登记处理器(步骤处理器("work", "1", lambda _: 步骤结果({}), "v1", "v1"))
登记.登记类型("example", 必需保护=("来源校验",))
return 登记
def test_未知处理器与保护绕行拒绝__a50001() -> None:
登记 = 构造登记()
with pytest.raises(流程校验错误):
登记.冻结(流程定义("example", "1", (步骤计划("s1", "/tmp/script.py", "1"),)))
with pytest.raises(流程校验错误, match="保护"):
登记.冻结(
流程定义(
"example", "1", (步骤计划("guard", "guard", "1"), 步骤计划("work", "work", "1"))
)
)
计划 = 登记.冻结(
流程定义(
"example",
"1",
(步骤计划("guard", "guard", "1"), 步骤计划("work", "work", "1", ("guard",))),
)
)
assert 计划.流程ID == "example"
def test_流程依赖环与不兼容槽位拒绝__a50002() -> None:
登记 = 构造登记()
with pytest.raises(流程校验错误, match="环"):
登记.冻结(
流程定义(
"example",
"1",
(步骤计划("g", "guard", "1", ("w",)), 步骤计划("w", "work", "1", ("g",))),
)
)
登记.登记处理器(步骤处理器("incompatible", "1", lambda _: 步骤结果({}), "v2", "v2"))
with pytest.raises(流程校验错误, match="合同"):
登记.冻结(
流程定义(
"example",
"1",
(步骤计划("g", "guard", "1"), 步骤计划("w", "incompatible", "1", ("g",))),
)
)