fix: M2 on_failure assignee 从 tasks 表读取 + infrastructure 防递归(司马懿 Review #65)
M2: on_failure 中 assignee = meta.get('from', '') 读到 'system' 而非实际 Agent
→ 改为 SELECT must_haves, assignee FROM tasks 直接读 tasks.assignee 字段
附带:infrastructure failure 改为直接 DB INSERT,不走 _send_toolchain_task 防递归
This commit is contained in:
@@ -398,12 +398,14 @@ class TestSendToolchainTask:
|
||||
|
||||
class TestOnFailureRouting:
|
||||
def test_business_failure_creates_gitea_comment(self, handler, tmp_db):
|
||||
"""Business failure → Gitea PR comment"""
|
||||
"""Business failure → Gitea PR comment @task assignee (not must_hives field)"""
|
||||
# S4: must_hives does NOT contain assignee — production data doesn't have it
|
||||
must_haves = json.dumps({
|
||||
"action_type": "review_result",
|
||||
"context": {"repo": "sanguo/test", "pr_number": 42},
|
||||
"assignee": "zhangfei-dev",
|
||||
"from": "system",
|
||||
})
|
||||
# assignee is set on the tasks table row (as production code writes it)
|
||||
_insert_task(tmp_db, "t-fail", must_haves)
|
||||
|
||||
with patch.object(handler, "_create_gitea_comment") as mock_comment:
|
||||
@@ -414,9 +416,12 @@ class TestOnFailureRouting:
|
||||
call_args = mock_comment.call_args
|
||||
assert call_args[0][0] == "sanguo/test"
|
||||
assert call_args[0][1] == 42
|
||||
# M2: comment body should @ the task's assignee from tasks table
|
||||
comment_body = call_args[0][2]
|
||||
assert "@zhangfei-dev" in comment_body
|
||||
|
||||
def test_infrastructure_failure_creates_task(self, handler, tmp_db):
|
||||
"""Infrastructure failure → _send_toolchain_task for jiangwei-infra"""
|
||||
"""Infrastructure failure → direct DB task for jiangwei-infra (no reverse dep)"""
|
||||
must_haves = json.dumps({
|
||||
"action_type": "review_result",
|
||||
"context": {"repo": "sanguo/test", "pr_number": 42},
|
||||
@@ -427,15 +432,22 @@ class TestOnFailureRouting:
|
||||
mock_comment.return_value = False # Gitea API down
|
||||
with patch.object(handler, "_create_gitea_issue") as mock_issue:
|
||||
mock_issue.return_value = False # Gitea API still down
|
||||
with patch("src.api.toolchain_routes._send_toolchain_task") as mock_send:
|
||||
mock_send.return_value = "tc-infra"
|
||||
verify = VerifyResult(False, "no_action", "no action_report")
|
||||
handler.on_failure("t-infra", "zhangfei-dev", tmp_db, verify)
|
||||
# Should eventually try to create infrastructure_failure task
|
||||
mock_send.assert_called()
|
||||
call_kwargs = mock_send.call_args
|
||||
assert call_kwargs[1]["action_type"] == "infrastructure_failure"
|
||||
assert call_kwargs[1]["to_agent"] == "jiangwei-infra"
|
||||
verify = VerifyResult(False, "no_action", "no action_report")
|
||||
handler.on_failure("t-infra", "zhangfei-dev", tmp_db, verify)
|
||||
|
||||
# S3: should directly INSERT into DB, not call _send_toolchain_task
|
||||
# Verify a new task was created in DB for jiangwei-infra
|
||||
conn = get_connection(tmp_db)
|
||||
rows = conn.execute(
|
||||
"SELECT * FROM tasks WHERE assignee=?",
|
||||
("jiangwei-infra",)
|
||||
).fetchall()
|
||||
conn.close()
|
||||
assert len(rows) >= 1, "No infrastructure_failure task created"
|
||||
infra_task = rows[0]
|
||||
assert infra_task["task_type"] == "toolchain"
|
||||
meta = json.loads(infra_task["must_haves"])
|
||||
assert meta["action_type"] == "infrastructure_failure"
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user