From 6c58212db321452829962b4652a50d60044b7fa1 Mon Sep 17 00:00:00 2001 From: Research Assistant Date: Fri, 5 Jun 2026 11:17:04 +0800 Subject: [PATCH] test: lock OCR phase4 rebuild orchestration contract --- tests/test_ocr_rebuild.py | 19 +++++++++++++++++++ tests/test_ocr_redo.py | 17 +++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 tests/test_ocr_rebuild.py diff --git a/tests/test_ocr_rebuild.py b/tests/test_ocr_rebuild.py new file mode 100644 index 00000000..050158bf --- /dev/null +++ b/tests/test_ocr_rebuild.py @@ -0,0 +1,19 @@ +"""Contract tests for OCR derived-rebuild orchestration (Phase 4).""" + +from __future__ import annotations + + +def test_rebuild_selector_only_targets_derived_stale_papers() -> None: + """select_papers_for_derived_rebuild must only return papers + where derived_stale=True, regardless of raw_upgradable status.""" + # This will fail with ModuleNotFoundError until paperforge/worker/ocr_rebuild.py exists + from paperforge.worker.ocr_rebuild import select_papers_for_derived_rebuild + + papers = [ + {"zotero_key": "A", "derived_stale": True, "raw_upgradable": False}, + {"zotero_key": "B", "derived_stale": False, "raw_upgradable": True}, + ] + + selected = select_papers_for_derived_rebuild(papers) + + assert selected == ["A"] diff --git a/tests/test_ocr_redo.py b/tests/test_ocr_redo.py index 3155fcf5..0b1561f6 100644 --- a/tests/test_ocr_redo.py +++ b/tests/test_ocr_redo.py @@ -203,3 +203,20 @@ def test_ocr_redo_rebuilds_phase3_artifacts(tmp_path) -> None: # Phase 3 artifacts should exist assert (ocr_dir / "render" / "fulltext.md").exists(), "render/fulltext.md missing after redo" assert (ocr_dir / "health" / "ocr_health.json").exists(), "health/ocr_health.json missing after redo" + + +# --------------------------------------------------------------------------- +# Guard: redo must not become derived-rebuild path +# --------------------------------------------------------------------------- + +def test_redo_does_not_call_derived_rebuild() -> None: + """Verify ocr redo does not import or call derived rebuild. + + This import will fail (ModuleNotFoundError) until Task 5 of Phase 4, + which explicitly keeps redo and derived rebuild separate. If someone + wires redo to use derived rebuild, this test should be updated or + removed with explicit justification. + """ + from paperforge.worker.ocr_rebuild import select_papers_for_derived_rebuild + + assert select_papers_for_derived_rebuild is not None