test(v1.4.0-p2): add failing tests for milestones and columns

RED phase: 5 tests in test_collector.py (collect_milestones),
10 tests in test_display.py (render_milestones, parse_columns),
2 tests in test_exporter.py (milestones JSON), 7 tests in
test_cli.py (--milestones, --columns).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
sylvain
2026-03-13 03:46:09 +01:00
parent fdd806abcd
commit ebf72c9a56
4 changed files with 405 additions and 1 deletions

View File

@@ -2,7 +2,10 @@
from unittest.mock import MagicMock
from gitea_dashboard.collector import RepoData, collect_all
from gitea_dashboard.collector import (
RepoData,
collect_all,
)
def _make_repo(
@@ -311,3 +314,158 @@ class TestCollectAllFiltering:
result_empty = collect_all(client, include=[])
assert [r.name for r in result_empty] == [r.name for r in result_none]
class TestCollectMilestones:
"""Test collect_milestones function."""
def _setup_client(self, repo_names, milestones_by_repo=None):
"""Create a mock client with repos and milestones."""
client = MagicMock()
client.get_repos.return_value = [
_make_repo(name=n, full_name=f"admin/{n}") for n in repo_names
]
if milestones_by_repo is None:
milestones_by_repo = {}
def get_milestones_side_effect(owner, repo, state="all"):
return milestones_by_repo.get(repo, [])
client.get_milestones.side_effect = get_milestones_side_effect
return client
def test_collect_milestones_basic(self):
"""2 repos with milestones returns flat list of MilestoneData."""
from gitea_dashboard.collector import MilestoneData, collect_milestones
client = self._setup_client(
["repo-a", "repo-b"],
{
"repo-a": [
{
"title": "v1.0",
"open_issues": 2,
"closed_issues": 3,
"due_on": None,
"state": "open",
},
],
"repo-b": [
{
"title": "v2.0",
"open_issues": 0,
"closed_issues": 5,
"due_on": "2026-04-01T00:00:00Z",
"state": "closed",
},
],
},
)
result = collect_milestones(client)
assert len(result) == 2
assert all(isinstance(m, MilestoneData) for m in result)
assert result[0].repo_name == "repo-a"
assert result[0].title == "v1.0"
assert result[1].repo_name == "repo-b"
def test_collect_milestones_empty_repo(self):
"""Repo without milestones produces no entries."""
from gitea_dashboard.collector import collect_milestones
client = self._setup_client(["empty-repo"], {"empty-repo": []})
result = collect_milestones(client)
assert result == []
def test_collect_milestones_progress_calculation(self):
"""3 open + 7 closed = progress_pct 70."""
from gitea_dashboard.collector import collect_milestones
client = self._setup_client(
["repo"],
{
"repo": [
{
"title": "v1.0",
"open_issues": 3,
"closed_issues": 7,
"due_on": None,
"state": "open",
},
],
},
)
result = collect_milestones(client)
assert result[0].progress_pct == 70
def test_collect_milestones_with_include_filter(self):
"""Include filter is respected."""
from gitea_dashboard.collector import collect_milestones
client = self._setup_client(
["gitea-dashboard", "infra"],
{
"gitea-dashboard": [
{
"title": "v1.0",
"open_issues": 1,
"closed_issues": 1,
"due_on": None,
"state": "open",
},
],
"infra": [
{
"title": "v2.0",
"open_issues": 0,
"closed_issues": 5,
"due_on": None,
"state": "closed",
},
],
},
)
result = collect_milestones(client, include=["dashboard"])
assert len(result) == 1
assert result[0].repo_name == "gitea-dashboard"
def test_collect_milestones_with_exclude_filter(self):
"""Exclude filter is respected."""
from gitea_dashboard.collector import collect_milestones
client = self._setup_client(
["gitea-dashboard", "old-fork"],
{
"gitea-dashboard": [
{
"title": "v1.0",
"open_issues": 1,
"closed_issues": 1,
"due_on": None,
"state": "open",
},
],
"old-fork": [
{
"title": "v2.0",
"open_issues": 0,
"closed_issues": 5,
"due_on": None,
"state": "closed",
},
],
},
)
result = collect_milestones(client, exclude=["fork"])
assert len(result) == 1
assert result[0].repo_name == "gitea-dashboard"