Skip to content

Commit 77675e6

Browse files
committed
ci: add cloud for integration tests
1 parent dff1028 commit 77675e6

File tree

6 files changed

+3223
-1648
lines changed

6 files changed

+3223
-1648
lines changed

.github/workflows/integration_tests.yml

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@ jobs:
1919
steps:
2020
- name: Checkout code
2121
uses: actions/checkout@v4
22-
22+
2323
- name: Discover testcases
2424
id: discover
2525
run: |
2626
# Find all testcase folders (excluding common folders like README, etc.)
2727
testcase_dirs=$(find testcases -maxdepth 1 -type d -name "*-*" | sed 's|testcases/||' | sort)
28-
28+
2929
echo "Found testcase directories:"
3030
echo "$testcase_dirs"
31-
31+
3232
# Convert to JSON array for matrix
3333
testcases_json=$(echo "$testcase_dirs" | jq -R -s -c 'split("\n")[:-1]')
3434
echo "testcases=$testcases_json" >> $GITHUB_OUTPUT
@@ -42,10 +42,10 @@ jobs:
4242
fail-fast: false
4343
matrix:
4444
testcase: ${{ fromJson(needs.discover-testcases.outputs.testcases) }}
45-
environment: [alpha]
46-
45+
environment: [alpha, cloud] # temporary disable staging
46+
4747
name: "${{ matrix.testcase }} / ${{ matrix.environment }}"
48-
48+
4949
steps:
5050
- name: Checkout code
5151
uses: actions/checkout@v4
@@ -55,19 +55,18 @@ jobs:
5555

5656
- name: Run testcase
5757
env:
58-
UIPATH_TENANT_ID: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TENANT_ID || secrets.CLOUD_TENANT_ID }}
59-
UIPATH_FOLDER_KEY: ${{ matrix.environment == 'alpha' && secrets.ALPHA_FOLDER_KEY || secrets.CLOUD_FOLDER_KEY }}
60-
PAT_TOKEN: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TEST_PAT_TOKEN || secrets.CLOUD_TEST_PAT_TOKEN }}
61-
CLIENT_ID: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TEST_CLIENT_ID || secrets.CLOUD_TEST_CLIENT_ID }}
62-
CLIENT_SECRET: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TEST_CLIENT_SECRET || secrets.CLOUD_TEST_CLIENT_SECRET }}
63-
BASE_URL: ${{ matrix.environment == 'alpha' && secrets.ALPHA_BASE_URL || secrets.CLOUD_BASE_URL }}
58+
UIPATH_TENANT_ID: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TENANT_ID || matrix.environment == 'staging' && secrets.STAGING_TENANT_ID || matrix.environment == 'cloud' && secrets.CLOUD_TENANT_ID }}
59+
UIPATH_FOLDER_KEY: ${{ matrix.environment == 'alpha' && secrets.ALPHA_FOLDER_KEY || matrix.environment == 'staging' && secrets.STAGING_FOLDER_KEY || matrix.environment == 'cloud' && secrets.CLOUD_FOLDER_KEY }}
60+
CLIENT_ID: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TEST_CLIENT_ID || matrix.environment == 'staging' && secrets.STAGING_TEST_CLIENT_ID || matrix.environment == 'cloud' && secrets.CLOUD_TEST_CLIENT_ID }}
61+
CLIENT_SECRET: ${{ matrix.environment == 'alpha' && secrets.ALPHA_TEST_CLIENT_SECRET || matrix.environment == 'staging' && secrets.STAGING_TEST_CLIENT_SECRET || matrix.environment == 'cloud' && secrets.CLOUD_TEST_CLIENT_SECRET }}
62+
BASE_URL: ${{ matrix.environment == 'alpha' && secrets.ALPHA_BASE_URL || matrix.environment == 'staging' && secrets.STAGING_BASE_URL || matrix.environment == 'cloud' && secrets.CLOUD_BASE_URL }}
6463
GITHUB_PR_NUMBER: ${{ github.event.pull_request.number }}
6564
GITHUB_RUN_ID: ${{ github.run_number }}
6665
working-directory: testcases/${{ matrix.testcase }}
6766
run: |
6867
echo "Running testcase: ${{ matrix.testcase }}"
6968
echo "Environment: ${{ matrix.environment }}"
7069
echo "Working directory: $(pwd)"
71-
70+
7271
# Execute the testcase run script directly
73-
bash run.sh
72+
bash run.sh

testcases/ground-to-cloud/mcp.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
{
2-
"servers": {
3-
"mathmcp-PRNUMBER": {
4-
"transport": "stdio",
5-
"command": "python",
6-
"args": ["server.py"]
7-
}
8-
}
9-
}
1+
{
2+
"servers": {
3+
"mathmcp-155": {
4+
"transport": "stdio",
5+
"command": "python",
6+
"args": ["server.py"]
7+
}
8+
}
9+
}

testcases/ground-to-cloud/test.py

Lines changed: 75 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,76 @@
1-
import asyncio
2-
import os
3-
import sys
4-
5-
from dotenv import load_dotenv
6-
from mcp.client.session import ClientSession
7-
from mcp.client.streamable_http import streamablehttp_client
8-
from retry import retry
9-
10-
11-
def get_required_env_var(name: str) -> str:
12-
"""Get required environment variable or raise an error if not set."""
13-
value = os.getenv(name)
14-
if not value:
15-
raise ValueError(f"Required environment variable {name} is not set")
16-
return value
17-
18-
@retry(tries=3, delay=2, backoff=2)
19-
async def call_add_tool():
20-
# Load configuration from environment variables
21-
base_url = get_required_env_var("BASE_URL")
22-
folder_key = get_required_env_var("UIPATH_FOLDER_KEY")
23-
token = get_required_env_var("UIPATH_ACCESS_TOKEN")
24-
mcp_server_name = get_required_env_var("MCP_SERVER_NAME")
25-
26-
# Construct the MCP server URL
27-
mcp_url = f"{base_url}/agenthub_/mcp/{folder_key}/{mcp_server_name}"
28-
29-
try:
30-
# Use streamable HTTP client to connect to the MCP server
31-
async with streamablehttp_client(mcp_url, headers={ 'Authorization': f'Bearer {token}' }) as (read_stream, write_stream, _):
32-
async with ClientSession(read_stream, write_stream) as session:
33-
# Initialize the session
34-
await session.initialize()
35-
36-
# List available tools
37-
tools_result = await session.list_tools()
38-
available_tools = [tool.name for tool in tools_result.tools]
39-
expected_available_tools = [
40-
"add", "subtract", "multiply", "divide", "power", "square_root", "nth_root",
41-
"sin", "cos", "tan", "log10", "natural_log", "log_base", "mean", "median", "standard_deviation",
42-
"complex_add", "complex_multiply", "convert_temperature", "solve_quadratic", "get_constants"
43-
]
44-
45-
print (f"Available tools: {available_tools}")
46-
47-
if set(available_tools) != set(expected_available_tools):
48-
raise AssertionError(f"Tool sets don't match. Expected: {set(expected_available_tools)}, Got: {set(available_tools)}")
49-
50-
# Call the add tool directly
51-
call_tool_result = await session.call_tool(name="add", arguments={"a": 7, "b": 5})
52-
53-
expected_result = "12.0"
54-
actual_result = call_tool_result.content[0].text if call_tool_result.content else None
55-
56-
if actual_result != expected_result:
57-
raise AssertionError(f"Expected {expected_result}, got {actual_result}")
58-
59-
print("Test completed successfully")
60-
except Exception as e:
61-
print(f"Unexpected error connecting to MCP server: {e}")
62-
raise AssertionError(f"Connection error, {e}") from e
63-
64-
async def main():
65-
"""Main async function to run the test."""
66-
try:
67-
load_dotenv()
68-
69-
await call_add_tool()
70-
except Exception as e:
71-
print(f"Test failed with error: {e}")
72-
sys.exit(1)
73-
74-
75-
if __name__ == '__main__':
1+
import asyncio
2+
import os
3+
import sys
4+
5+
from dotenv import load_dotenv
6+
from mcp.client.session import ClientSession
7+
from mcp.client.streamable_http import streamablehttp_client
8+
from retry import retry
9+
10+
11+
def get_required_env_var(name: str) -> str:
12+
"""Get required environment variable or raise an error if not set."""
13+
value = os.getenv(name)
14+
if not value:
15+
raise ValueError(f"Required environment variable {name} is not set")
16+
return value
17+
18+
@retry(tries=3, delay=2, backoff=2)
19+
async def call_add_tool():
20+
# Load configuration from environment variables
21+
base_url = get_required_env_var("BASE_URL")
22+
folder_key = get_required_env_var("UIPATH_FOLDER_KEY")
23+
token = get_required_env_var("UIPATH_ACCESS_TOKEN")
24+
mcp_server_name = get_required_env_var("MCP_SERVER_NAME")
25+
26+
# Construct the MCP server URL
27+
mcp_url = f"{base_url}/agenthub_/mcp/{folder_key}/{mcp_server_name}"
28+
29+
try:
30+
# Use streamable HTTP client to connect to the MCP server
31+
async with streamablehttp_client(mcp_url, headers={ 'Authorization': f'Bearer {token}' }) as (read_stream, write_stream, _):
32+
async with ClientSession(read_stream, write_stream) as session:
33+
# Initialize the session
34+
await session.initialize()
35+
36+
# List available tools
37+
tools_result = await session.list_tools()
38+
available_tools = [tool.name for tool in tools_result.tools]
39+
expected_available_tools = [
40+
"add", "subtract", "multiply", "divide", "power", "square_root", "nth_root",
41+
"sin", "cos", "tan", "log10", "natural_log", "log_base", "mean", "median", "standard_deviation",
42+
"complex_add", "complex_multiply", "convert_temperature", "solve_quadratic", "get_constants"
43+
]
44+
45+
print (f"Available tools: {available_tools}")
46+
47+
if set(available_tools) != set(expected_available_tools):
48+
raise AssertionError(f"Tool sets don't match. Expected: {set(expected_available_tools)}, Got: {set(available_tools)}")
49+
50+
# Call the add tool directly
51+
call_tool_result = await session.call_tool(name="add", arguments={"a": 7, "b": 5})
52+
53+
expected_result = "12.0"
54+
actual_result = call_tool_result.content[0].text if call_tool_result.content else None
55+
56+
if actual_result != expected_result:
57+
raise AssertionError(f"Expected {expected_result}, got {actual_result}")
58+
59+
print("Test completed successfully")
60+
except Exception as e:
61+
print(f"Unexpected error connecting to MCP server: {e}")
62+
raise AssertionError(f"Connection error, {e}") from e
63+
64+
async def main():
65+
"""Main async function to run the test."""
66+
try:
67+
load_dotenv()
68+
69+
await call_add_tool()
70+
except Exception as e:
71+
print(f"Test failed with error: {e}")
72+
sys.exit(1)
73+
74+
75+
if __name__ == '__main__':
7676
asyncio.run(main())
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
{
2-
"entryPoints": [
3-
{
4-
"filePath": "mathmcp-PRNUMBER",
5-
"uniqueId": "163f06b8-31e6-4639-aa31-ae4a88968a92",
6-
"type": "mcpserver",
7-
"input": {},
8-
"output": {}
9-
}
10-
]
11-
}
1+
{
2+
"entryPoints": [
3+
{
4+
"filePath": "mathmcp-155",
5+
"uniqueId": "163f06b8-31e6-4639-aa31-ae4a88968a92",
6+
"type": "mcpserver",
7+
"input": {},
8+
"output": {}
9+
}
10+
]
11+
}

0 commit comments

Comments
 (0)