"""流程发布前的处理器身份、版本与保护路径合同。""" import pytest from muse.任务运行.接口 import 步骤处理器, 步骤结果, 步骤计划 from muse.编排.接口 import 流程定义, 流程校验错误, 流程登记 def 构造登记() -> 流程登记: 登记 = 流程登记() 登记.登记处理器( 步骤处理器("guard", "1", lambda _: 步骤结果({}), "v1", "v1", 保护职责="来源校验") ) 登记.登记处理器(步骤处理器("work", "1", lambda _: 步骤结果({}), "v1", "v1")) 登记.登记类型("example", 必需保护=("来源校验",)) return 登记 @pytest.mark.case_id( "NC-flow-protected-path", environment="离线", given="已登记代码处理器和流程类型保护", when="冻结未知处理器或绕行流程", then=["拒绝非法流程,允许保护完整的依赖链"], contract="docs/系统架构/新版设计/接口契约/任务工具与事件.md", ) 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" @pytest.mark.case_id( "NC-flow-slot-contract", environment="离线", given="版本化步骤与输入输出合同", when="冻结有环或不兼容依赖", then=["拒绝依赖环及不兼容合同"], contract="docs/系统架构/新版设计/接口契约/任务工具与事件.md", ) 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",))), ) )