Revision dc99330c snf-cyclades-app/synnefo/api/test/images.py
b/snf-cyclades-app/synnefo/api/test/images.py | ||
---|---|---|
35 | 35 |
|
36 | 36 |
from snf_django.lib.api import faults |
37 | 37 |
from snf_django.utils.testing import BaseAPITest |
38 |
from synnefo.lib.services import get_service_path |
|
39 |
from synnefo.cyclades_settings import cyclades_services |
|
40 |
from synnefo.lib import join_urls |
|
38 | 41 |
|
39 | 42 |
from mock import patch |
40 | 43 |
from functools import wraps |
... | ... | |
51 | 54 |
return wrapper |
52 | 55 |
|
53 | 56 |
|
57 |
class ComputeAPITest(BaseAPITest): |
|
58 |
def setUp(self, *args, **kwargs): |
|
59 |
super(ComputeAPITest, self).setUp(*args, **kwargs) |
|
60 |
self.compute_path = get_service_path(cyclades_services, 'compute', |
|
61 |
version='v2.0') |
|
62 |
def myget(self, path, *args, **kwargs): |
|
63 |
path = join_urls(self.compute_path, path) |
|
64 |
return self.get(path, *args, **kwargs) |
|
65 |
|
|
66 |
def myput(self, path, *args, **kwargs): |
|
67 |
path = join_urls(self.compute_path, path) |
|
68 |
return self.put(path, *args, **kwargs) |
|
69 |
|
|
70 |
def mypost(self, path, *args, **kwargs): |
|
71 |
path = join_urls(self.compute_path, path) |
|
72 |
return self.post(path, *args, **kwargs) |
|
73 |
|
|
74 |
def mydelete(self, path, *args, **kwargs): |
|
75 |
path = join_urls(self.compute_path, path) |
|
76 |
return self.delete(path, *args, **kwargs) |
|
77 |
|
|
78 |
|
|
54 | 79 |
@patch('synnefo.plankton.backend.ImageBackend') |
55 |
class ImageAPITest(BaseAPITest):
|
|
80 |
class ImageAPITest(ComputeAPITest):
|
|
56 | 81 |
@assert_backend_closed |
57 | 82 |
def test_create_image(self, mimage): |
58 | 83 |
"""Test that create image is not implemented""" |
59 |
response = self.post('/api/v1.1/images/', 'user', json.dumps(''), |
|
60 |
'json') |
|
84 |
response = self.mypost('images/', 'user', json.dumps(''), 'json') |
|
61 | 85 |
self.assertEqual(response.status_code, 501) |
62 | 86 |
|
63 | 87 |
@assert_backend_closed |
... | ... | |
67 | 91 |
{'id': 2, 'name': 'image-2'}, |
68 | 92 |
{'id': 3, 'name': 'image-3'}] |
69 | 93 |
mimage().list_images.return_value = images |
70 |
response = self.get('/api/v1.1/images/', 'user')
|
|
94 |
response = self.myget('images', 'user')
|
|
71 | 95 |
self.assertSuccess(response) |
72 | 96 |
api_images = json.loads(response.content)['images'] |
73 | 97 |
self.assertEqual(images, api_images) |
... | ... | |
116 | 140 |
'created': '2012-11-26T11:52:54+00:00', |
117 | 141 |
'updated': '2012-12-26T11:52:54+00:00'}] |
118 | 142 |
mimage().list_images.return_value = images |
119 |
response = self.get('/api/v1.1/images/detail', 'user')
|
|
143 |
response = self.myget('images/detail', 'user')
|
|
120 | 144 |
self.assertSuccess(response) |
121 | 145 |
api_images = json.loads(response.content)['images'] |
122 | 146 |
self.assertEqual(len(result_images), len(api_images)) |
... | ... | |
148 | 172 |
'properties': ''}] |
149 | 173 |
mimage().list_images.return_value = images |
150 | 174 |
response =\ |
151 |
self.get('/api/v1.1/images/detail?changes-since=%sUTC' % new_time)
|
|
175 |
self.myget('images/detail?changes-since=%sUTC' % new_time)
|
|
152 | 176 |
self.assertSuccess(response) |
153 | 177 |
api_images = json.loads(response.content)['images'] |
154 | 178 |
self.assertEqual(1, len(api_images)) |
... | ... | |
171 | 195 |
'updated': '2012-12-26T11:52:54+00:00', |
172 | 196 |
'metadata': {'foo': 'bar'}} |
173 | 197 |
mimage.return_value.get_image.return_value = image |
174 |
response = self.get('/api/v1.1/images/42', 'user')
|
|
198 |
response = self.myget('images/42', 'user')
|
|
175 | 199 |
self.assertSuccess(response) |
176 | 200 |
api_image = json.loads(response.content)['image'] |
177 | 201 |
self.assertEqual(api_image, result_image) |
... | ... | |
179 | 203 |
@assert_backend_closed |
180 | 204 |
def test_invalid_image(self, mimage): |
181 | 205 |
mimage.return_value.get_image.side_effect = faults.ItemNotFound('Image not found') |
182 |
response = self.get('/api/v1.1/images/42', 'user')
|
|
206 |
response = self.myget('images/42', 'user')
|
|
183 | 207 |
self.assertItemNotFound(response) |
184 | 208 |
|
185 | 209 |
@assert_backend_closed |
186 | 210 |
def test_delete_image(self, mimage): |
187 |
response = self.delete("/api/v1.1/images/42", "user")
|
|
211 |
response = self.mydelete("images/42", "user")
|
|
188 | 212 |
self.assertEqual(response.status_code, 204) |
189 | 213 |
mimage.return_value.unregister.assert_called_once_with('42') |
190 | 214 |
mimage.return_value._delete.assert_not_called('42') |
191 | 215 |
|
192 | 216 |
|
193 | 217 |
@patch('synnefo.plankton.backend.ImageBackend') |
194 |
class ImageMetadataAPITest(BaseAPITest):
|
|
218 |
class ImageMetadataAPITest(ComputeAPITest):
|
|
195 | 219 |
def setUp(self): |
196 | 220 |
self.image = {'id': 42, |
197 | 221 |
'name': 'image-1', |
... | ... | |
208 | 232 |
'created': '2012-11-26T11:52:54+00:00', |
209 | 233 |
'updated': '2012-12-26T11:52:54+00:00', |
210 | 234 |
'metadata': {'foo': 'bar'}} |
235 |
super(ImageMetadataAPITest, self).setUp() |
|
211 | 236 |
|
212 | 237 |
@assert_backend_closed |
213 | 238 |
def test_list_metadata(self, backend): |
214 | 239 |
backend.return_value.get_image.return_value = self.image |
215 |
response = self.get('/api/v1.1/images/42/metadata', 'user')
|
|
240 |
response = self.myget('images/42/metadata', 'user')
|
|
216 | 241 |
self.assertSuccess(response) |
217 | 242 |
meta = json.loads(response.content)['metadata'] |
218 | 243 |
self.assertEqual(meta, self.image['properties']) |
... | ... | |
220 | 245 |
@assert_backend_closed |
221 | 246 |
def test_get_metadata(self, backend): |
222 | 247 |
backend.return_value.get_image.return_value = self.image |
223 |
response = self.get('/api/v1.1/images/42/metadata/foo', 'user')
|
|
248 |
response = self.myget('images/42/metadata/foo', 'user')
|
|
224 | 249 |
self.assertSuccess(response) |
225 | 250 |
meta = json.loads(response.content)['meta'] |
226 | 251 |
self.assertEqual(meta['foo'], 'bar') |
... | ... | |
228 | 253 |
@assert_backend_closed |
229 | 254 |
def test_get_invalid_metadata(self, backend): |
230 | 255 |
backend.return_value.get_image.return_value = self.image |
231 |
response = self.get('/api/v1.1/images/42/metadata/not_found', 'user')
|
|
256 |
response = self.myget('images/42/metadata/not_found', 'user')
|
|
232 | 257 |
self.assertItemNotFound(response) |
233 | 258 |
|
234 | 259 |
def test_delete_metadata_item(self, backend): |
235 | 260 |
backend.return_value.get_image.return_value = self.image |
236 |
response = self.delete('/api/v1.1/images/42/metadata/foo', 'user')
|
|
261 |
response = self.mydelete('images/42/metadata/foo', 'user')
|
|
237 | 262 |
self.assertEqual(response.status_code, 204) |
238 | 263 |
backend.return_value.update_metadata.assert_called_once_with('42', {'properties': {'foo2': |
239 | 264 |
'bar2'}}) |
... | ... | |
242 | 267 |
def test_create_metadata_item(self, backend): |
243 | 268 |
backend.return_value.get_image.return_value = self.image |
244 | 269 |
request = {'meta': {'foo3': 'bar3'}} |
245 |
response = self.put('/api/v1.1/images/42/metadata/foo3', 'user',
|
|
246 |
json.dumps(request), 'json') |
|
270 |
response = self.myput('images/42/metadata/foo3', 'user',
|
|
271 |
json.dumps(request), 'json')
|
|
247 | 272 |
self.assertEqual(response.status_code, 201) |
248 | 273 |
backend.return_value.update_metadata.assert_called_once_with('42', |
249 | 274 |
{'properties': |
... | ... | |
253 | 278 |
def test_create_metadata_malformed_1(self, backend): |
254 | 279 |
backend.return_value.get_image.return_value = self.image |
255 | 280 |
request = {'met': {'foo3': 'bar3'}} |
256 |
response = self.put('/api/v1.1/images/42/metadata/foo3', 'user',
|
|
257 |
json.dumps(request), 'json') |
|
281 |
response = self.myput('images/42/metadata/foo3', 'user',
|
|
282 |
json.dumps(request), 'json')
|
|
258 | 283 |
self.assertBadRequest(response) |
259 | 284 |
|
260 | 285 |
@assert_backend_closed |
261 | 286 |
def test_create_metadata_malformed_2(self, backend): |
262 | 287 |
backend.return_value.get_image.return_value = self.image |
263 | 288 |
request = {'metadata': [('foo3', 'bar3')]} |
264 |
response = self.put('/api/v1.1/images/42/metadata/foo3', 'user',
|
|
265 |
json.dumps(request), 'json') |
|
289 |
response = self.myput('images/42/metadata/foo3', 'user',
|
|
290 |
json.dumps(request), 'json')
|
|
266 | 291 |
self.assertBadRequest(response) |
267 | 292 |
|
268 | 293 |
@assert_backend_closed |
269 | 294 |
def test_create_metadata_malformed_3(self, backend): |
270 | 295 |
backend.return_value.get_image.return_value = self.image |
271 | 296 |
request = {'met': {'foo3': 'bar3', 'foo4': 'bar4'}} |
272 |
response = self.put('/api/v1.1/images/42/metadata/foo3', 'user',
|
|
297 |
response = self.myput('images/42/metadata/foo3', 'user',
|
|
273 | 298 |
json.dumps(request), 'json') |
274 | 299 |
self.assertBadRequest(response) |
275 | 300 |
|
... | ... | |
277 | 302 |
def test_create_metadata_malformed_4(self, backend): |
278 | 303 |
backend.return_value.get_image.return_value = self.image |
279 | 304 |
request = {'met': {'foo3': 'bar3'}} |
280 |
response = self.put('/api/v1.1/images/42/metadata/foo4', 'user',
|
|
281 |
json.dumps(request), 'json')
|
|
305 |
response = self.myput('images/42/metadata/foo4', 'user',
|
|
306 |
json.dumps(request), 'json') |
|
282 | 307 |
self.assertBadRequest(response) |
283 | 308 |
|
284 | 309 |
@assert_backend_closed |
285 | 310 |
def test_update_metadata_item(self, backend): |
286 | 311 |
backend.return_value.get_image.return_value = self.image |
287 | 312 |
request = {'metadata': {'foo': 'bar_new', 'foo4': 'bar4'}} |
288 |
response = self.post('/api/v1.1/images/42/metadata', 'user',
|
|
289 |
json.dumps(request), 'json') |
|
313 |
response = self.mypost('images/42/metadata', 'user',
|
|
314 |
json.dumps(request), 'json')
|
|
290 | 315 |
self.assertEqual(response.status_code, 201) |
291 | 316 |
backend.return_value.update_metadata.assert_called_once_with('42', |
292 | 317 |
{'properties': |
... | ... | |
297 | 322 |
def test_update_metadata_malformed(self, backend): |
298 | 323 |
backend.return_value.get_image.return_value = self.image |
299 | 324 |
request = {'meta': {'foo': 'bar_new', 'foo4': 'bar4'}} |
300 |
response = self.post('/api/v1.1/images/42/metadata', 'user',
|
|
301 |
json.dumps(request), 'json') |
|
325 |
response = self.mypost('images/42/metadata', 'user',
|
|
326 |
json.dumps(request), 'json')
|
|
302 | 327 |
self.assertBadRequest(response) |
Also available in: Unified diff