Files
archon/python/tests/server/api_routes/test_version_api.py
Cole Medin 3ff3f7f2dc Migrations and version APIs (#718)
* Preparing migration folder for the migration alert implementation

* Migrations and version APIs initial

* Touching up update instructions in README and UI

* Unit tests for migrations and version APIs

* Splitting up the Ollama migration scripts

* Removing temporary PRPs

---------

Co-authored-by: Rasmus Widing <rasmus.widing@gmail.com>
2025-09-22 12:25:58 +03:00

147 lines
4.9 KiB
Python

"""
Unit tests for version_api.py
"""
from datetime import datetime
from unittest.mock import AsyncMock, patch
import pytest
from fastapi.testclient import TestClient
from src.server.config.version import ARCHON_VERSION
from src.server.main import app
@pytest.fixture
def client():
"""Create test client."""
return TestClient(app)
@pytest.fixture
def mock_version_data():
"""Mock version check data."""
return {
"current": ARCHON_VERSION,
"latest": "0.2.0",
"update_available": True,
"release_url": "https://github.com/coleam00/Archon/releases/tag/v0.2.0",
"release_notes": "New features and bug fixes",
"published_at": datetime(2025, 1, 1, 0, 0, 0),
"check_error": None,
"author": "coleam00",
"assets": [{"name": "archon.zip", "size": 1024000}],
}
def test_check_for_updates_success(client, mock_version_data):
"""Test successful version check."""
with patch("src.server.api_routes.version_api.version_service") as mock_service:
mock_service.check_for_updates = AsyncMock(return_value=mock_version_data)
response = client.get("/api/version/check")
assert response.status_code == 200
data = response.json()
assert data["current"] == ARCHON_VERSION
assert data["latest"] == "0.2.0"
assert data["update_available"] is True
assert data["release_url"] == mock_version_data["release_url"]
def test_check_for_updates_no_update(client):
"""Test when no update is available."""
mock_data = {
"current": ARCHON_VERSION,
"latest": ARCHON_VERSION,
"update_available": False,
"release_url": None,
"release_notes": None,
"published_at": None,
"check_error": None,
}
with patch("src.server.api_routes.version_api.version_service") as mock_service:
mock_service.check_for_updates = AsyncMock(return_value=mock_data)
response = client.get("/api/version/check")
assert response.status_code == 200
data = response.json()
assert data["current"] == ARCHON_VERSION
assert data["latest"] == ARCHON_VERSION
assert data["update_available"] is False
def test_check_for_updates_with_etag_modified(client, mock_version_data):
"""Test ETag handling when data has changed."""
with patch("src.server.api_routes.version_api.version_service") as mock_service:
mock_service.check_for_updates = AsyncMock(return_value=mock_version_data)
# First request
response1 = client.get("/api/version/check")
assert response1.status_code == 200
old_etag = response1.headers.get("etag")
# Modify data
modified_data = mock_version_data.copy()
modified_data["latest"] = "0.3.0"
mock_service.check_for_updates = AsyncMock(return_value=modified_data)
# Second request with old ETag
response2 = client.get("/api/version/check", headers={"If-None-Match": old_etag})
assert response2.status_code == 200 # Data changed, return new data
data = response2.json()
assert data["latest"] == "0.3.0"
def test_check_for_updates_error_handling(client):
"""Test error handling in version check."""
with patch("src.server.api_routes.version_api.version_service") as mock_service:
mock_service.check_for_updates = AsyncMock(side_effect=Exception("API error"))
response = client.get("/api/version/check")
assert response.status_code == 200 # Should still return 200
data = response.json()
assert data["current"] == ARCHON_VERSION
assert data["latest"] is None
assert data["update_available"] is False
assert data["check_error"] == "API error"
def test_get_current_version(client):
"""Test getting current version."""
response = client.get("/api/version/current")
assert response.status_code == 200
data = response.json()
assert data["version"] == ARCHON_VERSION
assert "timestamp" in data
def test_clear_version_cache_success(client):
"""Test clearing version cache."""
with patch("src.server.api_routes.version_api.version_service") as mock_service:
mock_service.clear_cache.return_value = None
response = client.post("/api/version/clear-cache")
assert response.status_code == 200
data = response.json()
assert data["success"] is True
assert data["message"] == "Version cache cleared successfully"
mock_service.clear_cache.assert_called_once()
def test_clear_version_cache_error(client):
"""Test error handling when clearing cache fails."""
with patch("src.server.api_routes.version_api.version_service") as mock_service:
mock_service.clear_cache.side_effect = Exception("Cache error")
response = client.post("/api/version/clear-cache")
assert response.status_code == 500
assert "Failed to clear cache" in response.json()["detail"]