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:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user