Panneau MAJ simplifié : dépôt public, plus de configuration Gitea — patchnote du dernier tag

This commit is contained in:
Roman
2026-09-25 15:39:00 +00:00
parent fed61adc56
commit eae97f9129
6 changed files with 61 additions and 131 deletions
+27 -50
View File
@@ -3,8 +3,8 @@
import httpx
import pytest
from app.config import get_settings
from app.services import update as update_service
from app.services.settings import get_update_config
from app.version import get_version
@@ -15,6 +15,12 @@ def reset_update_cache():
update_service.invalidate_cache()
def _patch_gitea(monkeypatch, url: str = "https://git.example", repo: str = "roman/ohm") -> None:
settings = get_settings()
monkeypatch.setattr(settings, "gitea_url", url)
monkeypatch.setattr(settings, "gitea_repo", repo)
# ---------------------------------------------------------------- semver / version
@@ -41,18 +47,9 @@ def test_get_version_env_override(monkeypatch):
# ---------------------------------------------------------------- détection Gitea
async def test_fetch_latest_without_repo():
from app.services.settings import set_update_config
await set_update_config("https://git.example", "", "tok")
assert await update_service.fetch_latest_version(force=True) is None
async def test_fetch_latest_public_repo_no_token(monkeypatch):
"""Dépôt public : pas de jeton → appel sans en-tête Authorization."""
from app.services.settings import set_update_config
await set_update_config("https://git.example", "roman/ohm", "")
async def test_fetch_latest_no_auth_header(monkeypatch):
"""Dépôt public : appel sans en-tête Authorization."""
_patch_gitea(monkeypatch)
class FakeResponse:
def raise_for_status(self) -> None:
@@ -73,17 +70,20 @@ async def test_fetch_latest_public_repo_no_token(monkeypatch):
async def test_fetch_latest_picks_highest_semver(monkeypatch):
"""Avec jeton : en-tête Authorization + plus haut semver retenu, puis cache."""
from app.services.settings import set_update_config
await set_update_config("https://git.example", "roman/ohm", "tok")
"""Plus haut semver retenu + patchnote du tag, puis cache."""
_patch_gitea(monkeypatch)
class FakeResponse:
def raise_for_status(self) -> None:
pass
def json(self) -> list[dict]:
return [{"name": "v0.1.0"}, {"name": "v0.2.3"}, {"name": "v1.0.0-rc"}, {"name": "divers"}]
return [
{"name": "v0.1.0", "message": "ancien"},
{"name": "v0.2.3", "message": "correctifs\n"},
{"name": "v1.0.0-rc"},
{"name": "divers"},
]
calls: list[tuple[str, dict]] = []
@@ -92,21 +92,18 @@ async def test_fetch_latest_picks_highest_semver(monkeypatch):
return FakeResponse()
monkeypatch.setattr(httpx.AsyncClient, "get", fake_get)
latest = await update_service.fetch_latest_version(force=True)
status = await update_service.status()
assert latest == "v0.2.3"
assert calls == [
("https://git.example/api/v1/repos/roman/ohm/tags?limit=20", {"Authorization": "token tok"})
]
assert status["latest"] == "v0.2.3"
assert status["notes"] == "correctifs"
assert calls == [("https://git.example/api/v1/repos/roman/ohm/tags?limit=20", {})]
# puis servi par le cache (plus d'appel réseau)
assert await update_service.fetch_latest_version() == "v0.2.3"
assert len(calls) == 1
async def test_fetch_latest_network_error_degrades(monkeypatch):
from app.services.settings import set_update_config
await set_update_config("https://git.example", "roman/ohm", "tok")
_patch_gitea(monkeypatch)
async def fake_get(self: httpx.AsyncClient, url: str, headers: dict | None = None):
raise httpx.ConnectError("injoignable")
@@ -148,33 +145,13 @@ async def test_update_status_defaults(client, admin_cookies, monkeypatch):
r = await client.get("/api/admin/update", cookies=admin_cookies)
assert r.status_code == 200
data = r.json()
assert data["configured"] is True and data["docker"] is False # repo par défaut présent
assert data["latest"] is None and data["update_available"] is False
assert data["config"]["gitea_url"] == "https://git.lanro.eu"
assert data["config"]["repo"] == "Roman/ohm_streaming"
assert data["docker"] is False and data["notes"] is None
async def test_update_save_config_normalizes(client, admin_cookies):
r = await client.put(
"/api/admin/update",
json={"gitea_url": "https://git.example/", "repo": "/roman/ohm/", "token": " tok "},
cookies=admin_cookies,
)
assert r.status_code == 200
assert await get_update_config() == {
"gitea_url": "https://git.example",
"repo": "roman/ohm",
"token": "tok",
}
async def test_update_check_degrades_gracefully(client, admin_cookies):
# Gitea configuré mais injoignable : le check répond quand même (latest=None)
await client.put(
"/api/admin/update",
json={"gitea_url": "https://git.inexistant", "repo": "roman/ohm", "token": "tok"},
cookies=admin_cookies,
)
async def test_update_check_degrades_gracefully(client, admin_cookies, monkeypatch):
# Gitea injoignable : le check répond quand même (latest=None)
_patch_gitea(monkeypatch, url="https://git.inexistant", repo="roman/ohm")
r = await client.post("/api/admin/update/check", cookies=admin_cookies)
assert r.status_code == 200 and r.json()["latest"] is None