From 0883191f57aaa68308f2b0368a528236e616e664 Mon Sep 17 00:00:00 2001 From: Spark Date: Sun, 11 Oct 2026 22:52:22 -0400 Subject: [PATCH] =?UTF-8?q?test(0.17.0):=20jalon,=20sant=C3=A9,=20=C3=A9to?= =?UTF-8?q?iles,=20page=20projet=20=E2=80=94=207=20tests,=20178=20au=20tot?= =?UTF-8?q?al?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_palier13.py | 87 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 tests/test_palier13.py diff --git a/tests/test_palier13.py b/tests/test_palier13.py new file mode 100644 index 0000000..85fe784 --- /dev/null +++ b/tests/test_palier13.py @@ -0,0 +1,87 @@ +"""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