import pytest from app.agents.error_handling_agent import ErrorHandlingAgent from app.schemas import CodeChunk, Severity def make_chunk(content: str, file_path: str = "app.py") -> CodeChunk: return CodeChunk( file_path=file_path, language="Python", line_start=1, line_end=max(1, len(content.splitlines())), content=content, ) @pytest.mark.anyio async def test_error_handling_agent_detects_bare_except_and_swallow(): output = await ErrorHandlingAgent().analyze( [ make_chunk( "try:\n" " work()\n" "except:\n" " pass\n" ) ] ) titles = {finding.title for finding in output.findings} assert "Broad exception handler" in titles assert "Exception swallowed without recovery" in titles assert all(finding.category == "error_handling" for finding in output.findings) @pytest.mark.anyio async def test_error_handling_agent_detects_return_none_swallow(): output = await ErrorHandlingAgent().analyze( [ make_chunk( "try:\n" " return load_user()\n" "except ValueError:\n" " return None\n" ) ] ) assert output.findings[0].title == "Exception swallowed without recovery" assert output.findings[0].severity == Severity.high @pytest.mark.anyio async def test_error_handling_agent_does_not_flag_logged_specific_exception(): output = await ErrorHandlingAgent().analyze( [ make_chunk( "try:\n" " return load_user()\n" "except ValueError:\n" " logger.exception('load failed')\n" " raise\n" ) ] ) assert output.findings == [] @pytest.mark.anyio async def test_error_handling_agent_detects_request_without_timeout(): output = await ErrorHandlingAgent().analyze([make_chunk("response = requests.get(url)")]) assert output.findings[0].title == "External HTTP call without timeout" assert output.findings[0].severity == Severity.medium @pytest.mark.anyio async def test_error_handling_agent_ignores_request_with_timeout(): output = await ErrorHandlingAgent().analyze([make_chunk("response = requests.get(url, timeout=10)")]) assert output.findings == []