-
Notifications
You must be signed in to change notification settings - Fork 76
/
Copy pathtest_openrouter_provider.py
98 lines (72 loc) · 3.41 KB
/
test_openrouter_provider.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import json
from unittest.mock import AsyncMock, MagicMock
import pytest
from fastapi import HTTPException
from fastapi.requests import Request
from codegate.config import DEFAULT_PROVIDER_URLS
from codegate.pipeline.factory import PipelineFactory
from codegate.providers.openrouter.provider import OpenRouterProvider
@pytest.fixture
def mock_factory():
return MagicMock(spec=PipelineFactory)
@pytest.fixture
def provider(mock_factory):
return OpenRouterProvider(mock_factory)
def test_get_base_url(provider):
"""Test that _get_base_url returns the correct OpenRouter API URL"""
assert provider._get_base_url() == DEFAULT_PROVIDER_URLS["openrouter"]
@pytest.mark.asyncio
async def test_model_prefix_added():
"""Test that model name gets prefixed with openrouter/ when not already present"""
mock_factory = MagicMock(spec=PipelineFactory)
provider = OpenRouterProvider(mock_factory)
provider.process_request = AsyncMock()
# Mock request
mock_request = MagicMock(spec=Request)
mock_request.body = AsyncMock(return_value=json.dumps({"model": "gpt-4"}).encode())
mock_request.url.path = "/openrouter/chat/completions"
mock_request.state.detected_client = "test-client"
# Get the route handler function
route_handlers = [
route for route in provider.router.routes if route.path == "/openrouter/chat/completions"
]
create_completion = route_handlers[0].endpoint
await create_completion(request=mock_request, authorization="Bearer test-token")
# Verify process_request was called with prefixed model
call_args = provider.process_request.call_args[0]
assert call_args[0]["model"] == "openrouter/gpt-4"
@pytest.mark.asyncio
async def test_model_prefix_preserved():
"""Test that model name is not modified when openrouter/ prefix is already present"""
mock_factory = MagicMock(spec=PipelineFactory)
provider = OpenRouterProvider(mock_factory)
provider.process_request = AsyncMock()
# Mock request
mock_request = MagicMock(spec=Request)
mock_request.body = AsyncMock(return_value=json.dumps({"model": "openrouter/gpt-4"}).encode())
mock_request.url.path = "/openrouter/chat/completions"
mock_request.state.detected_client = "test-client"
# Get the route handler function
route_handlers = [
route for route in provider.router.routes if route.path == "/openrouter/chat/completions"
]
create_completion = route_handlers[0].endpoint
await create_completion(request=mock_request, authorization="Bearer test-token")
# Verify process_request was called with unchanged model name
call_args = provider.process_request.call_args[0]
assert call_args[0]["model"] == "openrouter/gpt-4"
@pytest.mark.asyncio
async def test_invalid_auth_header():
"""Test that invalid authorization header format raises HTTPException"""
mock_factory = MagicMock(spec=PipelineFactory)
provider = OpenRouterProvider(mock_factory)
mock_request = MagicMock(spec=Request)
# Get the route handler function
route_handlers = [
route for route in provider.router.routes if route.path == "/openrouter/chat/completions"
]
create_completion = route_handlers[0].endpoint
with pytest.raises(HTTPException) as exc_info:
await create_completion(request=mock_request, authorization="InvalidToken")
assert exc_info.value.status_code == 401
assert exc_info.value.detail == "Invalid authorization header"