"""Update-kanalen: stable ziet alleen releases, beta ook pre-releases.""" import sys from pathlib import Path import pytest sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "server-up")) RELEASES = [ {"tag_name": "v0.5.00", "prerelease": False, "html_url": "u/0.5.00", "body": "stabiel"}, {"tag_name": "v0.5.10-beta1", "prerelease": True, "html_url": "u/beta1", "body": "beta"}, {"tag_name": "v0.4.60", "prerelease": False, "html_url": "u/0.4.60", "body": "oud"}, {"tag_name": "v9.9.9", "prerelease": False, "draft": True, "html_url": "u/draft"}, ] @pytest.fixture def upd(env, monkeypatch): from core import updater updater.invalidate() monkeypatch.setattr(updater, "_releases", lambda url: RELEASES) env["core"].patch({"UPDATE_API_URL": "http://forgejo.test/api/releases"}) return updater def test_stable_negeert_prereleases(upd): res = upd.check("0.4.60", force=True) assert res["channel"] == "stable" assert res["latest"] == "0.5.00" assert res["latest_tag"] == "v0.5.00" assert res["image_tag"] == "0.5.00" assert res["update_available"] is True def test_beta_ziet_de_prerelease(upd, env): env["core"].patch({"UPDATE_CHANNEL": "beta"}) res = upd.check("0.5.00", force=True) assert res["channel"] == "beta" assert res["latest"] == "0.5.10-beta1" assert res["image_tag"] == "0.5.10-beta1" assert res["update_available"] is True assert res["prerelease"] is True def test_stable_biedt_geen_update_vanaf_nieuwere_beta(upd, env): """Draai je 0.5.10-beta1 op stable, dan is 0.5.00 géén update.""" env["core"].patch({"UPDATE_CHANNEL": "stable"}) res = upd.check("0.5.10-beta1", force=True) assert res["latest"] == "0.5.00" assert res["update_available"] is False def test_stabiele_release_wint_van_gelijke_beta(upd, env): """v0.5.10 hoort hoger te zijn dan v0.5.10-beta1.""" env["core"].patch({"UPDATE_CHANNEL": "beta"}) import core.updater as u assert u._parse("0.5.10") > u._parse("0.5.10-beta1") def test_draft_wordt_overgeslagen(upd): assert upd.check("0.1.0", force=True)["latest"] != "9.9.9" def test_oude_bool_migreert_naar_beta(upd, env): env["core"].patch({"UPDATE_INCLUDE_PRERELEASE": True}) env["core"].patch({"UPDATE_CHANNEL": ""}) assert upd.channel() == "beta" def test_expliciet_kanaal_wint_van_oude_bool(upd, env): env["core"].patch({"UPDATE_INCLUDE_PRERELEASE": True, "UPDATE_CHANNEL": "stable"}) assert upd.channel() == "stable" def test_cache_voorkomt_herhaalde_netwerkverzoeken(upd, monkeypatch): tellers = {"n": 0} def _tel(url): tellers["n"] += 1 return RELEASES monkeypatch.setattr(upd, "_releases", _tel) upd.check("0.4.60", force=True) upd.check("0.4.60") upd.check("0.4.60") assert tellers["n"] == 1 upd.check("0.4.60", force=True) assert tellers["n"] == 2 def test_zonder_url_uitgeschakeld(upd, env): env["core"].patch({"UPDATE_API_URL": ""}) res = upd.check("0.4.60", force=True) assert res["enabled"] is False assert res["update_available"] is False def test_netwerkfout_wordt_gemeld(upd, monkeypatch): def _stuk(url): raise TimeoutError("te traag") monkeypatch.setattr(upd, "_releases", _stuk) res = upd.check("0.4.60", force=True) assert "TimeoutError" in res["error"] assert res["update_available"] is False def test_is_prerelease(): from core import updater assert updater.is_prerelease("0.5.00-beta") is True assert updater.is_prerelease("0.5.00") is False @pytest.mark.parametrize("release_tag,image_tag", [ ("v0.8.13", "0.8.13"), ("v0.8.13-beta", "0.8.13-beta"), ("0.8.13", "0.8.13"), ("beta", "beta"), ]) def test_registry_tag_past_bij_de_workflow(release_tag, image_tag): """Forgejo-tags beginnen met v; de registry-workflow stript die v.""" from core import updater assert updater.image_tag(release_tag) == image_tag def test_ongeldig_kanaal_wordt_geweigerd(client): from conftest import login csrf = login(client) r = client.put("/api/settings", json={"UPDATE_CHANNEL": "onzin"}, headers={"X-CSRF-Token": csrf}) assert r.status_code == 400