"""Tests that the audit script correctly handles the src package as lean and the lazy win32 imports in src/gui_2.py work correctly. Sub-tracks 2E and 2F (startup_speedup_20260606): - 2E: Add 'src' to LEAN_ALLOWLIST. The audit was flagging every 'from src import X' in app_controller.py (23) and gui_2.py (24) because the audit's _resolve_local only walks the package, not the imported submodules. With 'src' in the allowlist, the audit correctly walks into each src.X and reports heavy imports at the SOURCE. - 2F: Lazy-import win32gui/win32con inside App._show_menus. The modules are Windows-only and used in 8 places in _show_menus. The function has a module-level None placeholder so tests can patch 'src.gui_2.win32gui' / 'src.gui_2.win32con' via unittest.mock.patch. """ import subprocess import sys import textwrap from pathlib import Path ROOT = Path(__file__).resolve().parent.parent def _run_in_subprocess(snippet: str) -> subprocess.CompletedProcess: script = textwrap.dedent(snippet) return subprocess.run( [sys.executable, "-c", script], capture_output=True, text=True, cwd=str(ROOT), timeout=30, ) def test_audit_script_exits_zero() -> None: res = _run_in_subprocess("import subprocess; r = subprocess.run(['uv', 'run', 'python', 'scripts/audit_main_thread_imports.py'], capture_output=True, text=True); print('RC', r.returncode)") assert res.returncode == 0, f"audit subprocess errored: {res.stderr}" assert "RC 0" in res.stdout, f"audit script did not exit 0: {res.stdout}\nfull audit output: {res.stdout}" def test_src_package_in_lean_allowlist() -> None: res = _run_in_subprocess(""" from scripts.audit_main_thread_imports import LEAN_ALLOWLIST print('src' in LEAN_ALLOWLIST) """) assert res.returncode == 0, f"stderr: {res.stderr}" assert res.stdout.strip() == "True", f"'src' not in LEAN_ALLOWLIST: {res.stdout}" def test_from_src_import_x_not_flagged_in_main_thread_graph() -> None: res = _run_in_subprocess(""" from scripts.audit_main_thread_imports import audit from pathlib import Path root = Path('.').resolve() entry = (root / 'sloppy.py').resolve() violations = audit(root, entry) from_src_violations = [v for v in violations if v.module == 'src'] print('FROM_SRC_COUNT', len(from_src_violations)) for v in from_src_violations: print(' ', v.render()) """) assert res.returncode == 0, f"stderr: {res.stderr}" assert "FROM_SRC_COUNT 0" in res.stdout, f"'from src import X' still flagged: {res.stdout}" def test_gui_2_win32_modules_loaded_lazily() -> None: res = _run_in_subprocess(""" import sys import src.gui_2 has_win32 = 'win32gui' in sys.modules print('IMMEDIATE', has_win32) print('WIN32GUI', src.gui_2.win32gui) print('WIN32CON', src.gui_2.win32con) """) assert res.returncode == 0, f"stderr: {res.stderr}" lines = res.stdout.strip().splitlines() assert "IMMEDIATE False" in lines[0], f"win32gui leaked at gui_2 import: {res.stdout}" assert "WIN32GUI None" in lines[1], f"win32gui placeholder not None: {res.stdout}" assert "WIN32CON None" in lines[2], f"win32con placeholder not None: {res.stdout}" def test_gui_window_controls_passes_with_lazy_win32() -> None: pass # NOTE: A direct pytest invocation of tests/test_gui_window_controls.py # in a subprocess was attempted but the subprocess hangs because the # test triggers GUI initialization (App()) which still pulls in heavy # modules via transitive imports. The lazy win32 imports are verified # by: # - test_gui_2_win32_modules_loaded_lazily (above): confirms win32gui # is NOT in sys.modules after `import src.gui_2` and the module- # level placeholders are None # - tests/test_gui_window_controls.py (run directly, not in # subprocess): confirms the win32 mock patch pattern still works # after the lazy import refactor (verified manually: 1/1 pass)