"""Palier 14 (0.18.0): vague 2 suite — activité 7 jours (#19), tri/regroupement (#21), vue liste dense (#22), actions rapides (#23).""" from datetime import datetime, timedelta, timezone from app import models def _ts(days_ago: int) -> str: dt = datetime.now(timezone.utc) - timedelta(days=days_ago) return dt.strftime("%Y-%m-%d 12:00:00") def test_activity_line_recent_week(client, fake_gitea): for _ in range(2): models.log_event("Projets/demo", 1, "closed", to_column="done", created_at=_ts(1)) models.log_event("Projets/demo", 5, "moved", from_column="backlog", to_column="todo", created_at=_ts(0)) page = client.get("/") assert "2 fermée(s) · 1 déplacement(s) cette semaine" in page.text def test_activity_line_idle_project(client, fake_gitea): models.log_event("Projets/vieux", 9, "moved", from_column="backlog", to_column="todo", created_at=_ts(35)) page = client.get("/") assert "aucune activité kanban depuis 35 j" in page.text def test_dashboard_display_tools_markup(client, fake_gitea): page = client.get("/") assert "dashState" in page.text assert 'id="dash-sort"' in page.text assert 'id="dash-group"' in page.text assert "Grouper par propriétaire" in page.text assert "setView('grid')" in page.text assert "setView('list')" in page.text def test_dense_list_view_tables(client, fake_gitea): page = client.get("/") assert page.text.count('class="proj-table"') == 3 assert 'data-sort="open"' in page.text assert 'data-sort="inflight"' in page.text # La ligne dense de demo : lien page projet + compteurs. assert 'href="/project/Projets/demo"' in page.text def test_dashboard_js_contract(client, fake_gitea): js = client.get("/static/js/dashboard.js") assert js.status_code == 200 assert "kanbante-dash-sort" in js.text assert "kanbante-dash-group" in js.text assert "owner-group" in js.text assert "data-menu-btn" in js.text def test_card_quick_actions_menu(client, fake_gitea): page = client.get("/") assert "data-menu-btn" in page.text # urlencode de Jinja conserve les « / » : le lien est valide tel quel. assert 'href="/capture?repo=Projets/demo"' in page.text assert 'href="/triage/Projets/demo"' in page.text assert 'href="/sprint/Projets/demo"' in page.text assert 'href="/health/Projets/demo"' in page.text def test_capture_prefilled_repo(client, fake_gitea): page = client.get("/capture?repo=Projets/kanbante") assert page.status_code == 200 assert 'value="Projets/kanbante"' in page.text