1919import asyncio
2020from datetime import datetime , timezone
2121from unittest .mock import AsyncMock , MagicMock , Mock , patch
22+ import socket
2223
2324# Third-Party
2425import httpx
@@ -172,12 +173,13 @@ async def test_register_gateway(self, gateway_service, test_db, monkeypatch):
172173 )
173174 )
174175 gateway_service ._notify_gateway_added = AsyncMock ()
175-
176+ normalize_url = lambda url : f"http://{ socket .gethostbyname (url )} /gateway"
177+ url = normalize_url ("example.com" )
176178 # Patch GatewayRead.model_validate to return a mock with .masked()
177179 mock_model = Mock ()
178180 mock_model .masked .return_value = mock_model
179181 mock_model .name = "test_gateway"
180- mock_model .url = "http://example.com/gateway"
182+ mock_model .url = url
181183 mock_model .description = "A test gateway"
182184
183185 monkeypatch .setattr (
@@ -187,7 +189,7 @@ async def test_register_gateway(self, gateway_service, test_db, monkeypatch):
187189
188190 gateway_create = GatewayCreate (
189191 name = "test_gateway" ,
190- url = "http://example.com/gateway" ,
192+ url = url ,
191193 description = "A test gateway" ,
192194 )
193195
@@ -202,9 +204,10 @@ async def test_register_gateway(self, gateway_service, test_db, monkeypatch):
202204 # `result` is the same GatewayCreate instance because we stubbed
203205 # GatewayRead.model_validate → just check its fields:
204206 assert result .name == "test_gateway"
205- assert result .url == "http://example.com/gateway"
207+ expected_url = url
208+ assert result .url == expected_url
206209 assert result .description == "A test gateway"
207-
210+ mock_model . url = expected_url
208211 @pytest .mark .asyncio
209212 async def test_register_gateway_name_conflict (self , gateway_service , mock_gateway , test_db ):
210213 """Trying to register a gateway whose *name* already exists raises a conflict error."""
@@ -229,7 +232,6 @@ async def test_register_gateway_name_conflict(self, gateway_service, mock_gatewa
229232 async def test_register_gateway_connection_error (self , gateway_service , test_db ):
230233 """Initial connection to the remote gateway fails and the error propagates."""
231234 test_db .execute = Mock (return_value = _make_execute_result (scalar = None ))
232-
233235 # _initialize_gateway blows up before any DB work happens
234236 gateway_service ._initialize_gateway = AsyncMock (side_effect = GatewayConnectionError ("Failed to connect" ))
235237
@@ -257,28 +259,39 @@ async def test_register_gateway_with_auth(self, gateway_service, test_db, monkey
257259 test_db .commit = Mock ()
258260 test_db .refresh = Mock ()
259261
262+ #url = f"http://{socket.gethostbyname('example.com')}/gateway"
263+ normalize_url = lambda url : f"http://{ socket .gethostbyname (url )} /gateway"
264+ url = normalize_url ("example.com" )
265+ print (f"url:{ url } " )
260266 gateway_service ._initialize_gateway = AsyncMock (
261267 return_value = (
262268 {
263- "prompts" : {"listChanged" : True },
264269 "resources" : {"listChanged" : True },
265270 "tools" : {"listChanged" : True },
266271 },
267272 [],
268273 )
269274 )
275+
270276 gateway_service ._notify_gateway_added = AsyncMock ()
271277
272278 mock_model = Mock ()
273279 mock_model .masked .return_value = mock_model
274280 mock_model .name = "auth_gateway"
281+ mock_model .url = url
275282
276283 monkeypatch .setattr (
277284 "mcpgateway.services.gateway_service.GatewayRead.model_validate" ,
278285 lambda x : mock_model ,
279286 )
280287
281- gateway_create = GatewayCreate (name = "auth_gateway" , url = "http://example.com/gateway" , description = "Gateway with auth" , auth_type = "bearer" , auth_token = "test-token" )
288+ gateway_create = GatewayCreate (
289+ name = "auth_gateway" ,
290+ url = url ,
291+ description = "Gateway with auth" ,
292+ auth_type = "bearer" ,
293+ auth_token = "test-token"
294+ )
282295
283296 await gateway_service .register_gateway (test_db , gateway_create )
284297
@@ -973,16 +986,16 @@ async def test_update_gateway_url_change_with_tools(self, gateway_service, mock_
973986
974987 gateway_service ._initialize_gateway = AsyncMock (return_value = ({"tools" : {"listChanged" : True }}, new_tools ))
975988 gateway_service ._notify_gateway_updated = AsyncMock ()
976-
977- gateway_update = GatewayUpdate (url = "http://example.com/new- url" )
989+ url = GatewayService . normalize_url ( "http://example.com/new-url" )
990+ gateway_update = GatewayUpdate (url = url )
978991
979992 mock_gateway_read = MagicMock ()
980993 mock_gateway_read .masked .return_value = mock_gateway_read
981994
982995 with patch ("mcpgateway.services.gateway_service.GatewayRead.model_validate" , return_value = mock_gateway_read ):
983996 await gateway_service .update_gateway (test_db , 1 , gateway_update )
984997
985- assert mock_gateway .url == "http://example.com/new- url"
998+ assert mock_gateway .url == url
986999 gateway_service ._initialize_gateway .assert_called_once ()
9871000 test_db .commit .assert_called_once ()
9881001
@@ -997,8 +1010,8 @@ async def test_update_gateway_url_initialization_failure(self, gateway_service,
9971010 # Mock initialization failure
9981011 gateway_service ._initialize_gateway = AsyncMock (side_effect = GatewayConnectionError ("Connection failed" ))
9991012 gateway_service ._notify_gateway_updated = AsyncMock ()
1000-
1001- gateway_update = GatewayUpdate (url = "http://example.com/bad- url" )
1013+ url = GatewayService . normalize_url ( "http://example.com/bad-url" )
1014+ gateway_update = GatewayUpdate (url = url )
10021015
10031016 mock_gateway_read = MagicMock ()
10041017 mock_gateway_read .masked .return_value = mock_gateway_read
@@ -1007,7 +1020,7 @@ async def test_update_gateway_url_initialization_failure(self, gateway_service,
10071020 with patch ("mcpgateway.services.gateway_service.GatewayRead.model_validate" , return_value = mock_gateway_read ):
10081021 await gateway_service .update_gateway (test_db , 1 , gateway_update )
10091022
1010- assert mock_gateway .url == "http://example.com/bad- url"
1023+ assert mock_gateway .url == url
10111024 test_db .commit .assert_called_once ()
10121025
10131026 @pytest .mark .asyncio
0 commit comments