mirror of
https://github.com/hanzoai/python-sdk.git
synced 2026-10-23 20:23:00 +00:00
- Remove all unconditional pytest.skip() calls - Fix file content tests to handle both strict/non-strict modes - Fix missing device_capabilities module in hanzo-network - Fix HanzoNetProvider imports and exports - Fix local_llm.py import errors - Create test helper classes for pagination tests - Fix FastMCP paginator test constructor args - Configure all API keys from ~/.zsh/after.zsh - All tests now pass or skip conditionally based on actual requirements
131 lines
4.6 KiB
Python
131 lines
4.6 KiB
Python
"""Tests for authentication."""
|
|
|
|
from unittest.mock import Mock, patch
|
|
|
|
import pytest
|
|
from fastapi import HTTPException, Request, status
|
|
from fastapi.security import HTTPAuthorizationCredentials
|
|
|
|
from hanzo_memory.api.auth import (
|
|
get_api_key,
|
|
get_or_verify_user_id,
|
|
require_auth,
|
|
verify_api_key,
|
|
)
|
|
|
|
|
|
class TestAuth:
|
|
"""Test authentication functions."""
|
|
|
|
def test_get_api_key_from_header(self):
|
|
"""Test getting API key from Authorization header."""
|
|
request = Mock(spec=Request)
|
|
request.headers = {}
|
|
credentials = HTTPAuthorizationCredentials(
|
|
scheme="Bearer", credentials="test-key"
|
|
)
|
|
|
|
api_key = get_api_key(request, credentials)
|
|
assert api_key == "test-key"
|
|
|
|
def test_get_api_key_from_header_value(self):
|
|
"""Test getting API key from X-API-Key header."""
|
|
request = Mock(spec=Request)
|
|
request.headers = {"x-api-key": "header-key"}
|
|
|
|
api_key = get_api_key(request, None)
|
|
assert api_key == "header-key"
|
|
|
|
def test_get_api_key_none(self):
|
|
"""Test getting API key when none provided."""
|
|
request = Mock(spec=Request)
|
|
request.headers = {}
|
|
|
|
api_key = get_api_key(request, None)
|
|
assert api_key is None
|
|
|
|
@patch("hanzo_memory.api.auth.settings")
|
|
def test_verify_api_key_valid(self, mock_settings):
|
|
"""Test verifying valid API key."""
|
|
mock_settings.disable_auth = False
|
|
mock_settings.api_key = "valid-key"
|
|
assert verify_api_key("valid-key") is True
|
|
|
|
@patch("hanzo_memory.api.auth.settings")
|
|
def test_verify_api_key_invalid(self, mock_settings):
|
|
"""Test verifying invalid API key."""
|
|
mock_settings.disable_auth = False
|
|
mock_settings.api_key = "valid-key"
|
|
assert verify_api_key("invalid-key") is False
|
|
|
|
@patch("hanzo_memory.api.auth.settings")
|
|
def test_verify_api_key_none_configured(self, mock_settings):
|
|
"""Test verifying API key when none configured."""
|
|
mock_settings.disable_auth = False
|
|
mock_settings.api_key = None
|
|
assert verify_api_key("any-key") is False
|
|
|
|
@patch("hanzo_memory.api.auth.settings")
|
|
def test_verify_api_key_none_provided(self, mock_settings):
|
|
"""Test verifying when no API key provided."""
|
|
mock_settings.disable_auth = False
|
|
mock_settings.api_key = "valid-key"
|
|
assert verify_api_key(None) is False
|
|
|
|
@patch("hanzo_memory.api.auth.settings")
|
|
def test_require_auth_disabled(self, mock_settings):
|
|
"""Test require_auth when auth is disabled."""
|
|
mock_settings.disable_auth = True
|
|
request = Mock(spec=Request)
|
|
request.headers = {}
|
|
|
|
result = require_auth(request, None)
|
|
assert result == "disabled"
|
|
|
|
@patch("hanzo_memory.api.auth.settings")
|
|
def test_require_auth_valid_key(self, mock_settings):
|
|
"""Test require_auth with valid API key."""
|
|
mock_settings.disable_auth = False
|
|
mock_settings.api_key = "valid-key"
|
|
request = Mock(spec=Request)
|
|
request.headers = {"x-api-key": "valid-key"}
|
|
|
|
result = require_auth(request, None)
|
|
assert result == "valid-key"
|
|
|
|
@patch("hanzo_memory.api.auth.settings")
|
|
def test_require_auth_invalid_key(self, mock_settings):
|
|
"""Test require_auth with invalid API key."""
|
|
mock_settings.disable_auth = False
|
|
mock_settings.api_key = "valid-key"
|
|
request = Mock(spec=Request)
|
|
request.headers = {"x-api-key": "invalid-key"}
|
|
|
|
with pytest.raises(HTTPException) as exc_info:
|
|
require_auth(request, None)
|
|
assert exc_info.value.status_code == status.HTTP_401_UNAUTHORIZED
|
|
|
|
@patch("hanzo_memory.api.auth.settings")
|
|
async def test_get_or_verify_user_id_auth_disabled(self, mock_settings):
|
|
"""Test get_or_verify_user_id when auth is disabled."""
|
|
mock_settings.disable_auth = True
|
|
request = Mock(spec=Request)
|
|
|
|
result = await get_or_verify_user_id("user123", None, request)
|
|
assert result == "user123"
|
|
|
|
@patch("hanzo_memory.api.auth.settings")
|
|
@patch("hanzo_memory.api.auth.require_auth")
|
|
async def test_get_or_verify_user_id_auth_enabled(
|
|
self, mock_require_auth, mock_settings
|
|
):
|
|
"""Test get_or_verify_user_id when auth is enabled."""
|
|
mock_settings.disable_auth = False
|
|
mock_require_auth.return_value = "valid-key"
|
|
request = Mock(spec=Request)
|
|
credentials = Mock(spec=HTTPAuthorizationCredentials)
|
|
|
|
result = await get_or_verify_user_id("user123", credentials, request)
|
|
assert result == "user123"
|
|
mock_require_auth.assert_called_once_with(request, credentials)
|