"""Het adres van de releases-API en van het image, zoals mensen ze invullen. Wie in Forgejo naar zijn releases kijkt en dat adres uit de adresbalk plakt, geeft het adres van een webpagina op. De enige melding die daarop volgde was `JSONDecodeError: Expecting value: line 1 column 1 (char 0)`, en daar leidt niemand uit af dat er `/api/v1/repos/` in had moeten staan. """ import sys from pathlib import Path import pytest WORTEL = Path(__file__).resolve().parent.parent sys.path.insert(0, str(WORTEL / "server-up")) # ── Het releases-adres ─────────────────────────────────────────────────────── @pytest.mark.parametrize("ingevuld,verwacht", [ # Wat je uit de adresbalk van Forgejo plakt. ("https://git.voorbeeld.nl/bes-r/server-up/releases", "https://git.voorbeeld.nl/api/v1/repos/bes-r/server-up/releases"), # Zonder /releases erachter. ("https://git.voorbeeld.nl/bes-r/server-up", "https://git.voorbeeld.nl/api/v1/repos/bes-r/server-up/releases"), # Met poort, en http. ("http://10.0.20.22:3000/bes-r/server-up/releases", "http://10.0.20.22:3000/api/v1/repos/bes-r/server-up/releases"), # De kloon-URL. ("https://git.voorbeeld.nl/bes-r/server-up.git", "https://git.voorbeeld.nl/api/v1/repos/bes-r/server-up/releases"), # GitHub heeft zijn API op een eigen host. ("https://github.com/bes-r/server-up/releases", "https://api.github.com/repos/bes-r/server-up/releases"), ]) def test_webadres_wordt_een_apiadres(env, ingevuld, verwacht): from core import updater assert updater.api_url(ingevuld) == verwacht @pytest.mark.parametrize("al_goed", [ "https://git.voorbeeld.nl/api/v1/repos/bes-r/server-up/releases", "https://api.github.com/repos/bes-r/server-up/releases", ]) def test_een_apiadres_blijft_ongemoeid(env, al_goed): from core import updater assert updater.api_url(al_goed) == al_goed def test_leeg_blijft_leeg(env): from core import updater assert updater.api_url("") == "" assert updater.api_url(" ") == "" def test_onherkenbaar_adres_blijft_staan(env): """Niet slimmer doen dan we zijn: wat we niet herkennen laten we met rust, zodat een eigen proxy-adres blijft werken.""" from core import updater raar = "https://voorbeeld.nl/een/diep/pad/met/releases.json" assert updater.api_url(raar) == raar def test_html_geeft_een_begrijpelijke_fout(env, monkeypatch): """De melding moet zeggen wát er mis is, niet dat JSON niet parseert.""" from core import updater class _Antwoord: def read(self): return b"\n" def __enter__(self): return self def __exit__(self, *a): return False monkeypatch.setattr(updater.urllib.request, "urlopen", lambda *a, **k: _Antwoord()) with pytest.raises(ValueError) as fout: updater._releases("https://git.voorbeeld.nl/bes-r/server-up/releases") melding = str(fout.value) assert "webpagina" in melding assert "/api/v1/repos/" in melding assert "JSONDecode" not in melding def test_check_gebruikt_het_omgerekende_adres(env, monkeypatch): from core import updater env["core"].patch({"UPDATE_API_URL": "https://git.voorbeeld.nl/bes-r/server-up/releases"}) gebruikt = [] monkeypatch.setattr(updater, "_releases", lambda u: gebruikt.append(u) or [ {"tag_name": "v9.9.99", "prerelease": False}]) res = updater.check("0.8.28", force=True) assert gebruikt == [ "https://git.voorbeeld.nl/api/v1/repos/bes-r/server-up/releases"] assert res["update_available"] is True # ── Het imageadres ─────────────────────────────────────────────────────────── def test_schema_voor_het_image_wordt_weggehaald(env): """`docker pull https://…` bestaat niet, maar in het veld ziet het er goed uit. Er is geen geldig image dat met een schema begint, dus weghalen kan.""" from core import selfupdate env["core"].patch({"UPDATE_IMAGE": "https://git.voorbeeld.nl/bes-r/server-up"}) assert selfupdate.image_repo({}) == "git.voorbeeld.nl/bes-r/server-up" env["core"].patch({"UPDATE_IMAGE": "http://10.0.20.22:3000/bes-r/server-up/"}) assert selfupdate.image_repo({}) == "10.0.20.22:3000/bes-r/server-up" def test_image_zonder_schema_blijft_gelijk(env): from core import selfupdate env["core"].patch({"UPDATE_IMAGE": "git.voorbeeld.nl/bes-r/server-up"}) assert selfupdate.image_repo({}) == "git.voorbeeld.nl/bes-r/server-up" # Een tag hoort er niet in; die komt van de release. env["core"].patch({"UPDATE_IMAGE": "git.voorbeeld.nl/bes-r/server-up:0.8.28"}) assert selfupdate.image_repo({}) == "git.voorbeeld.nl/bes-r/server-up"