- Move resolvePythonExecutable, getPluginVersion, classifyError, ACTIONS, etc. to src/testable.js
- main.js now requires from ./src/testable.js instead of inline duplication
- Tests import from ../src/testable.js (no obsidian dependency)
- Remove vitest obsidian mock setup (no longer needed)
- Fixes L3 Plugin Tests that failed because main.js requires 'obsidian'
- Add named exports for testable functions (resolvePythonExecutable, getPluginVersion, etc.)
- Update test imports from ../src/*.js to ../main.js
- Fix repair action test: disabled flag was removed when ACTIONS was inlined
test_ocr_preflight: mock fitz.open (not builtins.open) + set needs_sanitize=True
- Code uses fitz.open(), not builtins.open() — mock was targeting wrong function
- fitz.open() only called when meta.needs_sanitize is true — mock returned {} which skipped it
- These tests were always broken but CI never ran before v2.1
test_e2e_cli: guard against None stdout in doctor_verdict test on Windows CI
L3 runtime.test.mjs: use platform-agnostic path matching
- path.join produces / on Linux but \\\\ on Windows — test used \\\\ only