"""Phase 13 invariant tests (GREEN). 9 migration-target sites addressed: - Site 1 (BC L33): narrowed 'except Exception' to (ImportError, AttributeError) - Site 2 (BC L224): migrated _chunk_code to Result (helper _chunk_code_result) - Site 3 (BC L247): extracted _get_file_mtime_result helper - Site 4 (BC L261): extracted _read_file_content_result helper - Site 5 (BC L290): extracted _parse_search_response_result helper (module-level) - Site 6 (SS L255): extracted _check_existing_index_result helper - Sites 7 (RETHROW L29/L32/L33/L36): follow Pattern 1/3; documented as known audit limitation """ import sys sys.path.insert(0, ".") def test_phase13_rag_engine_migration_target_zero(): """After Phase 13: rag_engine migration-target count is 0 (was 9).""" import json import subprocess r = subprocess.run( ["uv", "run", "python", "scripts/audit_exception_handling.py", "--include-baseline", "--json"], capture_output=True, text=True ) data = json.loads(r.stdout) files = {f["filename"]: f for f in data["files"]} rag = files["src\\rag_engine.py"] migration = sum(1 for x in rag["findings"] if x["category"] in ( "INTERNAL_BROAD_CATCH", "INTERNAL_SILENT_SWALLOW", "INTERNAL_OPTIONAL_RETURN", "UNCLEAR" )) assert migration == 0, f"expected rag_engine migration-target=0, got {migration}" def test_phase13_rag_engine_rethrow_strict_acceptable(): """rag_engine RETHROW sites follow Pattern 1/3 of styleguide (strict mode accepts).""" import json import subprocess r = subprocess.run( ["uv", "run", "python", "scripts/audit_exception_handling.py", "--strict"], capture_output=True, text=True ) # The strict mode only fails on violations (BC/SS/OO/UNCLEAR), not RETHROW. # If rag_engine is contributing violations, fail. assert "src\\\\rag_engine.py" not in r.stdout or "VIOLATION" not in r.stdout.split("src\\\\rag_engine.py")[1].split("\n\n")[0] if "src\\\\rag_engine.py" in r.stdout else True def test_phase13_all_helpers_exist(): """All 5 new _result helpers must exist.""" import src.rag_engine # Class methods (4): _chunk_code_result, _get_file_mtime_result, # _check_existing_index_result, _read_file_content_result for name in ("_chunk_code_result", "_get_file_mtime_result", "_check_existing_index_result", "_read_file_content_result"): assert hasattr(src.rag_engine.RAGEngine, name), f"{name} method missing" # Module-level (1): _parse_search_response_result assert hasattr(src.rag_engine, "_parse_search_response_result"), \ "_parse_search_response_result module-level helper missing" def test_phase13_legacy_functions_preserved(): """All legacy functions must still exist + be callable (some OBLITERATED by cruft-removal).""" import src.rag_engine # Class methods (some OBLITERATED) preserved = ("_search_mcp", "search", "delete_documents", "get_all_indexed_paths", "delete_documents_by_path", "index_file") obliterated = ("_chunk_code",) for name in preserved: assert hasattr(src.rag_engine.RAGEngine, name), f"{name} method missing" for name in obliterated: assert not hasattr(src.rag_engine.RAGEngine, name), ( f"{name} wrapper must be OBLITERATED (cruft-removal Phase 5); " f"callers must use {name}_result directly" ) # Module-level for name in ("_get_sentence_transformers", "_get_google_genai", "_get_chromadb"): assert hasattr(src.rag_engine, name), f"{name} module-level function missing"