Skip to content

Commit ec29077

Browse files
committed
refactor: restructure get images testing for better maintainability
1 parent 6056460 commit ec29077

File tree

2 files changed

+72
-78
lines changed

2 files changed

+72
-78
lines changed

src/openstack_mcp_server/tools/image_tools.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def get_images(
2929
Get the list of OpenStack images with optional filtering.
3030
3131
The filtering behavior is as follows:
32-
- By default, all available images are returned without any filtering applied.
32+
- By default, all available images are returned without any filtering applied.
3333
- Filters are only applied when specific values are provided by the user.
3434
3535
:param name: Filter by image name

tests/tools/test_image_tools.py

Lines changed: 71 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
from unittest.mock import Mock
44

5-
import pytest
6-
75
from openstack_mcp_server.tools.image_tools import ImageTools
86
from openstack_mcp_server.tools.request.image import CreateImage
97
from openstack_mcp_server.tools.response.image import Image
@@ -51,7 +49,6 @@ def image_factory(**overrides):
5149
def test_get_images_success(self, mock_get_openstack_conn_image):
5250
"""Test getting image images successfully."""
5351
mock_conn = mock_get_openstack_conn_image
54-
5552
mock_image1 = self.image_factory(
5653
id="img-123-abc-def",
5754
name="ubuntu-20.04-server",
@@ -60,7 +57,6 @@ def test_get_images_success(self, mock_get_openstack_conn_image):
6057
checksum="abc123",
6158
size=1073741824,
6259
)
63-
6460
mock_image2 = self.image_factory(
6561
id="img-456-ghi-jkl",
6662
name="centos-8-stream",
@@ -69,114 +65,112 @@ def test_get_images_success(self, mock_get_openstack_conn_image):
6965
checksum="def456",
7066
size=2147483648,
7167
)
72-
7368
mock_conn.image.images.return_value = [mock_image1, mock_image2]
7469

7570
result = ImageTools().get_images()
7671

72+
mock_conn.image.images.assert_called_once()
7773
expected_output = [
7874
Image(**mock_image1),
7975
Image(**mock_image2),
8076
]
8177
assert result == expected_output
8278

83-
mock_conn.image.images.assert_called_once()
84-
8579
def test_get_images_empty_list(self, mock_get_openstack_conn_image):
8680
"""Test getting image images when no images exist."""
8781
mock_conn = mock_get_openstack_conn_image
8882
mock_conn.image.images.return_value = []
8983

9084
result = ImageTools().get_images()
9185

92-
assert result == []
9386
mock_conn.image.images.assert_called_once()
87+
assert result == []
9488

95-
@pytest.mark.parametrize(
96-
"filter_name,filter_value,expected_count",
97-
[
98-
("name", "ubuntu-20.04-server", 1), # exact name match
99-
("name", "ubuntu", 0), # partial match not supported
100-
("name", "nonexistent", 0), # non-existent name
101-
("name", "", 2), # empty filter value
102-
("name", " ", 2), # whitespace only
103-
("status", "active", 2),
104-
("visibility", "public", 2),
105-
("status", "deleted", 0),
106-
("visibility", "private", 0),
107-
],
108-
)
109-
def test_get_images_with_filters(
110-
self,
111-
mock_get_openstack_conn_image,
112-
filter_name,
113-
filter_value,
114-
expected_count,
89+
def test_get_images_with_status_filter(
90+
self, mock_get_openstack_conn_image
11591
):
116-
"""Test getting images with various filters."""
92+
"""Test getting images with status filter."""
11793
mock_conn = mock_get_openstack_conn_image
118-
119-
mock_image1 = self.image_factory(
94+
mock_image = self.image_factory(
12095
id="img-123-abc-def",
12196
name="ubuntu-20.04-server",
12297
status="active",
12398
visibility="public",
12499
checksum="abc123",
125100
size=1073741824,
126101
)
102+
mock_conn.image.images.return_value = [mock_image]
127103

128-
mock_image2 = self.image_factory(
104+
result = ImageTools().get_images(status="active")
105+
106+
mock_conn.image.images.assert_called_once_with(status="active")
107+
expected_output = [Image(**mock_image)]
108+
assert result == expected_output
109+
110+
def test_get_images_with_visibility_filter(
111+
self, mock_get_openstack_conn_image
112+
):
113+
"""Test getting images with visibility filter."""
114+
mock_conn = mock_get_openstack_conn_image
115+
mock_image = self.image_factory(
129116
id="img-456-ghi-jkl",
130117
name="centos-8-stream",
131-
status="active",
132-
visibility="public",
118+
status="queued",
119+
visibility="private",
133120
checksum="def456",
134121
size=2147483648,
135122
)
123+
mock_conn.image.images.return_value = [mock_image]
136124

137-
if filter_name == "name":
138-
if filter_value == "ubuntu-20.04-server":
139-
mock_conn.image.images.return_value = [mock_image1]
140-
elif filter_value in ["", " "]:
141-
mock_conn.image.images.return_value = [
142-
mock_image1,
143-
mock_image2,
144-
]
145-
else:
146-
mock_conn.image.images.return_value = []
147-
elif filter_name == "status":
148-
if filter_value == "active":
149-
mock_conn.image.images.return_value = [
150-
mock_image1,
151-
mock_image2,
152-
]
153-
else:
154-
mock_conn.image.images.return_value = []
155-
elif filter_name == "visibility":
156-
if filter_value == "public":
157-
mock_conn.image.images.return_value = [
158-
mock_image1,
159-
mock_image2,
160-
]
161-
else:
162-
mock_conn.image.images.return_value = []
163-
164-
result = ImageTools().get_images(**{filter_name: filter_value})
165-
166-
if expected_count == 0:
167-
assert result == []
168-
elif expected_count == 1:
169-
assert result == [Image(**mock_image1)]
170-
else:
171-
assert result == [Image(**mock_image1), Image(**mock_image2)]
172-
173-
# For empty/whitespace filters, no filter should be applied
174-
if filter_value in ["", " "]:
175-
mock_conn.image.images.assert_called_once_with()
176-
else:
177-
mock_conn.image.images.assert_called_once_with(
178-
**{filter_name: filter_value}
179-
)
125+
result = ImageTools().get_images(visibility="private")
126+
127+
mock_conn.image.images.assert_called_once_with(visibility="private")
128+
expected_output = [Image(**mock_image)]
129+
assert result == expected_output
130+
131+
def test_get_images_with_name_filter(self, mock_get_openstack_conn_image):
132+
"""Test getting images with name filter."""
133+
mock_conn = mock_get_openstack_conn_image
134+
mock_image = self.image_factory(
135+
id="img-789-mno-pqr",
136+
name="centos-8-stream",
137+
status="active",
138+
visibility="public",
139+
checksum="ghi789",
140+
size=3221225472,
141+
)
142+
mock_conn.image.images.return_value = [mock_image]
143+
144+
result = ImageTools().get_images(name="centos-8-stream")
145+
146+
mock_conn.image.images.assert_called_once_with(name="centos-8-stream")
147+
expected_output = [Image(**mock_image)]
148+
assert result == expected_output
149+
150+
def test_get_images_with_multiple_filters(
151+
self, mock_get_openstack_conn_image
152+
):
153+
"""Test getting images with multiple filters."""
154+
mock_conn = mock_get_openstack_conn_image
155+
mock_image = self.image_factory(
156+
id="img-multi-filter",
157+
name="ubuntu-20.04-server",
158+
status="active",
159+
visibility="public",
160+
checksum="multi123",
161+
size=1073741824,
162+
)
163+
mock_conn.image.images.return_value = [mock_image]
164+
165+
result = ImageTools().get_images(
166+
name="ubuntu-20.04-server", status="active", visibility="public"
167+
)
168+
169+
mock_conn.image.images.assert_called_once_with(
170+
name="ubuntu-20.04-server", status="active", visibility="public"
171+
)
172+
expected_output = [Image(**mock_image)]
173+
assert result == expected_output
180174

181175
def test_create_image_success_with_volume_id(
182176
self,

0 commit comments

Comments
 (0)