22
33from unittest .mock import Mock
44
5- import pytest
6-
75from openstack_mcp_server .tools .image_tools import ImageTools
86from openstack_mcp_server .tools .request .image import CreateImage
97from 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