mirror of
https://git.hiabuto.net/C3MA/CCMA.git
synced 2026-07-01 03:04:52 +02:00
fix: tolerate damaged contribution files
This commit is contained in:
@@ -95,6 +95,19 @@ def test_repository_accepts_local_date_input_and_rejects_invalid_dates(tmp_path)
|
||||
repository.create_member(first_name="Invalid", last_name="Date", birth_date="31.02.2000")
|
||||
|
||||
|
||||
def test_repository_reports_empty_contributions_file(tmp_path) -> None:
|
||||
repository = MemberRepository(tmp_path)
|
||||
repository.initialize()
|
||||
member = repository.create_member(first_name="Empty", last_name="Contributions")
|
||||
path = repository.members_root / member.member_id / "contributions.json"
|
||||
path.write_text("", encoding="utf-8")
|
||||
|
||||
with pytest.raises(RepositoryError, match="contributions.json konnte nicht gelesen"):
|
||||
repository.get_contributions(member.member_id)
|
||||
|
||||
assert any("contributions.json" in error for error in repository.validate())
|
||||
|
||||
|
||||
def test_member_path_rejects_traversal(tmp_path) -> None:
|
||||
repository = MemberRepository(tmp_path)
|
||||
repository.initialize()
|
||||
|
||||
@@ -106,3 +106,23 @@ def test_failed_run_does_not_advance_persisted_run_id(tmp_path) -> None:
|
||||
|
||||
assert (repository.root / "hausmeister.json").read_bytes() == state_before
|
||||
assert not (repository.root / ".hausmeister.lock").exists()
|
||||
|
||||
|
||||
def test_broken_contributions_file_creates_task_without_overwriting_file(tmp_path) -> None:
|
||||
repository = MemberRepository(tmp_path)
|
||||
repository.initialize()
|
||||
member = repository.create_member(first_name="Broken", last_name="Contributions", birth_date="1990-01-01")
|
||||
member.status = "active"
|
||||
member.accepted_at = "2026-01-01"
|
||||
member.membership_started_at = "2026-01-01"
|
||||
repository.save_member(member)
|
||||
path = repository.members_root / member.member_id / "contributions.json"
|
||||
path.write_bytes(b"")
|
||||
|
||||
findings = Housekeeper(repository).run(today=date(2026, 6, 21))
|
||||
|
||||
assert path.read_bytes() == b""
|
||||
assert [finding.code for finding in findings] == ["invalid_contributions_file"]
|
||||
state = json.loads((repository.root / "hausmeister.json").read_text(encoding="utf-8"))
|
||||
task = next(item for item in state["items"] if item["code"] == "invalid_contributions_file")
|
||||
assert task["status"] == "open"
|
||||
|
||||
Reference in New Issue
Block a user