"""Phase 12 sites 1, 2+3, 5, 6: Pattern 1 (catch + raise from X) fixes. Site 1 (_load_credentials): except FileNotFoundError: raise FileNotFoundError(f"...") Missing `from e`; per styleguide Pattern 1 requires `raise X from e`. Sites 2+3 (_default_send): if not res.ok: if res.errors and res.errors[0].original: raise res.errors[0].original # site 2 raise RuntimeError(res.errors[0].message ...) # site 3 Missing `from None`; exception comes from a Result, not a local except. Site 5 (_send inside _send_gemini_cli): if not send_result.ok: raise cast(Exception, send_result.errors[0].original) Missing `from None`. Site 6 (_dashscope_call): if getattr(resp, "status_code", 200) != 200: raise classify_dashscope_error(...) Missing `from None`. """ import sys sys.path.insert(0, ".") def test_phase12_site1_load_credentials_has_from_e(): import inspect import src.ai_client src_text = inspect.getsource(src.ai_client._load_credentials) assert "raise FileNotFoundError" in src_text # Per Pattern 1: catch + convert + raise must use 'from e' assert "from e" in src_text, \ "_load_credentials raise must use 'from e' (Pattern 1)" def test_phase12_sites23_default_send_has_from_none(): import inspect import src.ai_client # _default_send is a nested function inside run_with_tool_loop; get source from the parent src_text = inspect.getsource(src.ai_client.run_with_tool_loop) # The nested _default_send must have 'from None' on its raises assert "raise res.errors[0].original from None" in src_text, \ "_default_send original-exception raise must use 'from None'" assert 'raise RuntimeError(res.errors[0].message if res.errors else "Unknown OpenAI error") from None' in src_text, \ "_default_send RuntimeError raise must use 'from None'" def test_phase12_site5_send_cli_has_from_none(): import inspect import src.ai_client src_text = inspect.getsource(src.ai_client._send_gemini_cli) assert "from None" in src_text, \ "_send_gemini_cli inner _send raise must use 'from None'" def test_phase12_site6_dashscope_call_has_from_none(): import inspect import src.ai_client src_text = inspect.getsource(src.ai_client._dashscope_call) assert "from None" in src_text, \ "_dashscope_call raise must use 'from None'"