Compare commits

...
Author SHA1 Message Date
praisonai-triage-agent[bot]andMervin Praison 49b964ac6a test: assert failure wiring via AST inside except handlers
Replace the substring-count heuristic in the bot failure-reply wiring
test with AST validation that only counts failure_reply_text(e) calls
inside except handlers, so comments/dead code cannot satisfy the
contract (addresses CodeRabbit review).

Co-authored-by: Mervin Praison <[email protected]>
2026-08-13 16:10:21 +00:00
@@ -1,5 +1,6 @@
"""Regression tests for canonical bot failure rendering."""
import ast
from pathlib import Path
from praisonaiagents.errors import PraisonAIConfigError
@@ -7,6 +8,30 @@ from praisonaiagents.errors import PraisonAIConfigError
from praisonai_bot.bots._failure import failure_reply_text
def _count_failure_replies_in_handlers(source: str) -> int:
"""Count ``failure_reply_text(e)`` calls that live inside ``except`` handlers.
AST-based so that comments, strings, or dead code outside an exception
handler cannot satisfy the wiring contract — only genuine terminal
failure paths count.
"""
count = 0
for handler in ast.walk(ast.parse(source)):
if not isinstance(handler, ast.ExceptHandler):
continue
for node in ast.walk(handler):
if (
isinstance(node, ast.Call)
and isinstance(node.func, ast.Name)
and node.func.id == "failure_reply_text"
and len(node.args) == 1
and isinstance(node.args[0], ast.Name)
and node.args[0].id == (handler.name or "e")
):
count += 1
return count
def test_failure_reply_uses_core_taxonomy_and_hides_raw_exception():
error = PraisonAIConfigError(
"secret-token-should-not-leak",
@@ -31,7 +56,8 @@ def test_terminal_agent_paths_use_the_canonical_renderer():
for filename, minimum in expected_calls.items():
source = (bots_dir / filename).read_text(encoding="utf-8")
assert source.count("failure_reply_text(e)") >= minimum
wired = _count_failure_replies_in_handlers(source)
assert wired >= minimum, f"{filename}: {wired} handler calls < {minimum}"
def test_retry_paths_do_not_interpolate_raw_exception():