Skip to content

Commit fca2085

Browse files
authored
feat: pytest settings (#4)
* Add: pytest settings * Update pyproject.toml
1 parent 4cc5a6a commit fca2085

File tree

7 files changed

+125
-1
lines changed

7 files changed

+125
-1
lines changed

pyproject.toml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,22 @@ dependencies = [
1010
"pydantic>=2.11.7",
1111
]
1212

13+
[project.dependency-group]
14+
test = [
15+
"pytest>=8.4.1",
16+
]
17+
18+
1319
[build-system]
1420
requires = ["hatchling"]
1521
build-backend = "hatchling.build"
1622

1723
[tool.hatch.build.targets.wheel]
18-
packages = ["src/openstack_mcp_server"]
24+
packages = ["src/openstack_mcp_server"]
25+
26+
[tool.pytest.ini_options]
27+
testpaths = ["tests"]
28+
29+
python_files = ["test_*.py", "*_test.py"]
30+
python_classes = ["Test*"]
31+
python_functions = ["test_*"]

tests/__init__.py

Whitespace-only changes.

tests/conftest.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import pytest
2+
from unittest.mock import Mock, patch
3+
4+
5+
@pytest.fixture
6+
def mock_openstack_logging():
7+
"""Mock openstack.enable_logging function."""
8+
with patch('openstack_mcp_server.tools.nova_tools.openstack.enable_logging') as mock:
9+
yield mock
10+
11+
12+
@pytest.fixture
13+
def mock_openstack_connect():
14+
"""Mock openstack.connect function."""
15+
with patch('openstack_mcp_server.tools.nova_tools.openstack.connect') as mock:
16+
yield mock
17+
18+
19+
@pytest.fixture
20+
def mock_openstack_connection():
21+
"""Mock openstack connection object."""
22+
mock_conn = Mock()
23+
with patch('openstack_mcp_server.tools.nova_tools.openstack.connect', return_value=mock_conn) as mock_connect:
24+
yield mock_conn, mock_connect
25+
26+
27+
@pytest.fixture
28+
def mock_server():
29+
"""Create a mock server object."""
30+
def _create_server(name="test-server", server_id="test-id", status="ACTIVE"):
31+
mock = Mock()
32+
mock.name = name
33+
mock.id = server_id
34+
mock.status = status
35+
return mock
36+
return _create_server
37+
38+
39+
@pytest.fixture
40+
def sample_servers(mock_server):
41+
"""Create sample server list."""
42+
return [
43+
mock_server("server1", "id1", "ACTIVE"),
44+
mock_server("server2", "id2", "STOPPED")
45+
]
46+
47+
48+
@pytest.fixture
49+
def mock_fastmcp():
50+
"""Mock FastMCP instance."""
51+
return Mock()

tests/prompts/__init__.py

Whitespace-only changes.

tests/resources/__init__.py

Whitespace-only changes.

tests/tools/__init__.py

Whitespace-only changes.

tests/tools/test_nova_tools.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import pytest
2+
from openstack_mcp_server.tools.nova_tools import NovaTools
3+
4+
5+
class TestNovaTools:
6+
def test_register_tools(self, mock_fastmcp):
7+
"""Test that tools are properly registered with FastMCP."""
8+
# Arrange
9+
nova_tools = NovaTools()
10+
11+
# Act
12+
nova_tools.register_tools(mock_fastmcp)
13+
14+
# Assert
15+
mock_fastmcp.tool.assert_called_once()
16+
mock_fastmcp.tool().assert_called_once_with(nova_tools.get_nova_servers)
17+
18+
def test_get_nova_servers(self, mock_openstack_logging, mock_openstack_connect, sample_servers):
19+
"""Test getting Nova servers list."""
20+
# Arrange
21+
mock_conn = mock_openstack_connect.return_value
22+
mock_conn.list_servers.return_value = sample_servers
23+
nova_tools = NovaTools()
24+
25+
# Act
26+
result = nova_tools.get_nova_servers()
27+
28+
# Assert
29+
expected = "server1 (id1) - Status: ACTIVE\nserver2 (id2) - Status: STOPPED"
30+
assert result == expected
31+
mock_openstack_logging.assert_called_once_with(debug=True)
32+
mock_openstack_connect.assert_called_once_with(cloud='openstack')
33+
34+
def test_get_nova_servers_empty_list(self, mock_openstack_logging, mock_openstack_connect):
35+
"""Test getting Nova servers when no servers exist."""
36+
# Arrange
37+
mock_conn = mock_openstack_connect.return_value
38+
mock_conn.list_servers.return_value = []
39+
nova_tools = NovaTools()
40+
41+
# Act
42+
result = nova_tools.get_nova_servers()
43+
44+
# Assert
45+
assert result == ""
46+
47+
def test_get_nova_servers_single_server(self, mock_openstack_connection, mock_server):
48+
"""Test getting single Nova server."""
49+
# Arrange
50+
mock_conn, mock_connect = mock_openstack_connection
51+
test_server = mock_server("web-server", "web-001", "BUILDING")
52+
mock_conn.list_servers.return_value = [test_server]
53+
nova_tools = NovaTools()
54+
55+
# Act
56+
result = nova_tools.get_nova_servers()
57+
58+
# Assert
59+
expected = "web-server (web-001) - Status: BUILDING"
60+
assert result == expected

0 commit comments

Comments
 (0)