67 lines
1.9 KiB
Python
67 lines
1.9 KiB
Python
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")
|