import hashlib from tht.jobs.dwh_pipeline import DwhPreprocessPipeline FP = "sha256:" + hashlib.sha256(b"test").hexdigest() def test_lsh_failure_resumes_exact_run_without_repeating_introspection(tmp_path): calls = [] def introspect(): calls.append("introspect") def fail_lsh(): calls.append("lsh-failed") raise RuntimeError("database detail that must not leak") failed = DwhPreprocessPipeline( workspace_id="demo", workspace_root=tmp_path, config_fingerprint=FP, input_fingerprint=FP, introspect=introspect, build_lsh=fail_lsh, ).run(("introspect", "lsh")) assert failed.status == "failed" resumed = DwhPreprocessPipeline( workspace_id="demo", workspace_root=tmp_path, config_fingerprint=FP, input_fingerprint=FP, introspect=introspect, build_lsh=lambda: calls.append("lsh-recovered"), ).run(("introspect", "lsh"), resume_run_id=failed.run_id) assert resumed.status == "succeeded" assert resumed.resumed_from == failed.run_id assert calls == ["introspect", "lsh-failed", "lsh-recovered"] def test_resume_rejects_a_different_stage_selection(tmp_path): failed = DwhPreprocessPipeline( workspace_id="demo", workspace_root=tmp_path, config_fingerprint=FP, input_fingerprint=FP, introspect=lambda: None, build_lsh=lambda: (_ for _ in ()).throw(RuntimeError()), ).run(("introspect", "lsh")) pipeline = DwhPreprocessPipeline( workspace_id="demo", workspace_root=tmp_path, config_fingerprint=FP, input_fingerprint=FP, introspect=lambda: None, build_lsh=lambda: None, ) try: pipeline.run(("lsh",), resume_run_id=failed.run_id) except Exception as error: assert "incompatible" in str(error) else: raise AssertionError("resume with different stages must fail")