CI / test (push) Successful in 2m22s
- Clients : create_milestone / update_milestone (cache invalidé) ; GitHub hérite des mêmes endpoints. - API Kanbante : création, modification (titre/échéance, échéance vidée = retirée), fermeture ; CSRF, validation de date avant toute écriture, erreurs forge en 502. - Page Projet : formulaire 'Nouveau jalon' + édition/ fermeture par jalon (project.js versionné). - Échéance à midi UTC : à minuit, le fuseau de l'instance Gitea faisait reculer la date affichée d'un jour (réel). - 291 tests verts (5 nouveaux, palier 24) ; cycle réel complet sur Projets/kanbante (jalons smoke #37/#38 créés, dates vérifiées, fermés).
78 lines
2.6 KiB
Python
78 lines
2.6 KiB
Python
"""Palier 24 (0.35.0, issue #26): jalons en écriture —
|
|
créer, modifier (titre/échéance), fermer, depuis Kanbante."""
|
|
|
|
from tests.conftest import csrf_from
|
|
|
|
|
|
def test_milestone_create_via_api(client, fake_gitea):
|
|
token = csrf_from(client)
|
|
r = client.post(
|
|
"/api/repos/Projets/demo/milestones",
|
|
data={
|
|
"title": "Version 2.0",
|
|
"description": "Le gros morceau",
|
|
"due_on": "2027-01-31",
|
|
"csrf_token": token,
|
|
},
|
|
)
|
|
assert r.status_code == 201
|
|
payload = r.json()
|
|
assert payload["ok"] is True
|
|
assert payload["milestone"]["title"] == "Version 2.0"
|
|
assert payload["milestone"]["due_on"] == "2027-01-31T12:00:00Z"
|
|
titles = [
|
|
m["title"] for m in fake_gitea._milestones["Projets/demo"]
|
|
]
|
|
assert "Version 2.0" in titles
|
|
|
|
|
|
def test_milestone_create_rejects_bad_date(client, fake_gitea):
|
|
token = csrf_from(client)
|
|
avant = len(fake_gitea._milestones["Projets/demo"])
|
|
r = client.post(
|
|
"/api/repos/Projets/demo/milestones",
|
|
data={
|
|
"title": "Jalon invalide",
|
|
"due_on": "31/01/2027",
|
|
"csrf_token": token,
|
|
},
|
|
)
|
|
assert r.status_code == 400
|
|
# Rien d'écrit côté forge.
|
|
assert len(fake_gitea._milestones["Projets/demo"]) == avant
|
|
|
|
|
|
def test_milestone_update_title_and_clear_due(client, fake_gitea):
|
|
token = csrf_from(client)
|
|
r = client.post(
|
|
"/api/repos/Projets/demo/milestones/1/update",
|
|
data={"title": "Sprint 1 — prolongé", "due_on": "", "csrf_token": token},
|
|
)
|
|
assert r.status_code == 200
|
|
sprint = fake_gitea._milestones["Projets/demo"][0]
|
|
assert sprint["title"] == "Sprint 1 — prolongé"
|
|
assert sprint["due_on"] is None # échéance retirée
|
|
|
|
|
|
def test_milestone_close(client, fake_gitea):
|
|
token = csrf_from(client)
|
|
r = client.post(
|
|
"/api/repos/Projets/demo/milestones/1/close",
|
|
data={"csrf_token": token},
|
|
)
|
|
assert r.status_code == 200
|
|
assert fake_gitea._milestones["Projets/demo"][0]["state"] == "closed"
|
|
# La page Projet ne liste plus le jalon fermé parmi les ouverts.
|
|
page = client.get("/project/Projets/demo")
|
|
assert "Version" in page.text # la page répond toujours
|
|
assert 'data-action="/api/repos/Projets/demo/milestones"' in page.text
|
|
|
|
|
|
def test_project_page_has_milestone_management(client):
|
|
page = client.get("/project/Projets/demo")
|
|
assert page.status_code == 200
|
|
assert "Nouveau jalon" in page.text
|
|
assert "Modifier / fermer" in page.text
|
|
assert 'name="due_on"' in page.text
|
|
assert "/static/js/project.js?v=" in page.text
|