Ctrl K
ComunidadGuías…

tests/test_actions_tool_results.py

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

Archivo original ↗Preguntar a KiBot
from unittest.mock import patch

from dm.tools.actions_tool import execute_action
from dm.tools.principal import Principal


def test_malformed_action_results_fail_closed_and_are_audited():
    principal = Principal(user="alice", role="仓管")
    invalid = (None, [], "ok", {}, {"ok": 1}, {"ok": True, "target": 7}, {"ok": False, "error": 7})
    for result in invalid:
        with patch("dm.ontology.actions.execute_action", return_value=result), patch(
            "dm.tools.actions_tool.audit_event"
        ) as audit:
            response = execute_action(principal, "adjust_safety_stock", material_id="M1", new_value=5)
        assert response == "ERROR: Action 执行失败"
        assert audit.call_count == 1
        assert audit.call_args.kwargs["decision"] == "error"


def test_valid_failed_action_result_uses_deny_audit_decision():
    principal = Principal(user="alice", role="仓管")
    with patch(
        "dm.ontology.actions.execute_action",
        return_value={"ok": False, "target": "material", "error": "approval required"},
    ), patch("dm.tools.actions_tool.audit_event") as audit:
        response = execute_action(principal, "adjust_safety_stock", material_id="M1", new_value=5)
    assert '"ok": false' in response
    assert audit.call_args.kwargs["decision"] == "deny"


def test_action_result_rejects_nonstandard_json_numbers():
    principal = Principal(user="alice", role="仓管")
    result = {"ok": True, "target": "material", "score": float("nan")}
    with patch("dm.ontology.actions.execute_action", return_value=result), patch(
        "dm.tools.actions_tool.audit_event"
    ) as audit:
        response = execute_action(principal, "adjust_safety_stock", material_id="M1", new_value=5)

    assert response == "ERROR: Action 执行失败"
    assert "NaN" not in response
    assert audit.call_count == 1
    assert audit.call_args.kwargs["decision"] == "error"