"""流程发布前的处理器身份、版本与保护路径合同。""" 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",))), ) )