Beim Übernehmen aus AG_QGIS/Projektwissen (main @ a0bb40a) waren Regeln verloren gegangen oder eingeengt worden: - PR-Vorlage: Abschnitt „Änderungen an Syntax und Ablageformat“ (dort „Änderungen an Verträgen“), Checklistenpunkt „keine Debug-print“. - Issue-Vorlage: Frage nach Syntax/Ablageformat, Testpflicht nicht nur für den Konverter. - AGENTS.md: Testpflicht wieder für jede neue Funktionalität; Syntax und Ablageformat als Verträge; kein Arbeitsbranch ohne Issue; PR-Text vollständig mit Checkliste. Skill sn-aufgabe-bearbeiten und Checkliste in Leitfaden 03 entsprechend. - ADR 0001 und STATUS: Quell-Commit war a0bb40a, nicht decd2a0. gitea.py prüft vor jeder Abfrage, ob die Repos ohne Anmeldung lesbar sind, und bricht sonst mit klarer Meldung ab – bisher meldete die Sammelsuche bei einem privaten Repo „Keine passenden Tickets“. Die Ausgabe läuft jetzt über UTF-8 (cp1252-Konsolen stürzten bei „→“ ab). Tests: python -m pytest -q -> 61 bestanden (6 neu in tests/test_gitea.py). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
86 lines
3.6 KiB
Python
86 lines
3.6 KiB
Python
"""Tests für scripts/gitea.py – ohne Netzwerk, die Gitea-API wird ersetzt."""
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
import pytest
|
||
|
||
ROOT = Path(__file__).resolve().parents[1]
|
||
sys.path.insert(0, str(ROOT / "scripts"))
|
||
|
||
import gitea # noqa: E402
|
||
|
||
BASIS = "https://gitea.example"
|
||
MANIFEST = {"workspace": {"gitea": BASIS, "org": "AG_Test", "repo": "Projektwissen"}, "repos": []}
|
||
|
||
|
||
def api_mit_sichtbaren(*sichtbar):
|
||
"""Ersatz für hole_json: nur die genannten Repos existieren, Issue-Listen sind leer."""
|
||
def hole_json(url):
|
||
if "/issues" in url:
|
||
return []
|
||
name = url.rsplit("/", 1)[-1]
|
||
if name in sichtbar:
|
||
return {"name": name}
|
||
raise gitea.NichtGefunden("Repo/Issue nicht gefunden: " + url)
|
||
return hole_json
|
||
|
||
|
||
def starte(monkeypatch, capsys, *argumente):
|
||
monkeypatch.setattr(gitea, "lade_manifest", lambda: MANIFEST)
|
||
monkeypatch.setattr(sys, "argv", ["gitea.py", *argumente])
|
||
code = gitea.main()
|
||
return code, capsys.readouterr().out
|
||
|
||
|
||
def test_pruefe_sichtbar_laesst_oeffentliches_repo_durch(monkeypatch):
|
||
"""Prüft, dass ein ohne Anmeldung lesbares Repo keinen Fehler auslöst."""
|
||
monkeypatch.setattr(gitea, "hole_json", api_mit_sichtbaren("Projektwissen"))
|
||
gitea.pruefe_sichtbar(BASIS, "AG_Test", ["Projektwissen"])
|
||
|
||
|
||
def test_pruefe_sichtbar_nennt_nicht_lesbare_repos(monkeypatch):
|
||
"""Prüft, dass ein privates Repo mit Namen und Hinweis auf die Sichtbarkeit gemeldet wird."""
|
||
monkeypatch.setattr(gitea, "hole_json", api_mit_sichtbaren("Projektwissen"))
|
||
with pytest.raises(gitea.NichtGefunden) as fehler:
|
||
gitea.pruefe_sichtbar(BASIS, "AG_Test", ["Projektwissen", "Geheim"])
|
||
assert "AG_Test/Geheim" in str(fehler.value)
|
||
assert "AG_Test/Projektwissen" not in str(fehler.value)
|
||
assert "Sichtbarkeit" in str(fehler.value)
|
||
|
||
|
||
def test_tickets_bei_privatem_repo_meldet_fehler_statt_keine_tickets(monkeypatch, capsys):
|
||
"""Prüft, dass 'tickets' bei unsichtbarem Repo mit Exit-Code 1 abbricht, statt 'keine Tickets' zu melden."""
|
||
monkeypatch.setattr(gitea, "hole_json", api_mit_sichtbaren())
|
||
code, ausgabe = starte(monkeypatch, capsys, "tickets")
|
||
assert code == 1
|
||
assert "Ohne Anmeldung nicht lesbar" in ausgabe
|
||
assert "Keine passenden Tickets" not in ausgabe
|
||
|
||
|
||
def test_tickets_bei_oeffentlichem_repo_ohne_tickets(monkeypatch, capsys):
|
||
"""Prüft, dass ein sichtbares Repo ohne offene Tickets weiterhin normal mit Exit-Code 0 endet."""
|
||
monkeypatch.setattr(gitea, "hole_json", api_mit_sichtbaren("Projektwissen"))
|
||
code, ausgabe = starte(monkeypatch, capsys, "tickets")
|
||
assert code == 0
|
||
assert "Keine passenden Tickets" in ausgabe
|
||
|
||
|
||
def test_issue_entwurf_braucht_kein_netz(monkeypatch, capsys, tmp_path):
|
||
"""Prüft, dass 'entwurf issue' ohne jede API-Anfrage eine Entwurfsdatei anlegt."""
|
||
def kein_netz(url):
|
||
raise AssertionError(f"unerwartete Anfrage: {url}")
|
||
monkeypatch.setattr(gitea, "hole_json", kein_netz)
|
||
monkeypatch.setattr(gitea, "ROOT", tmp_path)
|
||
monkeypatch.setattr(gitea, "ENTWURFSORDNER", tmp_path / "entwuerfe")
|
||
code, _ = starte(monkeypatch, capsys, "entwurf", "issue", "Projektwissen")
|
||
assert code == 0
|
||
assert len(list((tmp_path / "entwuerfe").glob("*-issue-Projektwissen.md"))) == 1
|
||
|
||
|
||
def test_ausgabe_mit_zeichen_ausserhalb_cp1252_stuerzt_nicht_ab(monkeypatch, capsys):
|
||
"""Prüft, dass die Fehlermeldung mit '→' auch bei einer cp1252-Konsole ausgegeben wird."""
|
||
monkeypatch.setattr(gitea, "hole_json", api_mit_sichtbaren())
|
||
code, ausgabe = starte(monkeypatch, capsys, "pulls")
|
||
assert code == 1
|
||
assert "→" in ausgabe
|