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

@@ -401,3 +401,130 @@ class TestSortRepos:
]
result = sort_repos(repos, "activity")
assert [r.name for r in result] == ["recent", "old-commit", "inactive"]
class TestRenderMilestones:
"""Test the dedicated milestones table rendering."""
def test_render_milestones_basic(self):
"""Milestones table displays expected columns."""
from gitea_dashboard.collector import MilestoneData
from gitea_dashboard.display import render_milestones
console, buf = _make_console()
milestones = [
MilestoneData(
repo_name="my-repo",
title="v1.0",
open_issues=2,
closed_issues=8,
progress_pct=80,
due_on="2026-04-01T00:00:00Z",
state="open",
),
]
render_milestones(milestones, console=console)
output = buf.getvalue()
assert "my-repo" in output
assert "v1.0" in output
assert "80" in output
def test_render_milestones_empty(self):
"""Empty list shows informative message."""
from gitea_dashboard.display import render_milestones
console, buf = _make_console()
render_milestones([], console=console)
output = buf.getvalue()
assert "Aucune milestone" in output
def test_render_milestones_progress_colors(self):
"""Progress coloring: green > 80%, yellow 50-80%, red < 50%."""
from gitea_dashboard.collector import MilestoneData
from gitea_dashboard.display import render_milestones
console, buf = _make_console()
milestones = [
MilestoneData("repo", "high", 1, 9, 90, None, "open"),
MilestoneData("repo", "mid", 3, 3, 50, None, "open"),
MilestoneData("repo", "low", 8, 2, 20, None, "open"),
]
render_milestones(milestones, console=console)
output = buf.getvalue()
# All three should appear without crash
assert "high" in output
assert "mid" in output
assert "low" in output
class TestParseColumns:
"""Test parse_columns function."""
def test_parse_columns_all_default(self):
"""None returns all columns."""
from gitea_dashboard.display import AVAILABLE_COLUMNS, parse_columns
result = parse_columns(None)
assert result == list(AVAILABLE_COLUMNS.keys())
def test_parse_columns_inclusion(self):
"""'name,issues' returns only those columns."""
from gitea_dashboard.display import parse_columns
result = parse_columns("name,issues")
assert result == ["name", "issues"]
def test_parse_columns_exclusion(self):
"""'-description,-commit' returns all except those."""
from gitea_dashboard.display import AVAILABLE_COLUMNS, parse_columns
result = parse_columns("-description,-commit")
assert "description" not in result
assert "commit" not in result
assert len(result) == len(AVAILABLE_COLUMNS) - 2
def test_parse_columns_unknown_raises(self):
"""Unknown column raises ValueError."""
from gitea_dashboard.display import parse_columns
with pytest.raises(ValueError, match="unknown"):
parse_columns("unknown")
def test_parse_columns_help(self):
"""'help' returns sentinel list."""
from gitea_dashboard.display import parse_columns
result = parse_columns("help")
assert result == ["__help__"]
def test_parse_columns_no_desc_compat(self):
"""no_desc=True excludes description column."""
from gitea_dashboard.display import parse_columns
result = parse_columns(None, no_desc=True)
assert "description" not in result
def test_render_dashboard_with_columns(self):
"""Only specified columns appear in the output."""
from gitea_dashboard.display import render_dashboard
console, buf = _make_console()
repos = [_make_repo(name="test", open_issues=5)]
render_dashboard(repos, console=console, columns=["name", "issues"])
output = buf.getvalue()
assert "test" in output
assert "Description" not in output
assert "Release" not in output