US02-03: Execute Jobs with Leases, Locks, and Recovery (#56)

This commit was merged in pull request #56.
This commit is contained in:
2026-07-15 23:13:25 +02:00
parent 0ebacfa544
commit d054dcbe61
10 changed files with 543 additions and 2 deletions

View File

@@ -0,0 +1,28 @@
"""Lock acquisition ordering (deadlock prevention)."""
import pytest
from photo_pipeline.jobs import locks
def test_broad_to_narrow_ranks():
assert locks.rank("library") < locks.rank("rename")
assert locks.rank("rename") < locks.rank("album")
assert locks.rank("album") < locks.rank("asset")
def test_acquiring_narrower_while_holding_broader_is_allowed():
locks.validate_acquisition(["library"], "asset") # no raise
locks.validate_acquisition(["library", "album"], "asset")
def test_acquiring_broader_while_holding_narrower_is_rejected():
with pytest.raises(locks.LockOrderError):
locks.validate_acquisition(["asset"], "library")
with pytest.raises(locks.LockOrderError):
locks.validate_acquisition(["album"], "rename")
def test_unknown_lock_is_rejected():
with pytest.raises(locks.LockOrderError):
locks.rank("nonsense")