82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
"""Palier 7 (0.10.0): mode Triage (issue #11)."""
|
|
|
|
import json
|
|
import re
|
|
|
|
from tests.conftest import csrf_from
|
|
|
|
|
|
def _queue_from(page_html: str) -> list:
|
|
m = re.search(
|
|
r'<script id="triage-queue" type="application/json">(.*?)</script>',
|
|
page_html, re.S,
|
|
)
|
|
assert m, "file de triage absente de la page"
|
|
return json.loads(m.group(1))
|
|
|
|
|
|
def test_triage_picker_lists_project_with_backlog(client, fake_gitea):
|
|
r = client.get("/triage")
|
|
assert r.status_code == 200
|
|
assert "Projets/demo" in r.text
|
|
assert "au backlog" in r.text
|
|
|
|
|
|
def test_triage_session_queue_is_backlog_only(client, fake_gitea):
|
|
r = client.get("/triage/Projets/demo")
|
|
assert r.status_code == 200
|
|
queue = _queue_from(r.text)
|
|
numbers = [c["number"] for c in queue]
|
|
# Open issues of the fake repo: #1 and #5, both unplaced -> backlog.
|
|
# #3 is closed (goes to done), #2 is a PR (excluded).
|
|
assert numbers == [1, 5]
|
|
card = queue[0]
|
|
assert card["title"] == "Tâche un"
|
|
assert "excerpt" in card and "html_url" in card
|
|
|
|
|
|
def test_triage_session_empty_when_nothing_to_triage(client, fake_gitea):
|
|
for issue in fake_gitea.issues["Projets/demo"]:
|
|
if issue["number"] in (1, 5):
|
|
issue["state"] = "closed"
|
|
r = client.get("/triage/Projets/demo")
|
|
assert r.status_code == 200
|
|
assert _queue_from(r.text) == []
|
|
|
|
|
|
def test_assign_self_adds_token_user(client, fake_gitea):
|
|
token = csrf_from(client)
|
|
# Issue #5 is unassigned in the fake; #1 already belongs to bruno.
|
|
r = client.post(
|
|
"/api/issues/Projets/demo/5/assign-self",
|
|
data={"csrf_token": token},
|
|
)
|
|
assert r.status_code == 200
|
|
assert r.json()["ok"] is True
|
|
assert r.json()["assignees"] == ["bruno"]
|
|
assert fake_gitea.assignee_changes == [("Projets", "demo", 5, ["bruno"])]
|
|
# Idempotent: assigning #1 (already bruno's) writes nothing.
|
|
r = client.post(
|
|
"/api/issues/Projets/demo/1/assign-self",
|
|
data={"csrf_token": token},
|
|
)
|
|
assert r.status_code == 200
|
|
assert r.json()["assignees"] == ["bruno"]
|
|
assert len(fake_gitea.assignee_changes) == 1
|
|
|
|
|
|
def test_assign_self_requires_csrf(client, fake_gitea):
|
|
r = client.post("/api/issues/Projets/demo/1/assign-self", data={})
|
|
assert r.status_code == 403
|
|
assert fake_gitea.assignee_changes == []
|
|
|
|
|
|
def test_excerpt_strips_markdown():
|
|
from app.main import _excerpt
|
|
|
|
text = _excerpt("# Titre\n\nDu **gras** et un [lien](http://x) ici.", 280)
|
|
assert "Titre" in text and "gras" in text and "lien" in text
|
|
assert "#" not in text and "**" not in text
|
|
assert _excerpt(None) == ""
|
|
assert len(_excerpt("mot " * 200, 50)) <= 51
|