mirror of
https://github.com/Dodelidoo-Labs/sonobarr.git
synced 2026-04-18 05:08:21 -04:00
81 lines
2.7 KiB
Python
81 lines
2.7 KiB
Python
"""Tests for the GitHub release metadata client."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
from types import SimpleNamespace
|
|
|
|
from sonobarr_app.services.releases import ReleaseClient
|
|
|
|
|
|
class _Response:
|
|
"""Minimal response double that mimics requests.Response."""
|
|
|
|
def __init__(self, status_code: int, payload: dict):
|
|
self.status_code = status_code
|
|
self._payload = payload
|
|
|
|
def json(self):
|
|
return self._payload
|
|
|
|
|
|
def test_release_client_uses_cached_payload(monkeypatch):
|
|
"""Client should reuse cached data while within the TTL window."""
|
|
|
|
logger = logging.getLogger("test-release-cache")
|
|
client = ReleaseClient("owner/repo", "ua", ttl_seconds=60, logger=logger)
|
|
calls = []
|
|
|
|
def fake_get(url, headers, timeout):
|
|
calls.append((url, headers, timeout))
|
|
return _Response(200, {"tag_name": "v1.2.3", "html_url": "https://example.com/release"})
|
|
|
|
monkeypatch.setattr("sonobarr_app.services.releases.requests.get", fake_get)
|
|
monkeypatch.setattr("sonobarr_app.services.releases.time.time", lambda: 1000.0)
|
|
first = client.fetch_latest()
|
|
|
|
monkeypatch.setattr("sonobarr_app.services.releases.time.time", lambda: 1010.0)
|
|
second = client.fetch_latest()
|
|
|
|
assert first["tag_name"] == "v1.2.3"
|
|
assert second["tag_name"] == "v1.2.3"
|
|
assert len(calls) == 1
|
|
|
|
|
|
def test_release_client_handles_non_200(monkeypatch):
|
|
"""Client should return fallback link and an error message on failed responses."""
|
|
|
|
logger = logging.getLogger("test-release-error")
|
|
client = ReleaseClient("owner/repo", "ua", ttl_seconds=60, logger=logger)
|
|
|
|
monkeypatch.setattr(
|
|
"sonobarr_app.services.releases.requests.get",
|
|
lambda url, headers, timeout: _Response(503, {}),
|
|
)
|
|
monkeypatch.setattr("sonobarr_app.services.releases.time.time", lambda: 2000.0)
|
|
|
|
info = client.fetch_latest(force=True)
|
|
|
|
assert info["tag_name"] is None
|
|
assert info["html_url"] == "https://github.com/owner/repo/releases"
|
|
assert "status 503" in info["error"]
|
|
|
|
|
|
def test_release_client_handles_exceptions(monkeypatch):
|
|
"""Client should translate transport exceptions into cached error metadata."""
|
|
|
|
logger = logging.getLogger("test-release-exception")
|
|
client = ReleaseClient("owner/repo", "ua", ttl_seconds=60, logger=logger)
|
|
|
|
def raise_error(url, headers, timeout):
|
|
raise RuntimeError("network down")
|
|
|
|
monkeypatch.setattr("sonobarr_app.services.releases.requests.get", raise_error)
|
|
monkeypatch.setattr("sonobarr_app.services.releases.time.time", lambda: 3000.0)
|
|
|
|
info = client.fetch_latest(force=True)
|
|
|
|
assert info["tag_name"] is None
|
|
assert info["html_url"] == "https://github.com/owner/repo/releases"
|
|
assert "network down" in info["error"]
|