diff --git a/tests/test_palier14.py b/tests/test_palier14.py new file mode 100644 index 0000000..fc67d11 --- /dev/null +++ b/tests/test_palier14.py @@ -0,0 +1,74 @@ +"""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