"""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