diff --git a/tests/test_git_vitality.py b/tests/test_git_vitality.py index dad04c7..8fa457a 100644 --- a/tests/test_git_vitality.py +++ b/tests/test_git_vitality.py @@ -1,7 +1,7 @@ import pytest +from datetime import datetime, timezone from unittest.mock import MagicMock, patch -from pathlib import Path -from arbiter.git_vitality import score_git_vitality, GitVitalityReport +from arbiter.git_vitality import score_git_vitality from arbiter.git_historian import CommitInfo @pytest.fixture @@ -33,15 +33,22 @@ def test_single_committer_scores_low_bus_factor(tmp_path, mock_commits): def test_recent_commit_scores_max_recency(tmp_path, mock_commits): (tmp_path / ".git").mkdir() - # Today is 2026-04-19 (from session context) - # mock_commits[0] is from 2026-04-10 (9 days ago) - with patch("arbiter.git_vitality.walk_commits", return_value=mock_commits): - with patch("subprocess.run") as mock_run: - mock_run.return_value.returncode = 0 - mock_run.return_value.stdout = "" - report = score_git_vitality(tmp_path) - assert report.days_since_commit <= 30 - # 25 points for recency + # Freeze "now" at 2026-04-19 so days_since stays deterministic. + # datetime.datetime is a C extension, so we patch the module binding + # rather than the classmethod (setattr fails on C types). + frozen_now = datetime(2026, 4, 19, tzinfo=timezone.utc) + mock_dt = MagicMock() + mock_dt.now = lambda *_args, **_kwargs: frozen_now + mock_dt.fromisoformat = lambda ts: datetime.fromisoformat(ts) + mock_dt.timezone = timezone + with patch("arbiter.git_vitality.datetime", mock_dt): + with patch("arbiter.git_vitality.walk_commits", return_value=mock_commits): + with patch("subprocess.run") as mock_run: + mock_run.return_value.returncode = 0 + mock_run.return_value.stdout = "" + report = score_git_vitality(tmp_path) + assert report.days_since_commit == 8 # Apr 10 10:00 -> Apr 19 00:00 + assert report.score >= 25 # max recency points def test_semver_tags_detected(tmp_path, mock_commits): (tmp_path / ".git").mkdir()