Ctrl K
ComunidadGuías…

tests/test_actions.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""治理化 Action 审批链回归测试。

回归点:approve_action 必须把原 pending 的 action_id 传给 execute_action 复用,
否则审批会另起新 id → 原 pending 记录成孤儿(审批台永远显示"待审批")、且按原 id
回滚会找不到"已执行"记录而失败。见 dm/ontology/actions.py。
"""

import pytest

pytestmark = pytest.mark.stack  # 需要可达的 StarRocks/Postgres 栈;不可达自动跳过
from dm.ontology import actions as A
from dm.security import User


def test_approve_reuses_original_action_id(monkeypatch):
    """审批时应复用原 action_id(修复前传下去的是 None → execute_action 会另生成新 id)。"""
    pending = {
        "action_id": "ACT-REGRESSION-1", "status": "pending",
        "action": "adjust_safety_stock",
        "params": {"material_id": "M0001", "new_value": 30},
    }
    monkeypatch.setattr(A, "read_log",
                        lambda name: [pending] if name == "action_log" else [])

    captured = {}

    def fake_execute(action, params, user=None, approve=False, action_id=None):
        captured["action_id"] = action_id
        captured["approve"] = approve
        return {"ok": True, "action_id": action_id}

    monkeypatch.setattr(A, "execute_action", fake_execute)

    A.approve_action("ACT-REGRESSION-1", user=User("审批人", "管理层"))

    assert captured["approve"] is True
    assert captured["action_id"] == "ACT-REGRESSION-1", (
        "审批必须复用原 action_id,否则 pending 成孤儿、按原 id 回滚失败")


def test_execute_action_accepts_action_id_param():
    """execute_action 需暴露可选 action_id 形参(审批复用的契约)。"""
    import inspect
    assert "action_id" in inspect.signature(A.execute_action).parameters