1- from unittest .mock import Mock , patch
1+ from unittest .mock import AsyncMock , Mock , patch
22
33import pytest
44from pytest_httpx import HTTPXMock
55
66from uipath .platform import UiPathApiConfig , UiPathExecutionContext
7+ from uipath .platform .common ._bindings import (
8+ GenericResourceOverwrite ,
9+ _resource_overwrites ,
10+ )
711from uipath .platform .constants import HEADER_FOLDER_KEY , HEADER_USER_AGENT
812from uipath .platform .orchestrator import McpService
913from uipath .platform .orchestrator ._folder_service import FolderService
@@ -266,7 +270,9 @@ def test_retrieve_server_with_folder_path(
266270 json = mock_server ,
267271 )
268272
269- server = service .retrieve ("test-mcp-server" , folder_path = "test-folder-path" )
273+ server = service .retrieve (
274+ slug = "test-mcp-server" , folder_path = "test-folder-path"
275+ )
270276
271277 assert isinstance (server , McpServer )
272278 assert server .name == "Test MCP Server"
@@ -340,7 +346,7 @@ async def test_retrieve_server_async(
340346 )
341347
342348 server = await service .retrieve_async (
343- "async-test-server" , folder_path = "test-folder-path"
349+ slug = "async-test-server" , folder_path = "test-folder-path"
344350 )
345351
346352 assert isinstance (server , McpServer )
@@ -363,6 +369,113 @@ async def test_retrieve_server_async(
363369 == f"UiPath.Python.Sdk/UiPath.Python.Sdk.Activities.McpService.retrieve_async/{ version } "
364370 )
365371
372+ def test_retrieve_server_by_name (self , service : McpService ) -> None :
373+ response = Mock ()
374+ response .json .return_value = {
375+ "name" : "Friendly MCP/Europe" ,
376+ "slug" : "friendly-mcp-europe" ,
377+ }
378+
379+ with patch .object (service , "request" , return_value = response ) as request :
380+ server = service .retrieve (name = "Friendly MCP/Europe" )
381+
382+ assert server .name == "Friendly MCP/Europe"
383+ assert "api/servers/Friendly%20MCP%2FEurope" in str (
384+ request .call_args .kwargs ["url" ]
385+ )
386+
387+ def test_retrieve_applies_display_name_binding (
388+ self , service : McpService
389+ ) -> None :
390+ response = Mock ()
391+ response .json .return_value = {
392+ "name" : "Replacement MCP" ,
393+ "slug" : "replacement-mcp" ,
394+ }
395+ overwrite = GenericResourceOverwrite (
396+ resource_type = "mcpServer" ,
397+ name = "Replacement MCP" ,
398+ folder_path = "Replacement Folder" ,
399+ )
400+ token = _resource_overwrites .set ({"mcpServer.Original MCP" : overwrite })
401+
402+ try :
403+ with (
404+ patch .object (service , "request" , return_value = response ) as request ,
405+ patch .object (
406+ service ._folders_service ,
407+ "retrieve_folder_key" ,
408+ return_value = "replacement-folder-key" ,
409+ ),
410+ ):
411+ service .retrieve (name = "Original MCP" )
412+ finally :
413+ _resource_overwrites .reset (token )
414+
415+ assert "api/servers/Replacement%20MCP" in str (
416+ request .call_args .kwargs ["url" ]
417+ )
418+ assert (
419+ request .call_args .kwargs ["headers" ][HEADER_FOLDER_KEY ]
420+ == "replacement-folder-key"
421+ )
422+
423+ def test_retrieve_applies_legacy_slug_binding (
424+ self , service : McpService
425+ ) -> None :
426+ response = Mock ()
427+ response .json .return_value = {
428+ "name" : "Replacement MCP" ,
429+ "slug" : "replacement-mcp" ,
430+ }
431+ overwrite = GenericResourceOverwrite (
432+ resource_type = "mcpServer" ,
433+ name = "Replacement MCP" ,
434+ folder_path = "Replacement Folder" ,
435+ )
436+ token = _resource_overwrites .set ({"mcpServer.original-mcp" : overwrite })
437+
438+ try :
439+ with (
440+ patch .object (service , "request" , return_value = response ) as request ,
441+ patch .object (
442+ service ._folders_service ,
443+ "retrieve_folder_key" ,
444+ return_value = "replacement-folder-key" ,
445+ ),
446+ ):
447+ service .retrieve (slug = "original-mcp" )
448+ finally :
449+ _resource_overwrites .reset (token )
450+
451+ assert "api/servers/Replacement%20MCP" in str (
452+ request .call_args .kwargs ["url" ]
453+ )
454+ assert (
455+ request .call_args .kwargs ["headers" ][HEADER_FOLDER_KEY ]
456+ == "replacement-folder-key"
457+ )
458+
459+ @pytest .mark .anyio
460+ async def test_retrieve_server_by_name_async (self , service : McpService ) -> None :
461+ response = Mock ()
462+ response .json .return_value = {
463+ "name" : "Friendly MCP/Europe" ,
464+ "slug" : "friendly-mcp-europe" ,
465+ }
466+
467+ with patch .object (
468+ service ,
469+ "request_async" ,
470+ new = AsyncMock (return_value = response ),
471+ ) as request :
472+ server = await service .retrieve_async (name = "Friendly MCP/Europe" )
473+
474+ assert server .name == "Friendly MCP/Europe"
475+ assert "api/servers/Friendly%20MCP%2FEurope" in str (
476+ request .call_args .kwargs ["url" ]
477+ )
478+
366479 class TestRequestKwargs :
367480 """Test that all methods pass the correct kwargs to request/request_async."""
368481
@@ -569,3 +682,9 @@ def test_validate_swagger_server(self) -> None:
569682 )
570683 assert server .type == 7
571684 assert server .slug == "contoso-directory"
685+
686+
687+ def test_mcp_retrieve_spec_encodes_display_name (service : McpService ) -> None :
688+ spec = service ._retrieve_spec (name = "Friendly MCP/Europe" , folder_path = None )
689+
690+ assert "api/servers/Friendly%20MCP%2FEurope" in str (spec .endpoint )
0 commit comments