11"""Unit tests for the /providers REST API endpoints."""
22
33import pytest
4+ from pytest_mock import MockerFixture
45from fastapi import HTTPException , Request , status
56from llama_stack_client import APIConnectionError
67
8+ from authentication .interface import AuthTuple
9+
710from app .endpoints .providers import (
811 get_provider_endpoint_handler ,
912 providers_endpoint_handler ,
1013)
1114
1215
1316@pytest .mark .asyncio
14- async def test_providers_endpoint_configuration_not_loaded (mocker ):
17+ async def test_providers_endpoint_configuration_not_loaded (
18+ mocker : MockerFixture ,
19+ ) -> None :
1520 """Test that /providers endpoint raises HTTP 500 if configuration is not loaded."""
1621 mocker .patch ("app.endpoints.providers.configuration" , None )
1722 request = Request (scope = {"type" : "http" })
18- auth = ("user" , "token" , {})
23+
24+ # Authorization tuple required by URL endpoint handler
25+ auth : AuthTuple = ("test_user_id" , "test_user" , True , "test_token" )
1926
2027 with pytest .raises (HTTPException ) as e :
2128 await providers_endpoint_handler (request = request , auth = auth )
2229 assert e .value .status_code == status .HTTP_500_INTERNAL_SERVER_ERROR
2330
2431
2532@pytest .mark .asyncio
26- async def test_providers_endpoint_connection_error (mocker ) :
33+ async def test_providers_endpoint_connection_error (mocker : MockerFixture ) -> None :
2734 """Test that /providers endpoint raises HTTP 500 if Llama Stack connection fails."""
2835 mock_client = mocker .AsyncMock ()
29- mock_client .providers .list .side_effect = APIConnectionError (request = None )
36+ mock_client .providers .list .side_effect = APIConnectionError (request = None ) # type: ignore
3037 mocker .patch (
3138 "app.endpoints.providers.AsyncLlamaStackClientHolder"
3239 ).return_value .get_client .return_value = mock_client
3340
3441 request = Request (scope = {"type" : "http" })
35- auth = ("user" , "token" , {})
42+
43+ # Authorization tuple required by URL endpoint handler
44+ auth : AuthTuple = ("test_user_id" , "test_user" , True , "test_token" )
3645
3746 with pytest .raises (HTTPException ) as e :
3847 await providers_endpoint_handler (request = request , auth = auth )
3948 assert e .value .status_code == status .HTTP_500_INTERNAL_SERVER_ERROR
40- assert "Unable to connect to Llama Stack" in e .value .detail ["response" ]
49+ detail = e .value .detail
50+ assert isinstance (detail , dict )
51+ assert "Unable to connect to Llama Stack" in detail ["response" ]
4152
4253
4354@pytest .mark .asyncio
44- async def test_providers_endpoint_success (mocker ) :
55+ async def test_providers_endpoint_success (mocker : MockerFixture ) -> None :
4556 """Test that /providers endpoint returns a grouped list of providers on success."""
4657 provider_list = [
4758 {
@@ -67,7 +78,9 @@ async def test_providers_endpoint_success(mocker):
6778 ).return_value .get_client .return_value = mock_client
6879
6980 request = Request (scope = {"type" : "http" })
70- auth = ("user" , "token" , {})
81+
82+ # Authorization tuple required by URL endpoint handler
83+ auth : AuthTuple = ("test_user_id" , "test_user" , True , "test_token" )
7184
7285 response = await providers_endpoint_handler (request = request , auth = auth )
7386 assert "inference" in response .providers
@@ -76,7 +89,7 @@ async def test_providers_endpoint_success(mocker):
7689
7790
7891@pytest .mark .asyncio
79- async def test_get_provider_not_found (mocker ) :
92+ async def test_get_provider_not_found (mocker : MockerFixture ) -> None :
8093 """Test that /providers/{provider_id} endpoint raises HTTP 404 if the provider is not found."""
8194 mock_client = mocker .AsyncMock ()
8295 mock_client .providers .list .return_value = []
@@ -85,18 +98,22 @@ async def test_get_provider_not_found(mocker):
8598 ).return_value .get_client .return_value = mock_client
8699
87100 request = Request (scope = {"type" : "http" })
88- auth = ("user" , "token" , {})
101+
102+ # Authorization tuple required by URL endpoint handler
103+ auth : AuthTuple = ("test_user_id" , "test_user" , True , "test_token" )
89104
90105 with pytest .raises (HTTPException ) as e :
91106 await get_provider_endpoint_handler (
92107 request = request , provider_id = "openai" , auth = auth
93108 )
94109 assert e .value .status_code == status .HTTP_404_NOT_FOUND
95- assert "not found" in e .value .detail ["response" ]
110+ detail = e .value .detail
111+ assert isinstance (detail , dict )
112+ assert "not found" in detail ["response" ]
96113
97114
98115@pytest .mark .asyncio
99- async def test_get_provider_success (mocker ) :
116+ async def test_get_provider_success (mocker : MockerFixture ) -> None :
100117 """Test that /providers/{provider_id} endpoint returns provider details on success."""
101118 provider = {
102119 "api" : "inference" ,
@@ -112,7 +129,9 @@ async def test_get_provider_success(mocker):
112129 ).return_value .get_client .return_value = mock_client
113130
114131 request = Request (scope = {"type" : "http" })
115- auth = ("user" , "token" , {})
132+
133+ # Authorization tuple required by URL endpoint handler
134+ auth : AuthTuple = ("test_user_id" , "test_user" , True , "test_token" )
116135
117136 response = await get_provider_endpoint_handler (
118137 request = request , provider_id = "openai" , auth = auth
@@ -122,27 +141,31 @@ async def test_get_provider_success(mocker):
122141
123142
124143@pytest .mark .asyncio
125- async def test_get_provider_connection_error (mocker ) :
144+ async def test_get_provider_connection_error (mocker : MockerFixture ) -> None :
126145 """Test that /providers/{provider_id} raises HTTP 500 if Llama Stack connection fails."""
127146 mock_client = mocker .AsyncMock ()
128- mock_client .providers .list .side_effect = APIConnectionError (request = None )
147+ mock_client .providers .list .side_effect = APIConnectionError (request = None ) # type: ignore
129148 mocker .patch (
130149 "app.endpoints.providers.AsyncLlamaStackClientHolder"
131150 ).return_value .get_client .return_value = mock_client
132151
133152 request = Request (scope = {"type" : "http" })
134- auth = ("user" , "token" , {})
153+
154+ # Authorization tuple required by URL endpoint handler
155+ auth : AuthTuple = ("test_user_id" , "test_user" , True , "test_token" )
135156
136157 with pytest .raises (HTTPException ) as e :
137158 await get_provider_endpoint_handler (
138159 request = request , provider_id = "openai" , auth = auth
139160 )
140161 assert e .value .status_code == status .HTTP_500_INTERNAL_SERVER_ERROR
141- assert "Unable to connect to Llama Stack" in e .value .detail ["response" ]
162+ detail = e .value .detail
163+ assert isinstance (detail , dict )
164+ assert "Unable to connect to Llama Stack" in detail ["response" ]
142165
143166
144167@pytest .mark .asyncio
145- async def test_get_provider_unexpected_exception (mocker ) :
168+ async def test_get_provider_unexpected_exception (mocker : MockerFixture ) -> None :
146169 """Test that /providers/{provider_id} endpoint raises HTTP 500 for unexpected exceptions."""
147170 mock_client = mocker .AsyncMock ()
148171 mock_client .providers .list .side_effect = Exception ("boom" )
@@ -151,11 +174,15 @@ async def test_get_provider_unexpected_exception(mocker):
151174 ).return_value .get_client .return_value = mock_client
152175
153176 request = Request (scope = {"type" : "http" })
154- auth = ("user" , "token" , {})
177+
178+ # Authorization tuple required by URL endpoint handler
179+ auth : AuthTuple = ("test_user_id" , "test_user" , True , "test_token" )
155180
156181 with pytest .raises (HTTPException ) as e :
157182 await get_provider_endpoint_handler (
158183 request = request , provider_id = "openai" , auth = auth
159184 )
160185 assert e .value .status_code == status .HTTP_500_INTERNAL_SERVER_ERROR
161- assert "Unable to retrieve list of providers" in e .value .detail ["response" ]
186+ detail = e .value .detail
187+ assert isinstance (detail , dict )
188+ assert "Unable to retrieve list of providers" in detail ["response" ]
0 commit comments