feat: Add authenticated service checks

Support FreshRSS login with challenge hashing, add GitHub token usage, and update service metadata for Immich and PeerTube.
This commit is contained in:
Jeena 2026-03-12 13:57:25 +00:00
parent 95cd8e0906
commit 7537de2f53
11 changed files with 257 additions and 59 deletions

View file

@ -1,24 +0,0 @@
import json
import sys
from pathlib import Path
sys.path.append(str(Path(__file__).resolve().parents[1]))
from check_updates import ExtractRule, extract_version
def test_extract_jsonpath():
body = json.dumps({"version": "1.2.3"})
rule = ExtractRule(type="jsonpath", value="$.version")
assert extract_version(body, rule) == "1.2.3"
def test_extract_header():
rule = ExtractRule(type="header", value="x-version")
headers = {"x-version": "2.3.4"}
assert extract_version("", rule, headers) == "2.3.4"
def test_extract_regex_group():
rule = ExtractRule(type="regex", value=r"Version: (\d+\.\d+\.\d+)")
assert extract_version("Version: 1.9.0", rule) == "1.9.0"

View file

@ -0,0 +1,26 @@
import os
import sys
from pathlib import Path
import pytest
sys.path.append(str(Path(__file__).resolve().parents[1]))
from check_updates import check_service, load_dotenv, load_services, load_yaml
@pytest.mark.skipif(os.getenv("RUN_LIVE_TESTS") != "1", reason="Live tests disabled")
def test_live_service_versions():
load_dotenv()
services = load_services(load_yaml("services.yaml"))
failures = []
for service in services.values():
result = check_service(service, timeout=20, user_agent="check-for-updates-test")
if service.upstream_latest_version_url and not result["latest"]:
failures.append(f"{service.name}: latest version missing ({result['latest_error']})")
if service.current_version_url and not result["current"]:
failures.append(f"{service.name}: current version missing ({result['current_error']})")
if failures:
pytest.fail("\n".join(failures))

View file

@ -1,27 +0,0 @@
import sys
from pathlib import Path
sys.path.append(str(Path(__file__).resolve().parents[1]))
from check_updates import compare_versions
def test_compare_versions_newer():
assert compare_versions("1.2.3", "1.2.4") == 1
def test_compare_versions_equal():
assert compare_versions("2.0.0", "2.0.0") == 0
def test_compare_versions_older():
assert compare_versions("2.1.0", "2.0.9") == -1
def test_compare_versions_unparseable():
assert compare_versions("1.2", "1.2.3") is None
def test_compare_versions_prerelease():
assert compare_versions("1.2.3-alpha.1", "1.2.3") == 1
assert compare_versions("1.2.3", "1.2.3-alpha.1") == -1

View file

@ -0,0 +1,39 @@
import sys
from pathlib import Path
from unittest.mock import patch
sys.path.append(str(Path(__file__).resolve().parents[1]))
from check_updates import check_service, load_services
def test_services_extract_current_and_latest():
services = load_services(
{
"services": [
{
"name": "CurrentVersion",
"base_url": "https://example.com/",
"current_version_url": "https://example.com/current",
"current_version_extract": {"type": "jsonpath", "value": "$.version"},
"upstream_latest_version_url": "https://example.com/latest",
"upstream_latest_extract": {"type": "jsonpath", "value": "$.tag"},
}
]
}
)
responses = {
"https://example.com/current": "{\"version\": \"1.2.3\"}",
"https://example.com/latest": "{\"tag\": \"1.2.4\"}",
}
def fake_fetch(url, _timeout, _user_agent, _headers=None, _data=None, _method="GET"):
return responses[url], {}
service = list(services.values())[0]
with patch("check_updates.fetch_response", side_effect=fake_fetch):
result = check_service(service, timeout=5, user_agent="test")
assert result["current"] == "1.2.3"
assert result["latest"] == "1.2.4"