Files
Projektwissen/tests/test_gitea.py
T
DanielandClaude Opus 5.5 fd58d75502 Regeln für PR- und Issue-Texte an AG_QGIS angleichen (#3)
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>
2026-09-23 13:50:24 +02:00

86 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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