All checks were successful
Deploy server-up (dev) / deploy (push) Successful in 4m23s
Het adres uit de adresbalk van Forgejo of GitHub geeft HTML terug, en de enige melding was een JSONDecodeError. Dat adres wordt nu omgerekend naar /api/v1/repos/...; komt er toch HTML, dan zegt de melding wat er mis is. Een https://-schema voor het imageveld wordt weggehaald, want een image-adres heeft er nooit een. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H9Vcwu7owJZ3nj5dCf4VFT
119 lines
4.9 KiB
Python
119 lines
4.9 KiB
Python
"""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"<!DOCTYPE html>\n<html lang=\"en-US\">"
|
|
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"
|