"""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