diff --git a/openstack_dashboard/dashboards/project/images/images/tests.py b/openstack_dashboard/dashboards/project/images/images/tests.py
index 327434773e..df7611c8db 100644
--- a/openstack_dashboard/dashboards/project/images/images/tests.py
+++ b/openstack_dashboard/dashboards/project/images/images/tests.py
@@ -22,10 +22,10 @@ from django.conf import settings
from django.core.files.uploadedfile import InMemoryUploadedFile
from django.core.urlresolvers import reverse
from django.forms.widgets import HiddenInput
-from django import http
from django.test.utils import override_settings
-from mox3.mox import IsA
+import mock
+import six
from horizon import tables as horizon_tables
from openstack_dashboard import api
@@ -39,17 +39,18 @@ IMAGES_INDEX_URL = reverse('horizon:project:images:index')
class CreateImageFormTests(test.ResetImageAPIVersionMixin, test.TestCase):
- @test.create_stubs({api.glance: ('image_list_detailed',)})
- def test_no_location_or_file(self):
- filters = {'disk_format': 'aki'}
- api.glance.image_list_detailed(
- IsA({}), filters=filters).AndReturn(
- [self.images.list(), False, False])
- filters = {'disk_format': 'ari'}
- api.glance.image_list_detailed(
- IsA({}), filters=filters).AndReturn(
- [self.images.list(), False, False])
- self.mox.ReplayAll()
+ @mock.patch.object(api.glance, 'image_list_detailed')
+ def test_no_location_or_file(self, mock_image_list):
+ mock_image_list.side_effect = [
+ [self.images.list(), False, False],
+ [self.images.list(), False, False]
+ ]
+
+ image_calls = [
+ mock.call(test.IsA(dict), filters={'disk_format': 'aki'}),
+ mock.call(test.IsA(dict), filters={'disk_format': 'ari'})
+ ]
+
post = {
'name': u'Ubuntu 11.10',
'source_type': u'file',
@@ -61,26 +62,31 @@ class CreateImageFormTests(test.ResetImageAPIVersionMixin, test.TestCase):
'is_public': 1}
files = {}
form = forms.CreateImageForm(post, files)
+
self.assertFalse(form.is_valid())
+ mock_image_list.assert_has_calls(image_calls)
@override_settings(HORIZON_IMAGES_ALLOW_UPLOAD=False)
@override_settings(IMAGES_ALLOW_LOCATION=True)
- @test.create_stubs({api.glance: ('image_list_detailed',)})
- def test_image_upload_disabled(self):
- filters = {'disk_format': 'aki'}
- api.glance.image_list_detailed(
- IsA({}), filters=filters).AndReturn(
- [self.images.list(), False, False])
- filters = {'disk_format': 'ari'}
- api.glance.image_list_detailed(
- IsA({}), filters=filters).AndReturn(
- [self.images.list(), False, False])
- self.mox.ReplayAll()
+ @mock.patch.object(api.glance, 'image_list_detailed')
+ def test_image_upload_disabled(self, mock_image_list):
+ mock_image_list.side_effect = [
+ [self.images.list(), False, False],
+ [self.images.list(), False, False]
+ ]
+
+ image_calls = [
+ mock.call(test.IsA(dict), filters={'disk_format': 'aki'}),
+ mock.call(test.IsA(dict), filters={'disk_format': 'ari'})
+ ]
+
form = forms.CreateImageForm({})
+
self.assertEqual(
isinstance(form.fields['image_file'].widget, HiddenInput), True)
source_type_dict = dict(form.fields['source_type'].choices)
self.assertNotIn('file', source_type_dict)
+ mock_image_list.assert_has_calls(image_calls)
@override_settings(OPENSTACK_API_VERSIONS={'image': 1})
def test_create_image_metadata_docker_v1(self):
@@ -136,23 +142,25 @@ class UpdateImageFormTests(test.ResetImageAPIVersionMixin, test.TestCase):
disk_format = form.fields['disk_format']
self.assertFalse(disk_format.widget.attrs.get('readonly', False))
- @test.create_stubs({api.glance: ('image_get',)})
- def test_image_update(self):
+ @mock.patch.object(api.glance, 'image_get')
+ def test_image_update(self, mock_image_get):
image = self.images.first()
- api.glance.image_get(IsA(http.HttpRequest), str(image.id)) \
- .AndReturn(image)
- self.mox.ReplayAll()
+ mock_image_get.return_value = image
url = reverse('horizon:project:images:images:update',
args=[image.id])
res = self.client.get(url)
+
self.assertNoFormErrors(res)
self.assertEqual(res.context['image'].disk_format,
image.disk_format)
+ mock_image_get.assert_called_once_with(test.IsHttpRequest(),
+ image.id)
@override_settings(OPENSTACK_API_VERSIONS={'image': 1})
- @test.create_stubs({api.glance: ('image_update', 'image_get')})
- def test_image_update_post_v1(self):
+ @mock.patch.object(api.glance, 'image_get')
+ @mock.patch.object(api.glance, 'image_update')
+ def test_image_update_post_v1(self, mock_image_update, mock_image_get):
image = self.images.first()
data = {
'name': u'Ubuntu 11.10',
@@ -169,30 +177,35 @@ class UpdateImageFormTests(test.ResetImageAPIVersionMixin, test.TestCase):
'is_public': False,
'protected': False,
'method': 'UpdateImageForm'}
- api.glance.image_get(IsA(http.HttpRequest), str(image.id)) \
- .AndReturn(image)
- api.glance.image_update(IsA(http.HttpRequest),
- image.id,
- is_public=data['is_public'],
- protected=data['protected'],
- disk_format=data['disk_format'],
- container_format="bare",
- name=data['name'],
- min_ram=data['minimum_ram'],
- min_disk=data['minimum_disk'],
- properties={
- 'description': data['description'],
- 'architecture':
- data['architecture']}).AndReturn(image)
- self.mox.ReplayAll()
- url = reverse('horizon:project:images:images:update',
- args=[image.id])
- res = self.client.post(url, data)
- self.assertNoFormErrors(res)
- self.assertEqual(res.status_code, 302)
- @test.create_stubs({api.glance: ('image_update', 'image_get')})
- def test_image_update_post_v2(self):
+ mock_image_get.return_value = image
+ mock_image_update.return_value = image
+
+ url = reverse('horizon:project:images:images:update',
+ args=[image.id])
+ res = self.client.post(url, data)
+
+ self.assertNoFormErrors(res)
+ self.assertEqual(res.status_code, 302)
+ mock_image_get.assert_called_once_with(test.IsHttpRequest(),
+ str(image.id))
+ mock_image_update.assert_called_once_with(
+ test.IsHttpRequest(),
+ image.id,
+ is_public=data['is_public'],
+ protected=data['protected'],
+ disk_format=data['disk_format'],
+ container_format="bare",
+ name=data['name'],
+ min_ram=data['minimum_ram'],
+ min_disk=data['minimum_disk'],
+ properties={
+ 'description': data['description'],
+ 'architecture': data['architecture']})
+
+ @mock.patch.object(api.glance, 'image_get')
+ @mock.patch.object(api.glance, 'image_update')
+ def test_image_update_post_v2(self, mock_image_update, mock_image_get):
image = self.images.first()
data = {
'name': u'Ubuntu 11.10',
@@ -209,48 +222,51 @@ class UpdateImageFormTests(test.ResetImageAPIVersionMixin, test.TestCase):
'is_public': False,
'protected': False,
'method': 'UpdateImageForm'}
- api.glance.image_get(IsA(http.HttpRequest), str(image.id)) \
- .AndReturn(image)
- api.glance.image_update(IsA(http.HttpRequest),
- image.id,
- visibility='private',
- protected=data['protected'],
- disk_format=data['disk_format'],
- container_format="bare",
- name=data['name'],
- min_ram=data['minimum_ram'],
- min_disk=data['minimum_disk'],
- description=data['description'],
- architecture=data['architecture']).\
- AndReturn(image)
- self.mox.ReplayAll()
+
+ mock_image_get.return_value = image
+ mock_image_update.return_value = image
+
url = reverse('horizon:project:images:images:update',
args=[image.id])
res = self.client.post(url, data)
+
self.assertNoFormErrors(res)
self.assertEqual(res.status_code, 302)
+ mock_image_get.assert_called_once_with(test.IsHttpRequest(),
+ str(image.id))
+ mock_image_update.assert_called_once_with(
+ test.IsHttpRequest(),
+ image.id,
+ visibility='private',
+ protected=data['protected'],
+ disk_format=data['disk_format'],
+ container_format="bare",
+ name=data['name'],
+ min_ram=data['minimum_ram'],
+ min_disk=data['minimum_disk'],
+ description=data['description'],
+ architecture=data['architecture'])
class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
- @test.create_stubs({api.glance: ('image_list_detailed',)})
- def test_image_create_get(self):
- filters = {'disk_format': 'aki'}
- api.glance.image_list_detailed(
- IsA(http.HttpRequest), filters=filters).AndReturn(
- [self.images.list(), False, False])
- filters = {'disk_format': 'ari'}
- api.glance.image_list_detailed(
- IsA(http.HttpRequest), filters=filters).AndReturn(
- [self.images.list(), False, False])
- self.mox.ReplayAll()
+ @mock.patch.object(api.glance, 'image_list_detailed')
+ def test_image_create_get(self, mock_image_list):
+ mock_image_list.side_effect = [
+ [self.images.list(), False, False],
+ [self.images.list(), False, False]
+ ]
+ image_calls = [
+ mock.call(test.IsHttpRequest(), filters={'disk_format': 'aki'}),
+ mock.call(test.IsHttpRequest(), filters={'disk_format': 'ari'})
+ ]
url = reverse('horizon:project:images:images:create')
res = self.client.get(url)
- self.assertTemplateUsed(res,
- 'project/images/images/create.html')
+
+ self.assertTemplateUsed(res, 'project/images/images/create.html')
+ mock_image_list.assert_has_calls(image_calls)
@override_settings(OPENSTACK_API_VERSIONS={'image': 1})
- @test.create_stubs({api.glance: ('image_create',)})
def test_image_create_post_copy_from_v1(self):
data = {
'source_type': u'url',
@@ -263,7 +279,6 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
self._test_image_create(data, api_data)
@override_settings(OPENSTACK_API_VERSIONS={'image': 1})
- @test.create_stubs({api.glance: ('image_create',)})
def test_image_create_post_location_v1(self):
data = {
'source_type': u'url',
@@ -276,7 +291,6 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
self._test_image_create(data, api_data)
@override_settings(IMAGES_ALLOW_LOCATION=True)
- @test.create_stubs({api.glance: ('image_create',)})
def test_image_create_post_location_v2(self):
data = {
'source_type': u'url',
@@ -288,7 +302,6 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
self._test_image_create(data, api_data)
@override_settings(OPENSTACK_API_VERSIONS={'image': 1})
- @test.create_stubs({api.glance: ('image_create',)})
def test_image_create_post_upload_v1(self):
temp_file = tempfile.NamedTemporaryFile()
temp_file.write(b'123')
@@ -298,10 +311,9 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
data = {'source_type': u'file',
'image_file': temp_file}
- api_data = {'data': IsA(InMemoryUploadedFile)}
+ api_data = {'data': test.IsA(InMemoryUploadedFile)}
self._test_image_create(data, api_data)
- @test.create_stubs({api.glance: ('image_create',)})
def test_image_create_post_upload_v2(self):
temp_file = tempfile.NamedTemporaryFile()
temp_file.write(b'123')
@@ -311,11 +323,10 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
data = {'source_type': u'file',
'image_file': temp_file}
- api_data = {'data': IsA(InMemoryUploadedFile)}
+ api_data = {'data': test.IsA(InMemoryUploadedFile)}
self._test_image_create(data, api_data)
@override_settings(OPENSTACK_API_VERSIONS={'image': 1})
- @test.create_stubs({api.glance: ('image_create',)})
def test_image_create_post_with_kernel_ramdisk_v1(self):
temp_file = tempfile.NamedTemporaryFile()
temp_file.write(b'123')
@@ -329,10 +340,9 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
'ramdisk_id': '007e7d55-fe1e-4c5c-bf08-44b4a496482a'
}
- api_data = {'data': IsA(InMemoryUploadedFile)}
+ api_data = {'data': test.IsA(InMemoryUploadedFile)}
self._test_image_create(data, api_data)
- @test.create_stubs({api.glance: ('image_create',)})
def test_image_create_post_with_kernel_ramdisk_v2(self):
temp_file = tempfile.NamedTemporaryFile()
temp_file.write(b'123')
@@ -346,11 +356,13 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
'ramdisk_id': '007e7d55-fe1e-4c5c-bf08-44b4a496482a'
}
- api_data = {'data': IsA(InMemoryUploadedFile)}
+ api_data = {'data': test.IsA(InMemoryUploadedFile)}
self._test_image_create(data, api_data)
- @test.create_stubs({api.glance: ('image_list_detailed',)})
- def _test_image_create(self, extra_form_data, extra_api_data):
+ @mock.patch.object(api.glance, 'image_create')
+ @mock.patch.object(api.glance, 'image_list_detailed')
+ def _test_image_create(self, extra_form_data, extra_api_data,
+ mock_image_list, mock_image_create):
data = {
'name': u'Ubuntu 11.10',
'description': u'Login with admin/admin',
@@ -383,19 +395,16 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
api_data.update(extra_api_data)
- filters = {'disk_format': 'aki'}
- api.glance.image_list_detailed(
- IsA(http.HttpRequest), filters=filters).AndReturn(
- [self.images.list(), False, False])
- filters = {'disk_format': 'ari'}
- api.glance.image_list_detailed(
- IsA(http.HttpRequest), filters=filters).AndReturn(
- [self.images.list(), False, False])
+ mock_image_list.side_effect = [
+ [self.images.list(), False, False],
+ [self.images.list(), False, False]
+ ]
+ image_list_calls = [
+ mock.call(test.IsHttpRequest(), filters={'disk_format': 'aki'}),
+ mock.call(test.IsHttpRequest(), filters={'disk_format': 'ari'})
+ ]
- api.glance.image_create(
- IsA(http.HttpRequest),
- **api_data).AndReturn(self.images.first())
- self.mox.ReplayAll()
+ mock_image_create.return_value = self.images.first()
url = reverse('horizon:project:images:images:create')
res = self.client.post(url, data)
@@ -403,10 +412,13 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
self.assertNoFormErrors(res)
self.assertEqual(res.status_code, 302)
- def _test_image_detail_get(self, image):
- api.glance.image_get(IsA(http.HttpRequest), str(image.id)) \
- .AndReturn(image)
- self.mox.ReplayAll()
+ mock_image_list.assert_has_calls(image_list_calls)
+ mock_image_create.assert_called_once_with(test.IsHttpRequest(),
+ **api_data)
+
+ @mock.patch.object(api.glance, 'image_get')
+ def _test_image_detail_get(self, image, mock_image_get):
+ mock_image_get.return_value = image
res = self.client.get(reverse('horizon:project:images:images:detail',
args=[image.id]))
@@ -415,24 +427,23 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
'horizon/common/_detail.html')
self.assertEqual(res.context['image'].name, image.name)
self.assertEqual(res.context['image'].protected, image.protected)
+ mock_image_get.assert_called_once_with(test.IsHttpRequest(),
+ six.text_type(image.id))
@override_settings(OPENSTACK_API_VERSIONS={'image': 1})
- @test.create_stubs({api.glance: ('image_get',)})
def test_image_detail_get_v1(self):
image = self.images.first()
self._test_image_detail_get(image)
- @test.create_stubs({api.glance: ('image_get',)})
def test_image_detail_get_v2(self):
image = self.imagesV2.first()
self._test_image_detail_get(image)
- def _test_image_detail_custom_props_get(self, image):
- api.glance.image_get(IsA(http.HttpRequest), str(image.id)) \
- .AndReturn(image)
- self.mox.ReplayAll()
+ @mock.patch.object(api.glance, 'image_get')
+ def _test_image_detail_custom_props_get(self, image, mock_image_get):
+ mock_image_get.return_value = image
res = self.client.get(reverse('horizon:project:images:images:detail',
args=[image.id]))
@@ -453,23 +464,23 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
self.assertContains(res, '
foo')
self.assertContains(res, 'foo val')
+ mock_image_get.assert_called_once_with(test.IsHttpRequest(),
+ six.text_type(image.id))
+
@override_settings(OPENSTACK_API_VERSIONS={'image': 1})
- @test.create_stubs({api.glance: ('image_get',)})
def test_image_detail_custom_props_get_v1(self):
image = self.images.list()[8]
self._test_image_detail_custom_props_get(image)
- @test.create_stubs({api.glance: ('image_get',)})
def test_image_detail_custom_props_get_v2(self):
image = self.imagesV2.list()[2]
self._test_image_detail_custom_props_get(image)
- def _test_protected_image_detail_get(self, image):
- api.glance.image_get(IsA(http.HttpRequest), str(image.id)) \
- .AndReturn(image)
- self.mox.ReplayAll()
+ @mock.patch.object(api.glance, 'image_get')
+ def _test_protected_image_detail_get(self, image, mock_image_get):
+ mock_image_get.return_value = image
res = self.client.get(
reverse('horizon:project:images:images:detail',
@@ -478,39 +489,37 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
'horizon/common/_detail.html')
self.assertEqual(res.context['image'].protected, image.protected)
+ mock_image_get.assert_called_once_with(test.IsHttpRequest(),
+ six.text_type(image.id))
+
@override_settings(OPENSTACK_API_VERSIONS={'image': 1})
- @test.create_stubs({api.glance: ('image_get',)})
def test_protected_image_detail_get_v1(self):
image = self.images.list()[2]
self._test_protected_image_detail_get(image)
- @test.create_stubs({api.glance: ('image_get',)})
def test_protected_image_detail_get_v2(self):
image = self.imagesV2.list()[1]
self._test_protected_image_detail_get(image)
- @test.create_stubs({api.glance: ('image_get',)})
- def test_image_detail_get_with_exception(self):
+ @mock.patch.object(api.glance, 'image_get')
+ def test_image_detail_get_with_exception(self, mock_image_get):
image = self.images.first()
- api.glance.image_get(IsA(http.HttpRequest), str(image.id)) \
- .AndRaise(self.exceptions.glance)
- self.mox.ReplayAll()
+ mock_image_get.side_effect = self.exceptions.glance
url = reverse('horizon:project:images:images:detail',
args=[image.id])
res = self.client.get(url)
self.assertRedirectsNoFollow(res, IMAGES_INDEX_URL)
+ mock_image_get.assert_called_once_with(test.IsHttpRequest(),
+ six.text_type(image.id))
- @test.create_stubs({api.glance: ('image_get',)})
- def test_image_update_get(self):
+ @mock.patch.object(api.glance, 'image_get')
+ def test_image_update_get(self, mock_image_get):
image = self.images.filter(is_public=True)[0]
-
- api.glance.image_get(IsA(http.HttpRequest), str(image.id)) \
- .AndReturn(image)
- self.mox.ReplayAll()
+ mock_image_get.return_value = image
res = self.client.get(
reverse('horizon:project:images:images:update',
@@ -524,19 +533,20 @@ class ImageViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
" name='public' checked='checked'>",
html=True,
msg_prefix="The is_public checkbox is not checked")
+ mock_image_get.assert_called_once_with(test.IsHttpRequest(),
+ six.text_type(image.id))
class OwnerFilterTests(test.TestCase):
def setUp(self):
super(OwnerFilterTests, self).setUp()
- self.table = self.mox.CreateMock(horizon_tables.DataTable)
+ self.table = mock.Mock(sppec=horizon_tables.DataTable)
self.table.request = self.request
@override_settings(IMAGES_LIST_FILTER_TENANTS=[{'name': 'Official',
'tenant': 'officialtenant',
'icon': 'fa-check'}])
def test_filter(self):
- self.mox.ReplayAll()
all_images = self.images.list()
table = self.table
self.filter_tenants = settings.IMAGES_LIST_FILTER_TENANTS
diff --git a/openstack_dashboard/dashboards/project/images/snapshots/tests.py b/openstack_dashboard/dashboards/project/images/snapshots/tests.py
index 952f1d7425..2755927c33 100644
--- a/openstack_dashboard/dashboards/project/images/snapshots/tests.py
+++ b/openstack_dashboard/dashboards/project/images/snapshots/tests.py
@@ -17,9 +17,8 @@
# under the License.
from django.core.urlresolvers import reverse
-from django import http
-from mox3.mox import IsA
+import mock
from openstack_dashboard import api
from openstack_dashboard.test import helpers as test
@@ -32,24 +31,20 @@ class SnapshotsViewTests(test.TestCase):
def test_create_snapshot_get(self):
server = self.servers.first()
- self.mox.ReplayAll()
-
url = reverse('horizon:project:images:snapshots:create',
args=[server.id])
res = self.client.get(url)
self.assertTemplateUsed(res,
'project/images/snapshots/create.html')
- def test_create_snapshot_post(self):
+ @mock.patch.object(api.nova, 'snapshot_create')
+ @mock.patch.object(api.nova, 'server_get')
+ def test_create_snapshot_post(self, mock_server_get, mock_snapshot_create):
server = self.servers.first()
snapshot = self.snapshots.first()
- self.mox.StubOutWithMock(api.nova, 'server_get')
- self.mox.StubOutWithMock(api.nova, 'snapshot_create')
- api.nova.server_get(IsA(http.HttpRequest), server.id).AndReturn(server)
- api.nova.snapshot_create(IsA(http.HttpRequest), server.id,
- snapshot.name).AndReturn(snapshot)
- self.mox.ReplayAll()
+ mock_server_get.return_value = server
+ mock_snapshot_create.return_value = snapshot
formData = {'method': 'CreateSnapshot',
'tenant_id': self.tenant.id,
@@ -60,16 +55,18 @@ class SnapshotsViewTests(test.TestCase):
res = self.client.post(url, formData)
self.assertRedirectsNoFollow(res, INDEX_URL)
+ mock_server_get.assert_called_once_with(test.IsHttpRequest(),
+ server.id)
+ mock_snapshot_create.assert_called_once_with(test.IsHttpRequest(),
+ server.id, snapshot.name)
- def test_create_snapshot_post_exception(self):
+ @mock.patch.object(api.nova, 'snapshot_create')
+ def test_create_snapshot_post_exception(self,
+ mock_snapshot_create):
server = self.servers.first()
snapshot = self.snapshots.first()
- self.mox.StubOutWithMock(api.nova, 'server_get')
- self.mox.StubOutWithMock(api.nova, 'snapshot_create')
- api.nova.snapshot_create(IsA(http.HttpRequest), server.id,
- snapshot.name).AndRaise(self.exceptions.nova)
- self.mox.ReplayAll()
+ mock_snapshot_create.side_effect = self.exceptions.nova
formData = {'method': 'CreateSnapshot',
'tenant_id': self.tenant.id,
@@ -79,4 +76,7 @@ class SnapshotsViewTests(test.TestCase):
args=[server.id])
res = self.client.post(url, formData)
redirect = reverse("horizon:project:instances:index")
+
self.assertRedirectsNoFollow(res, redirect)
+ mock_snapshot_create.assert_called_once_with(test.IsHttpRequest(),
+ server.id, snapshot.name)
diff --git a/openstack_dashboard/dashboards/project/images/tests.py b/openstack_dashboard/dashboards/project/images/tests.py
index ae4677bd1e..6e857215ba 100644
--- a/openstack_dashboard/dashboards/project/images/tests.py
+++ b/openstack_dashboard/dashboards/project/images/tests.py
@@ -24,13 +24,11 @@ import unittest
from django.core.urlresolvers import reverse
from django import http
-from glanceclient.common import exceptions as glance_exec
-
+import mock
from mox3.mox import IsA
import six
from horizon import exceptions
-from horizon import messages
from openstack_dashboard import api
from openstack_dashboard.dashboards.project.images import utils
@@ -42,16 +40,17 @@ INDEX_URL = reverse('horizon:project:images:index')
CREATE_URL = reverse('horizon:project:images:images:create')
-class ImagesAndSnapshotsTests(test.TestCase):
- @test.create_stubs({api.glance: ('image_list_detailed',)})
+class BaseImagesTestCase(test.TestCase):
+ def setUp(self):
+ super(BaseImagesTestCase, self).setUp()
+ self.patcher = mock.patch.object(api.glance, 'image_list_detailed')
+ self.mock_image_list = self.patcher.start()
+
+
+class ImagesAndSnapshotsTests(BaseImagesTestCase):
def test_index(self):
images = self.images.list()
- api.glance.image_list_detailed(IsA(http.HttpRequest),
- marker=None, paginate=True,
- sort_dir='asc', sort_key='name',
- reversed_order=False) \
- .AndReturn([images, False, False])
- self.mox.ReplayAll()
+ self.mock_image_list.return_value = [images, False, False]
res = self.client.get(INDEX_URL)
self.assertTemplateUsed(res, INDEX_TEMPLATE)
@@ -71,40 +70,43 @@ class ImagesAndSnapshotsTests(test.TestCase):
row_actions = images_table.get_row_actions(images[2])
self.assertEqual(len(row_actions), 4)
- @test.create_stubs({api.glance: ('image_list_detailed',)})
+ self.mock_image_list.assert_called_once_with(test.IsHttpRequest(),
+ marker=None,
+ paginate=True,
+ sort_dir='asc',
+ sort_key='name',
+ reversed_order=False)
+
def test_index_no_images(self):
- api.glance.image_list_detailed(IsA(http.HttpRequest),
- marker=None, paginate=True,
- sort_dir='asc', sort_key='name',
- reversed_order=False) \
- .AndReturn([(), False, False])
- self.mox.ReplayAll()
+ self.mock_image_list.return_value = [(), False, False]
res = self.client.get(INDEX_URL)
+
+ self.mock_image_list.assert_called_once_with(test.IsHttpRequest(),
+ marker=None,
+ paginate=True,
+ sort_dir='asc',
+ sort_key='name',
+ reversed_order=False)
self.assertTemplateUsed(res, INDEX_TEMPLATE)
self.assertContains(res, 'No items to display')
- @test.create_stubs({api.glance: ('image_list_detailed',)})
def test_index_error(self):
- api.glance.image_list_detailed(IsA(http.HttpRequest),
- marker=None, paginate=True,
- sort_dir='asc', sort_key='name',
- reversed_order=False) \
- .AndRaise(self.exceptions.glance)
- self.mox.ReplayAll()
+ self.mock_image_list.side_effect = self.exceptions.glance
res = self.client.get(INDEX_URL)
+
+ self.mock_image_list.assert_called_once_with(test.IsHttpRequest(),
+ marker=None,
+ paginate=True,
+ sort_dir='asc',
+ sort_key='name',
+ reversed_order=False)
self.assertTemplateUsed(res, INDEX_TEMPLATE)
- @test.create_stubs({api.glance: ('image_list_detailed',)})
def test_snapshot_actions(self):
snapshots = self.snapshots.list()
- api.glance.image_list_detailed(IsA(http.HttpRequest),
- marker=None, paginate=True,
- sort_dir='asc', sort_key='name',
- reversed_order=False) \
- .AndReturn([snapshots, False, False])
- self.mox.ReplayAll()
+ self.mock_image_list.return_value = [snapshots, False, False]
res = self.client.get(INDEX_URL)
self.assertTemplateUsed(res, INDEX_TEMPLATE)
@@ -136,10 +138,15 @@ class ImagesAndSnapshotsTests(test.TestCase):
u"Delete Image")
self.assertEqual(str(row_actions[0]), "")
+ self.mock_image_list.assert_called_once_with(test.IsHttpRequest(),
+ marker=None,
+ paginate=True,
+ sort_dir='asc',
+ sort_key='name',
+ reversed_order=False)
-class ImagesAndSnapshotsUtilsTests(test.TestCase):
- @test.create_stubs({api.glance: ('image_list_detailed',)})
+class ImagesAndSnapshotsUtilsTests(BaseImagesTestCase):
def test_list_image(self):
public_images = [image for image in self.images.list()
if image.status == 'active' and image.is_public]
@@ -149,30 +156,31 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
shared_images = [image for image in self.imagesV2.list()
if (image.status == 'active' and
image.visibility == 'shared')]
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'is_public': True, 'status': 'active'}) \
- .AndReturn([public_images, False, False])
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'property-owner_id': self.tenant.id,
- 'status': 'active'}) \
- .AndReturn([private_images, False, False])
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'visibility': 'shared', 'status': 'active'}) \
- .AndReturn([shared_images, False, False])
+ self.mock_image_list.side_effect = [
+ [public_images, False, False],
+ [private_images, False, False],
+ [shared_images, False, False]
+ ]
- self.mox.ReplayAll()
+ image_calls = [
+ mock.call(test.IsHttpRequest(),
+ filters={'is_public': True, 'status': 'active'}),
+ mock.call(test.IsHttpRequest(),
+ filters={'property-owner_id': self.tenant.id,
+ 'status': 'active'}),
+ mock.call(test.IsHttpRequest(),
+ filters={'visibility': 'shared', 'status': 'active'})
+ ]
ret = utils.get_available_images(self.request, self.tenant.id)
expected_images = [image for image in self.images.list()
if (image.status == 'active' and
image.container_format not in ('ami', 'aki'))]
+
+ self.mock_image_list.assert_has_calls(image_calls)
self.assertEqual(len(expected_images), len(ret))
- @test.create_stubs({api.glance: ('image_list_detailed',)})
def test_list_image_using_cache(self):
public_images = [image for image in self.images.list()
if image.status == 'active' and image.is_public]
@@ -182,26 +190,26 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
shared_images = [image for image in self.imagesV2.list()
if (image.status == 'active' and
image.visibility == 'shared')]
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'is_public': True, 'status': 'active'}) \
- .AndReturn([public_images, False, False])
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'property-owner_id': self.tenant.id,
- 'status': 'active'}) \
- .AndReturn([private_images, False, False])
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'visibility': 'shared', 'status': 'active'}) \
- .AndReturn([shared_images, False, False])
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'property-owner_id': 'other-tenant',
- 'status': 'active'}) \
- .AndReturn([private_images, False, False])
- self.mox.ReplayAll()
+ self.mock_image_list.side_effect = [
+ [public_images, False, False],
+ [private_images, False, False],
+ [shared_images, False, False],
+ [private_images, False, False]
+ ]
+
+ image_calls = [
+ mock.call(test.IsHttpRequest(),
+ filters={'is_public': True, 'status': 'active'}),
+ mock.call(test.IsHttpRequest(),
+ filters={'property-owner_id': self.tenant.id,
+ 'status': 'active'}),
+ mock.call(test.IsHttpRequest(),
+ filters={'visibility': 'shared', 'status': 'active'}),
+ mock.call(test.IsHttpRequest(),
+ filters={'property-owner_id': 'other-tenant',
+ 'status': 'active'})
+ ]
expected_images = [image for image in self.images.list()
if (image.status == 'active' and
@@ -238,42 +246,40 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
len(private_images),
len(images_cache['images_by_project']['other-tenant']))
- @test.create_stubs({api.glance: ('image_list_detailed',),
- exceptions: ('handle',)})
- def test_list_image_error_public_image_list(self):
- public_images = [image for image in self.images.list()
- if image.status == 'active' and image.is_public]
+ self.mock_image_list.assert_has_calls(image_calls)
+
+ @mock.patch.object(exceptions, 'handle')
+ def test_list_image_error_public_image_list(self, mock_exception_handle):
private_images = [image for image in self.images.list()
if (image.status == 'active' and
not image.is_public)]
shared_images = [image for image in self.imagesV2.list()
if (image.status == 'active' and
image.visibility == 'shared')]
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'is_public': True, 'status': 'active'}) \
- .AndRaise(self.exceptions.glance)
- exceptions.handle(IsA(http.HttpRequest),
- "Unable to retrieve public images.")
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'property-owner_id': self.tenant.id,
- 'status': 'active'}) \
- .AndReturn([private_images, False, False])
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'visibility': 'shared', 'status': 'active'}) \
- .AndReturn([shared_images, False, False])
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'is_public': True, 'status': 'active'}) \
- .AndReturn([public_images, False, False])
- self.mox.ReplayAll()
+ self.mock_image_list.side_effect = [
+ self.exceptions.glance,
+ [private_images, False, False],
+ [shared_images, False, False],
+ ]
images_cache = {}
ret = utils.get_available_images(self.request, self.tenant.id,
images_cache)
+ image_calls = [
+ mock.call(test.IsHttpRequest(),
+ filters={'is_public': True, 'status': 'active'}),
+ mock.call(test.IsHttpRequest(),
+ filters={'status': 'active', 'property-owner_id': '1'}),
+ mock.call(test.IsHttpRequest(),
+ filters={'visibility': 'shared', 'status': 'active'})
+ ]
+ self.mock_image_list.assert_has_calls(image_calls)
+ handle_calls = [
+ mock.call(test.IsHttpRequest(),
+ "Unable to retrieve public images."),
+ ]
+ mock_exception_handle.assert_has_calls(handle_calls)
expected_images = [image for image in private_images
if image.container_format not in ('ami', 'aki')]
@@ -287,26 +293,8 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
len(shared_images),
len(images_cache['shared_images']))
- ret = utils.get_available_images(self.request, self.tenant.id,
- images_cache)
-
- expected_images = [image for image in self.images.list()
- if image.container_format not in ('ami', 'aki')]
- self.assertEqual(len(expected_images), len(ret))
- self.assertEqual(
- len(public_images),
- len(images_cache['public_images']))
- self.assertEqual(1, len(images_cache['images_by_project']))
- self.assertEqual(
- len(private_images),
- len(images_cache['images_by_project'][self.tenant.id]))
- self.assertEqual(
- len(shared_images),
- len(images_cache['shared_images']))
-
- @test.create_stubs({api.glance: ('image_list_detailed',),
- messages: ('error',)})
- def test_list_image_communication_error_public_image_list(self):
+ @mock.patch.object(exceptions, 'handle')
+ def test_list_image_error_private_image_list(self, mock_exception_handle):
public_images = [image for image in self.images.list()
if image.status == 'active' and image.is_public]
private_images = [image for image in self.images.list()
@@ -315,102 +303,16 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
shared_images = [image for image in self.imagesV2.list()
if (image.status == 'active' and
image.visibility == 'shared')]
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'is_public': True, 'status': 'active'}) \
- .AndRaise(glance_exec.CommunicationError)
- # Make sure the exception is handled with the correct
- # error message. If the exception cannot be handled,
- # the error message will be different.
- messages.error(IsA(http.HttpRequest),
- "Unable to retrieve public images.")
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'property-owner_id': self.tenant.id,
- 'status': 'active'}) \
- .AndReturn([private_images, False, False])
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'visibility': 'shared', 'status': 'active'}) \
- .AndReturn([shared_images, False, False])
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'is_public': True, 'status': 'active'}) \
- .AndReturn([public_images, False, False])
-
- self.mox.ReplayAll()
+ self.mock_image_list.side_effect = [
+ [public_images, False, False],
+ self.exceptions.glance,
+ [shared_images, False, False],
+ [private_images, False, False]
+ ]
images_cache = {}
ret = utils.get_available_images(self.request, self.tenant.id,
images_cache)
-
- expected_images = [image for image in private_images
- if image.container_format not in ('ami', 'aki')]
- self.assertEqual(len(expected_images), len(ret))
- self.assertNotIn('public_images', images_cache)
- self.assertEqual(1, len(images_cache['images_by_project']))
- self.assertEqual(
- len(private_images),
- len(images_cache['images_by_project'][self.tenant.id]))
- self.assertEqual(
- len(shared_images),
- len(images_cache['shared_images']))
-
- ret = utils.get_available_images(self.request, self.tenant.id,
- images_cache)
-
- expected_images = [image for image in self.images.list()
- if image.container_format not in ('ami', 'aki')]
- self.assertEqual(len(expected_images), len(ret))
- self.assertEqual(
- len(public_images),
- len(images_cache['public_images']))
- self.assertEqual(1, len(images_cache['images_by_project']))
- self.assertEqual(
- len(private_images),
- len(images_cache['images_by_project'][self.tenant.id]))
- self.assertEqual(
- len(shared_images),
- len(images_cache['shared_images']))
-
- @test.create_stubs({api.glance: ('image_list_detailed',),
- exceptions: ('handle',)})
- def test_list_image_error_private_image_list(self):
- public_images = [image for image in self.images.list()
- if image.status == 'active' and image.is_public]
- private_images = [image for image in self.images.list()
- if (image.status == 'active' and
- not image.is_public)]
- shared_images = [image for image in self.imagesV2.list()
- if (image.status == 'active' and
- image.visibility == 'shared')]
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'is_public': True, 'status': 'active'}) \
- .AndReturn([public_images, False, False])
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'property-owner_id': self.tenant.id,
- 'status': 'active'}) \
- .AndRaise(self.exceptions.glance)
- exceptions.handle(IsA(http.HttpRequest),
- "Unable to retrieve images for the current project.")
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'visibility': 'shared', 'status': 'active'}) \
- .AndReturn([shared_images, False, False])
- api.glance.image_list_detailed(
- IsA(http.HttpRequest),
- filters={'property-owner_id': self.tenant.id,
- 'status': 'active'}) \
- .AndReturn([private_images, False, False])
-
- self.mox.ReplayAll()
-
- images_cache = {}
- ret = utils.get_available_images(self.request, self.tenant.id,
- images_cache)
-
expected_images = [image for image in public_images
if image.container_format not in ('ami', 'aki')]
self.assertEqual(len(expected_images), len(ret))
@@ -439,6 +341,23 @@ class ImagesAndSnapshotsUtilsTests(test.TestCase):
len(shared_images),
len(images_cache['shared_images']))
+ image_calls = [
+ mock.call(test.IsHttpRequest(),
+ filters={'status': 'active', 'is_public': True}),
+ mock.call(test.IsHttpRequest(),
+ filters={'status': 'active', 'property-owner_id': '1'}),
+ mock.call(test.IsHttpRequest(),
+ filters={'status': 'active', 'visibility': 'shared'}),
+ mock.call(test.IsHttpRequest(),
+ filters={'status': 'active', 'property-owner_id': '1'})
+ ]
+ self.mock_image_list.assert_has_calls(image_calls)
+ handle_calls = [
+ mock.call(test.IsHttpRequest(),
+ "Unable to retrieve images for the current project."),
+ ]
+ mock_exception_handle.assert_has_calls(handle_calls)
+
class SeleniumTests(test.SeleniumTestCase):
@test.create_stubs({api.glance: ('image_list_detailed',)})
diff --git a/openstack_dashboard/test/helpers.py b/openstack_dashboard/test/helpers.py
index e7c731af2c..4092773f10 100644
--- a/openstack_dashboard/test/helpers.py
+++ b/openstack_dashboard/test/helpers.py
@@ -693,7 +693,16 @@ def mock_factory(r):
return mocked
-class IsHttpRequest(object):
- """Class to compare param is django.http.HttpRequest."""
+class IsA(object):
+ """Class to compare param is a specified class."""
+ def __init__(self, cls):
+ self.cls = cls
+
def __eq__(self, other):
- return isinstance(other, http_request.HttpRequest)
+ return isinstance(other, self.cls)
+
+
+class IsHttpRequest(IsA):
+ """Class to compare param is django.http.HttpRequest."""
+ def __init__(self):
+ super(IsHttpRequest, self).__init__(http_request.HttpRequest)