102 lines
3.3 KiB
Python
102 lines
3.3 KiB
Python
# =================== AIPass ====================
|
|
# Name: test_models_handler.py
|
|
# Description: Tests for OpenRouter model fetching handler
|
|
# Version: 1.0.0
|
|
# Created: 2026-05-12
|
|
# Modified: 2026-05-12
|
|
# =============================================
|
|
|
|
"""Tests for apps/handlers/openrouter/models.py -- model fetching.
|
|
|
|
Tests:
|
|
- fetch_models_from_api: success, non-200, timeout, network error,
|
|
invalid JSON, missing 'data' field
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import requests
|
|
|
|
from aipass.api.apps.handlers.openrouter.models import fetch_models_from_api
|
|
|
|
_MODELS_MOD = "aipass.api.apps.handlers.openrouter.models"
|
|
_FAKE_KEY = "FAKE-sk-or-test"
|
|
|
|
|
|
# =============================================
|
|
# fetch_models_from_api
|
|
# =============================================
|
|
|
|
|
|
class TestFetchModelsFromApi:
|
|
"""Verifies OpenRouter model-list fetching under various conditions."""
|
|
|
|
@patch(f"{_MODELS_MOD}.requests.get")
|
|
def test_successful_fetch(self, mock_get: MagicMock) -> None:
|
|
"""200 response with valid data returns list of model dicts."""
|
|
mock_response = MagicMock()
|
|
mock_response.status_code = 200
|
|
mock_response.json.return_value = {"data": [{"id": "model1"}, {"id": "model2"}]}
|
|
mock_get.return_value = mock_response
|
|
|
|
result = fetch_models_from_api(_FAKE_KEY)
|
|
|
|
assert len(result) == 2
|
|
assert result[0]["id"] == "model1"
|
|
mock_get.assert_called_once()
|
|
|
|
@patch(f"{_MODELS_MOD}.requests.get")
|
|
def test_non_200_status(self, mock_get: MagicMock) -> None:
|
|
"""Non-200 status code returns empty list."""
|
|
mock_response = MagicMock()
|
|
mock_response.status_code = 401
|
|
mock_get.return_value = mock_response
|
|
|
|
result = fetch_models_from_api(_FAKE_KEY)
|
|
|
|
assert result == []
|
|
|
|
@patch(f"{_MODELS_MOD}.requests.get")
|
|
def test_timeout(self, mock_get: MagicMock) -> None:
|
|
"""Request timeout returns empty list."""
|
|
mock_get.side_effect = requests.exceptions.Timeout("timed out")
|
|
|
|
result = fetch_models_from_api(_FAKE_KEY)
|
|
|
|
assert result == []
|
|
|
|
@patch(f"{_MODELS_MOD}.requests.get")
|
|
def test_network_error(self, mock_get: MagicMock) -> None:
|
|
"""General network error returns empty list."""
|
|
mock_get.side_effect = requests.exceptions.ConnectionError("no route")
|
|
|
|
result = fetch_models_from_api(_FAKE_KEY)
|
|
|
|
assert result == []
|
|
|
|
@patch(f"{_MODELS_MOD}.requests.get")
|
|
def test_invalid_json(self, mock_get: MagicMock) -> None:
|
|
"""Invalid JSON response returns empty list."""
|
|
mock_response = MagicMock()
|
|
mock_response.status_code = 200
|
|
mock_response.json.side_effect = ValueError("bad json")
|
|
mock_get.return_value = mock_response
|
|
|
|
result = fetch_models_from_api(_FAKE_KEY)
|
|
|
|
assert result == []
|
|
|
|
@patch(f"{_MODELS_MOD}.requests.get")
|
|
def test_missing_data_field(self, mock_get: MagicMock) -> None:
|
|
"""JSON without 'data' key returns empty list."""
|
|
mock_response = MagicMock()
|
|
mock_response.status_code = 200
|
|
mock_response.json.return_value = {"models": [{"id": "m1"}]}
|
|
mock_get.return_value = mock_response
|
|
|
|
result = fetch_models_from_api(_FAKE_KEY)
|
|
|
|
assert result == []
|