fix: tolerate damaged contribution files

This commit is contained in:
Marcel Peterkau
2026-06-21 17:50:56 +02:00
parent 4bc1a8a200
commit 55bc3b666e
10 changed files with 87 additions and 4 deletions
+13
View File
@@ -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()
+20
View File
@@ -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"