"""Palier 13 (0.17.0): vague 2 — jalon sur la carte (#17), pastille de santé (#18), épinglés via étoiles Gitea (#20), page Projet (#25).""" from tests.conftest import csrf_from def test_dashboard_shows_next_milestone(client, fake_gitea): page = client.get("/") assert page.status_code == 200 # Faux : Sprint 1, échéance 2026-10-20, 1 fermée / 2 au total. assert "🎯 Sprint 1" in page.text assert "1/2 terminées" in page.text assert "échéance" in page.text def test_dashboard_health_dot(client, fake_gitea): page = client.get("/") assert 'class="health-dot ' in page.text assert 'href="/health/Projets/demo"' in page.text def test_no_starred_section_by_default(client, fake_gitea): page = client.get("/") assert 'id="pinned-section" hidden' in page.text assert 'data-starred="0"' in page.text def test_starred_repo_is_pinned(client, fake_gitea): fake_gitea.starred.add("Projets/demo") page = client.get("/") assert 'id="pinned-section" hidden' not in page.text assert 'data-starred="1"' in page.text # La carte épinglée sort de la grille de son onglet d'origine : # une seule carte (div) pour demo — le bouton étoile porte aussi # un data-full, on compte donc le motif de la carte elle-même. assert page.text.count('data-full="Projets/demo" data-home') == 1 def test_star_toggle_endpoint(client, fake_gitea): csrf = csrf_from(client) denied = client.post( "/api/projects/Projets/demo/star", data={"starred": "1"} ) assert denied.status_code == 403 resp = client.post( "/api/projects/Projets/demo/star", data={"starred": "1", "csrf_token": csrf}, ) assert resp.status_code == 200 assert resp.json() == {"ok": True, "starred": True} assert "Projets/demo" in fake_gitea.starred resp = client.post( "/api/projects/Projets/demo/star", data={"starred": "0", "csrf_token": csrf}, ) assert resp.json() == {"ok": True, "starred": False} assert "Projets/demo" not in fake_gitea.starred def test_card_title_links_to_project_page(client, fake_gitea): page = client.get("/") assert 'href="/project/Projets/demo"' in page.text assert 'href="/board/Projets/demo"' in page.text # accès board conservé def test_project_page(client, fake_gitea): from app import models models.log_event("Projets/demo", 1, "created", to_column="backlog") models.log_event( "Projets/demo", 1, "moved", from_column="backlog", to_column="in_progress", ) page = client.get("/project/Projets/demo") assert page.status_code == 200 assert "🎯 Jalons ouverts" in page.text assert "Sprint 1" in page.text assert "🩺 Santé du flux" in page.text assert "🔮 Prévisions" in page.text assert "🕘 Activité récente" in page.text assert "📝 Notes du projet" in page.text assert 'href="/board/Projets/demo"' in page.text assert "/wall?repo=Projets/demo" in page.text # Titre du projet et lien Gitea du faux. assert "demo" in page.text