|
1 | | -from unittest.mock import Mock, patch |
| 1 | +from unittest.mock import AsyncMock, Mock, patch |
2 | 2 |
|
3 | 3 | import pytest |
4 | 4 | from pytest_httpx import HTTPXMock |
5 | 5 |
|
6 | 6 | from uipath.platform import UiPathApiConfig, UiPathExecutionContext |
| 7 | +from uipath.platform.common._bindings import ( |
| 8 | + GenericResourceOverwrite, |
| 9 | + _resource_overwrites, |
| 10 | +) |
7 | 11 | from uipath.platform.constants import HEADER_FOLDER_KEY, HEADER_USER_AGENT |
8 | 12 | from uipath.platform.orchestrator import McpService |
9 | 13 | from uipath.platform.orchestrator._folder_service import FolderService |
@@ -363,6 +367,77 @@ async def test_retrieve_server_async( |
363 | 367 | == f"UiPath.Python.Sdk/UiPath.Python.Sdk.Activities.McpService.retrieve_async/{version}" |
364 | 368 | ) |
365 | 369 |
|
| 370 | + def test_retrieve_server_by_name(self, service: McpService) -> None: |
| 371 | + response = Mock() |
| 372 | + response.json.return_value = { |
| 373 | + "name": "Friendly MCP/Europe", |
| 374 | + "slug": "friendly-mcp-europe", |
| 375 | + } |
| 376 | + |
| 377 | + with patch.object(service, "request", return_value=response) as request: |
| 378 | + server = service.retrieve("Friendly MCP/Europe") |
| 379 | + |
| 380 | + assert server.name == "Friendly MCP/Europe" |
| 381 | + assert "api/servers/Friendly%20MCP%2FEurope" in str( |
| 382 | + request.call_args.kwargs["url"] |
| 383 | + ) |
| 384 | + |
| 385 | + def test_retrieve_applies_display_name_binding( |
| 386 | + self, service: McpService |
| 387 | + ) -> None: |
| 388 | + response = Mock() |
| 389 | + response.json.return_value = { |
| 390 | + "name": "Replacement MCP", |
| 391 | + "slug": "replacement-mcp", |
| 392 | + } |
| 393 | + overwrite = GenericResourceOverwrite( |
| 394 | + resource_type="mcpServer", |
| 395 | + name="Replacement MCP", |
| 396 | + folder_path="Replacement Folder", |
| 397 | + ) |
| 398 | + token = _resource_overwrites.set({"mcpServer.Original MCP": overwrite}) |
| 399 | + |
| 400 | + try: |
| 401 | + with ( |
| 402 | + patch.object(service, "request", return_value=response) as request, |
| 403 | + patch.object( |
| 404 | + service._folders_service, |
| 405 | + "retrieve_folder_key", |
| 406 | + return_value="replacement-folder-key", |
| 407 | + ), |
| 408 | + ): |
| 409 | + service.retrieve("Original MCP") |
| 410 | + finally: |
| 411 | + _resource_overwrites.reset(token) |
| 412 | + |
| 413 | + assert "api/servers/Replacement%20MCP" in str( |
| 414 | + request.call_args.kwargs["url"] |
| 415 | + ) |
| 416 | + assert ( |
| 417 | + request.call_args.kwargs["headers"][HEADER_FOLDER_KEY] |
| 418 | + == "replacement-folder-key" |
| 419 | + ) |
| 420 | + |
| 421 | + @pytest.mark.anyio |
| 422 | + async def test_retrieve_server_by_name_async(self, service: McpService) -> None: |
| 423 | + response = Mock() |
| 424 | + response.json.return_value = { |
| 425 | + "name": "Friendly MCP/Europe", |
| 426 | + "slug": "friendly-mcp-europe", |
| 427 | + } |
| 428 | + |
| 429 | + with patch.object( |
| 430 | + service, |
| 431 | + "request_async", |
| 432 | + new=AsyncMock(return_value=response), |
| 433 | + ) as request: |
| 434 | + server = await service.retrieve_async("Friendly MCP/Europe") |
| 435 | + |
| 436 | + assert server.name == "Friendly MCP/Europe" |
| 437 | + assert "api/servers/Friendly%20MCP%2FEurope" in str( |
| 438 | + request.call_args.kwargs["url"] |
| 439 | + ) |
| 440 | + |
366 | 441 | class TestRequestKwargs: |
367 | 442 | """Test that all methods pass the correct kwargs to request/request_async.""" |
368 | 443 |
|
@@ -569,3 +644,9 @@ def test_validate_swagger_server(self) -> None: |
569 | 644 | ) |
570 | 645 | assert server.type == 7 |
571 | 646 | assert server.slug == "contoso-directory" |
| 647 | + |
| 648 | + |
| 649 | +def test_mcp_retrieve_spec_encodes_display_name(service: McpService) -> None: |
| 650 | + spec = service._retrieve_spec(name="Friendly MCP/Europe", folder_path=None) |
| 651 | + |
| 652 | + assert "api/servers/Friendly%20MCP%2FEurope" in str(spec.endpoint) |
0 commit comments