60e0ffc959
Upgrade checks / Notify on failure (push) Has been cancelled
Upgrade checks / Close issue on success (push) Has been cancelled
Schema Crash Test / Real-world schema crash test (232K schemas) (push) Has been cancelled
Run static analysis / static_analysis (push) Has been cancelled
Tests / Tests: Python 3.10 on ubuntu-latest (push) Has been cancelled
Tests / Tests: Python 3.13 on ubuntu-latest (push) Has been cancelled
Tests / Tests: Python 3.10 on windows-latest (push) Has been cancelled
Tests / Tests with lowest-direct dependencies (push) Has been cancelled
Tests / MCP conformance tests (push) Has been cancelled
Tests / Integration tests (push) Has been cancelled
Tests / Package install smoke (push) Has been cancelled
Upgrade checks / Static analysis (push) Has been cancelled
Upgrade checks / Tests: Python 3.10 on ubuntu-latest (push) Has been cancelled
Upgrade checks / Tests: Python 3.13 on ubuntu-latest (push) Has been cancelled
Upgrade checks / Tests: Python 3.10 on windows-latest (push) Has been cancelled
Upgrade checks / Integration tests (push) Has been cancelled
Update MCPServerConfig Schema / update-config-schema (push) Has been cancelled
Update SDK Documentation / update-sdk-docs (push) Has been cancelled
196 lines
6.5 KiB
Python
196 lines
6.5 KiB
Python
"""Tests for CLI utility functions."""
|
|
|
|
from pathlib import Path
|
|
|
|
from fastmcp.utilities.mcp_server_config.v1.environments.uv import UVEnvironment
|
|
|
|
|
|
class TestEnvironmentBuildUVRunCommand:
|
|
"""Test the Environment.build_uv_run_command() method."""
|
|
|
|
def test_build_uv_run_command_basic(self):
|
|
"""Test building basic uv command with no environment config."""
|
|
env = UVEnvironment()
|
|
cmd = env.build_command(["fastmcp", "run", "server.py"])
|
|
# With no config, the command should be returned unchanged
|
|
expected = ["fastmcp", "run", "server.py"]
|
|
assert cmd == expected
|
|
|
|
def test_build_uv_run_command_with_editable(self):
|
|
"""Test building uv command with editable package."""
|
|
editable_path = Path("/path/to/package")
|
|
env = UVEnvironment(editable=[editable_path])
|
|
cmd = env.build_command(["fastmcp", "run", "server.py"])
|
|
expected = [
|
|
"uv",
|
|
"run",
|
|
"--with-editable",
|
|
str(editable_path.resolve()),
|
|
"fastmcp",
|
|
"run",
|
|
"server.py",
|
|
]
|
|
assert cmd == expected
|
|
|
|
def test_build_uv_run_command_with_packages(self):
|
|
"""Test building uv command with additional packages."""
|
|
env = UVEnvironment(dependencies=["pkg1", "pkg2"])
|
|
cmd = env.build_command(["fastmcp", "run", "server.py"])
|
|
expected = [
|
|
"uv",
|
|
"run",
|
|
"--with",
|
|
"pkg1",
|
|
"--with",
|
|
"pkg2",
|
|
"fastmcp",
|
|
"run",
|
|
"server.py",
|
|
]
|
|
assert cmd == expected
|
|
|
|
def test_build_uv_run_command_with_python_version(self):
|
|
"""Test building uv command with Python version."""
|
|
env = UVEnvironment(python="3.10")
|
|
cmd = env.build_command(["fastmcp", "run", "server.py"])
|
|
expected = [
|
|
"uv",
|
|
"run",
|
|
"--python",
|
|
"3.10",
|
|
"fastmcp",
|
|
"run",
|
|
"server.py",
|
|
]
|
|
assert cmd == expected
|
|
|
|
def test_build_uv_run_command_with_requirements(self):
|
|
"""Test building uv command with requirements file."""
|
|
requirements_path = Path("/path/to/requirements.txt")
|
|
env = UVEnvironment(requirements=requirements_path)
|
|
cmd = env.build_command(["fastmcp", "run", "server.py"])
|
|
expected = [
|
|
"uv",
|
|
"run",
|
|
"--with-requirements",
|
|
str(requirements_path.resolve()),
|
|
"fastmcp",
|
|
"run",
|
|
"server.py",
|
|
]
|
|
assert cmd == expected
|
|
|
|
def test_build_uv_run_command_with_project(self):
|
|
"""Test building uv command with project directory."""
|
|
project_path = Path("/path/to/project")
|
|
env = UVEnvironment(project=project_path)
|
|
cmd = env.build_command(["fastmcp", "run", "server.py"])
|
|
expected = [
|
|
"uv",
|
|
"run",
|
|
"--project",
|
|
str(project_path.resolve()),
|
|
"fastmcp",
|
|
"run",
|
|
"server.py",
|
|
]
|
|
assert cmd == expected
|
|
|
|
def test_build_uv_run_command_with_everything(self):
|
|
"""Test building uv command with all options."""
|
|
requirements_path = Path("/path/to/requirements.txt")
|
|
editable_path = Path("/local/pkg")
|
|
env = UVEnvironment(
|
|
python="3.10",
|
|
dependencies=["pandas", "numpy"],
|
|
requirements=requirements_path,
|
|
editable=[editable_path],
|
|
)
|
|
cmd = env.build_command(["fastmcp", "run", "server.py"])
|
|
expected = [
|
|
"uv",
|
|
"run",
|
|
"--python",
|
|
"3.10",
|
|
"--with",
|
|
"numpy",
|
|
"--with",
|
|
"pandas",
|
|
"--with-requirements",
|
|
str(requirements_path.resolve()),
|
|
"--with-editable",
|
|
str(editable_path.resolve()),
|
|
"fastmcp",
|
|
"run",
|
|
"server.py",
|
|
]
|
|
assert cmd == expected
|
|
|
|
# Note: These tests are removed because build_uv_run_command now requires a command
|
|
# and only accepts a list, not optional or string commands
|
|
|
|
def test_build_uv_run_command_project_with_extras(self):
|
|
"""Test that project flag works with additional dependencies."""
|
|
project_path = Path("/path/to/project")
|
|
editable_path = Path("/pkg")
|
|
env = UVEnvironment(
|
|
project=project_path,
|
|
python="3.10", # Should be ignored with project
|
|
dependencies=["pandas"], # Should be added on top of project
|
|
editable=[editable_path], # Should be added on top of project
|
|
)
|
|
cmd = env.build_command(["fastmcp", "run", "server.py"])
|
|
expected = [
|
|
"uv",
|
|
"run",
|
|
"--project",
|
|
str(project_path.resolve()),
|
|
"--with",
|
|
"pandas",
|
|
"--with-editable",
|
|
str(editable_path.resolve()),
|
|
"fastmcp",
|
|
"run",
|
|
"server.py",
|
|
]
|
|
assert cmd == expected
|
|
|
|
|
|
class TestEnvironmentNeedsUV:
|
|
"""Test the Environment.needs_uv() method."""
|
|
|
|
def test_needs_uv_with_python(self):
|
|
"""Test that needs_uv returns True with Python version."""
|
|
env = UVEnvironment(python="3.10")
|
|
assert env._must_run_with_uv() is True
|
|
|
|
def test_needs_uv_with_dependencies(self):
|
|
"""Test that needs_uv returns True with dependencies."""
|
|
env = UVEnvironment(dependencies=["pandas"])
|
|
assert env._must_run_with_uv() is True
|
|
|
|
def test_needs_uv_with_requirements(self):
|
|
"""Test that needs_uv returns True with requirements."""
|
|
env = UVEnvironment(requirements=Path("/path/to/requirements.txt"))
|
|
assert env._must_run_with_uv() is True
|
|
|
|
def test_needs_uv_with_project(self):
|
|
"""Test that needs_uv returns True with project."""
|
|
env = UVEnvironment(project=Path("/path/to/project"))
|
|
assert env._must_run_with_uv() is True
|
|
|
|
def test_needs_uv_with_editable(self):
|
|
"""Test that needs_uv returns True with editable."""
|
|
env = UVEnvironment(editable=[Path("/pkg")])
|
|
assert env._must_run_with_uv() is True
|
|
|
|
def test_needs_uv_empty(self):
|
|
"""Test that needs_uv returns False with empty config."""
|
|
env = UVEnvironment()
|
|
assert env._must_run_with_uv() is False
|
|
|
|
def test_needs_uv_with_empty_lists(self):
|
|
"""Test that needs_uv returns False with empty lists."""
|
|
env = UVEnvironment(dependencies=None, editable=None)
|
|
assert env._must_run_with_uv() is False
|