Merge "Switch Cinder-related tests to mock"

This commit is contained in:
Zuul 2017-10-24 11:30:29 +00:00 committed by Gerrit Code Review
commit d9416e84e7
2 changed files with 156 additions and 158 deletions

View File

@ -16,10 +16,9 @@ import copy
from django.conf import settings from django.conf import settings
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django import http
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils.http import urlunquote from django.utils.http import urlunquote
from mox3.mox import IsA import mock
from openstack_dashboard import api from openstack_dashboard import api
from openstack_dashboard.api import cinder from openstack_dashboard.api import cinder
@ -44,76 +43,77 @@ class VolumeTests(test.BaseAdminViewTests):
del att['instance'] del att['instance']
super(VolumeTests, self).tearDown() super(VolumeTests, self).tearDown()
@test.create_stubs({api.nova: ('server_list', 'server_get'), @mock.patch.object(keystone, 'tenant_list')
cinder: ('volume_list_paged', @mock.patch.object(cinder, 'volume_snapshot_list')
'volume_snapshot_list'), @mock.patch.object(cinder, 'volume_list_paged')
keystone: ('tenant_list',)}) @mock.patch.object(api.nova, 'server_list')
def _test_index(self, instanceless_volumes=False): def _test_index(self, instanceless_volumes, mock_server_list,
mock_volume_list, mock_snapshot_list, mock_tenant_list):
volumes = self.cinder_volumes.list() volumes = self.cinder_volumes.list()
if instanceless_volumes: if instanceless_volumes:
for volume in volumes: for volume in volumes:
volume.attachments = [] volume.attachments = []
else:
server = self.servers.first()
cinder.volume_list_paged(IsA(http.HttpRequest), sort_dir="desc", mock_volume_list.return_value = [volumes, False, False]
marker=None, paginate=True, mock_snapshot_list.return_value = []
search_opts={'all_tenants': True})\
.AndReturn([volumes, False, False])
cinder.volume_snapshot_list(IsA(http.HttpRequest), search_opts={
'all_tenants': True}).AndReturn([])
if not instanceless_volumes: if not instanceless_volumes:
api.nova.server_get(IsA(http.HttpRequest), mock_server_list.return_value = [self.servers.list(), False]
server.id).AndReturn(server)
api.nova.server_list(IsA(http.HttpRequest), search_opts={ mock_tenant_list.return_value = [[self.tenants.list(), False]]
'all_tenants': True}, detailed=False) \
.AndReturn([self.servers.list(), False])
keystone.tenant_list(IsA(http.HttpRequest)) \
.AndReturn([self.tenants.list(), False])
self.mox.ReplayAll()
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
if not instanceless_volumes:
mock_server_list.assert_called_once_with(
test.IsHttpRequest(), search_opts={'all_tenants': True})
mock_volume_list.assert_called_once_with(
test.IsHttpRequest(), sort_dir="desc", marker=None, paginate=True,
search_opts={'all_tenants': True})
mock_snapshot_list.assert_called_once_with(
test.IsHttpRequest(), search_opts={'all_tenants': True})
mock_tenant_list.assert_called_once()
self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html') self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html')
volumes = res.context['volumes_table'].data volumes = res.context['volumes_table'].data
self.assertItemsEqual(volumes, self.cinder_volumes.list()) self.assertItemsEqual(volumes, self.cinder_volumes.list())
def test_index_without_attachments(self): def test_index_without_attachments(self):
self._test_index(instanceless_volumes=True) self._test_index(True)
def test_index_with_attachments(self): def test_index_with_attachments(self):
self._test_index(instanceless_volumes=False) self._test_index(False)
@test.create_stubs({api.nova: ('server_list', 'server_get'), @mock.patch.object(keystone, 'tenant_list')
cinder: ('volume_list_paged', @mock.patch.object(cinder, 'volume_snapshot_list')
'volume_snapshot_list'), @mock.patch.object(cinder, 'volume_list_paged')
keystone: ('tenant_list',)}) @mock.patch.object(api.nova, 'server_list')
def _test_index_paginated(self, marker, sort_dir, volumes, url, def _test_index_paginated(self, marker, sort_dir, volumes, url,
has_more, has_prev): has_more, has_prev, mock_server_list,
mock_volume_list, mock_snapshot_list,
mock_tenant_list):
vol_snaps = self.cinder_volume_snapshots.list() vol_snaps = self.cinder_volume_snapshots.list()
server = self.servers.first()
cinder.volume_list_paged(IsA(http.HttpRequest), sort_dir=sort_dir,
marker=marker, paginate=True,
search_opts={'all_tenants': True}) \
.AndReturn([volumes, has_more, has_prev])
api.cinder.volume_snapshot_list(
IsA(http.HttpRequest), search_opts=None).AndReturn(vol_snaps)
api.nova.server_list(IsA(http.HttpRequest), search_opts={
'all_tenants': True}, detailed=False) \
.AndReturn([self.servers.list(), False])
api.nova.server_get(IsA(http.HttpRequest),
server.id).AndReturn(server)
keystone.tenant_list(IsA(http.HttpRequest)) \
.AndReturn([self.tenants.list(), False])
self.mox.ReplayAll() mock_volume_list.return_value = [volumes, has_more, has_prev]
mock_snapshot_list.return_value = vol_snaps
mock_server_list.return_value = [self.servers.list(), False]
mock_tenant_list.return_value = [self.tenants.list(), False]
res = self.client.get(urlunquote(url)) res = self.client.get(urlunquote(url))
mock_server_list.assert_called_once_with(
test.IsHttpRequest(), search_opts={'all_tenants': True})
mock_volume_list.assert_called_once_with(test.IsHttpRequest(),
sort_dir=sort_dir,
marker=marker, paginate=True,
search_opts={
'all_tenants': True})
mock_snapshot_list.assert_called_once_with(
test.IsHttpRequest(), search_opts={'all_tenants': True})
mock_tenant_list.assert_called_once()
self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html') self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html')
self.assertEqual(res.status_code, 200) self.assertEqual(res.status_code, 200)
self.mox.UnsetStubs()
return res return res
@override_settings(FILTER_DATA_FIRST={'admin.volumes': True}) @override_settings(FILTER_DATA_FIRST={'admin.volumes': True})
@ -123,7 +123,7 @@ class VolumeTests(test.BaseAdminViewTests):
volumes = res.context['volumes_table'].data volumes = res.context['volumes_table'].data
self.assertItemsEqual(volumes, []) self.assertItemsEqual(volumes, [])
def ensure_attachments_exist(self, volumes): def _ensure_attachments_exist(self, volumes):
volumes = copy.copy(volumes) volumes = copy.copy(volumes)
for volume in volumes: for volume in volumes:
if not volume.attachments: if not volume.attachments:
@ -134,14 +134,14 @@ class VolumeTests(test.BaseAdminViewTests):
@override_settings(API_RESULT_PAGE_SIZE=2) @override_settings(API_RESULT_PAGE_SIZE=2)
def test_index_paginated(self): def test_index_paginated(self):
size = settings.API_RESULT_PAGE_SIZE size = settings.API_RESULT_PAGE_SIZE
mox_volumes = self.ensure_attachments_exist(self.cinder_volumes.list()) mox_volumes = self._ensure_attachments_exist(
self.cinder_volumes.list())
# get first page # get first page
expected_volumes = mox_volumes[:size] expected_volumes = mox_volumes[:size]
url = INDEX_URL url = INDEX_URL
res = self._test_index_paginated(marker=None, sort_dir="desc", res = self._test_index_paginated(None, "desc", expected_volumes, url,
volumes=expected_volumes, url=url, True, False)
has_more=True, has_prev=False)
volumes = res.context['volumes_table'].data volumes = res.context['volumes_table'].data
self.assertItemsEqual(volumes, expected_volumes) self.assertItemsEqual(volumes, expected_volumes)
@ -150,9 +150,8 @@ class VolumeTests(test.BaseAdminViewTests):
marker = expected_volumes[0].id marker = expected_volumes[0].id
next = volume_tables.VolumesTable._meta.pagination_param next = volume_tables.VolumesTable._meta.pagination_param
url = INDEX_URL + "?%s=%s" % (next, marker) url = INDEX_URL + "?%s=%s" % (next, marker)
res = self._test_index_paginated(marker=marker, sort_dir="desc", res = self._test_index_paginated(marker, "desc", expected_volumes, url,
volumes=expected_volumes, url=url, True, True)
has_more=True, has_prev=True)
volumes = res.context['volumes_table'].data volumes = res.context['volumes_table'].data
self.assertItemsEqual(volumes, expected_volumes) self.assertItemsEqual(volumes, expected_volumes)
@ -161,25 +160,24 @@ class VolumeTests(test.BaseAdminViewTests):
marker = expected_volumes[0].id marker = expected_volumes[0].id
next = volume_tables.VolumesTable._meta.pagination_param next = volume_tables.VolumesTable._meta.pagination_param
url = INDEX_URL + "?%s=%s" % (next, marker) url = INDEX_URL + "?%s=%s" % (next, marker)
res = self._test_index_paginated(marker=marker, sort_dir="desc", res = self._test_index_paginated(marker, "desc", expected_volumes, url,
volumes=expected_volumes, url=url, False, True)
has_more=False, has_prev=True)
volumes = res.context['volumes_table'].data volumes = res.context['volumes_table'].data
self.assertItemsEqual(volumes, expected_volumes) self.assertItemsEqual(volumes, expected_volumes)
@override_settings(API_RESULT_PAGE_SIZE=2) @override_settings(API_RESULT_PAGE_SIZE=2)
def test_index_paginated_prev(self): def test_index_paginated_prev(self):
size = settings.API_RESULT_PAGE_SIZE size = settings.API_RESULT_PAGE_SIZE
mox_volumes = self.ensure_attachments_exist(self.cinder_volumes.list()) mox_volumes = self._ensure_attachments_exist(
self.cinder_volumes.list())
# prev from some page # prev from some page
expected_volumes = mox_volumes[size:2 * size] expected_volumes = mox_volumes[size:2 * size]
marker = mox_volumes[0].id marker = mox_volumes[0].id
prev = volume_tables.VolumesTable._meta.prev_pagination_param prev = volume_tables.VolumesTable._meta.prev_pagination_param
url = INDEX_URL + "?%s=%s" % (prev, marker) url = INDEX_URL + "?%s=%s" % (prev, marker)
res = self._test_index_paginated(marker=marker, sort_dir="asc", res = self._test_index_paginated(marker, "asc", expected_volumes, url,
volumes=expected_volumes, url=url, False, True)
has_more=False, has_prev=True)
volumes = res.context['volumes_table'].data volumes = res.context['volumes_table'].data
self.assertItemsEqual(volumes, expected_volumes) self.assertItemsEqual(volumes, expected_volumes)
@ -188,35 +186,36 @@ class VolumeTests(test.BaseAdminViewTests):
marker = mox_volumes[0].id marker = mox_volumes[0].id
prev = volume_tables.VolumesTable._meta.prev_pagination_param prev = volume_tables.VolumesTable._meta.prev_pagination_param
url = INDEX_URL + "?%s=%s" % (prev, marker) url = INDEX_URL + "?%s=%s" % (prev, marker)
res = self._test_index_paginated(marker=marker, sort_dir="asc", res = self._test_index_paginated(marker, "asc", expected_volumes, url,
volumes=expected_volumes, url=url, True, False)
has_more=True, has_prev=False)
volumes = res.context['volumes_table'].data volumes = res.context['volumes_table'].data
self.assertItemsEqual(volumes, expected_volumes) self.assertItemsEqual(volumes, expected_volumes)
@test.create_stubs({cinder: ('volume_reset_state', @mock.patch.object(cinder, 'volume_get')
'volume_get')}) @mock.patch.object(cinder, 'volume_reset_state')
def test_update_volume_status(self): def test_update_volume_status(self, mock_reset, mock_volume_get):
volume = self.volumes.first() volume = self.volumes.first()
formData = {'status': 'error'} formData = {'status': 'error'}
cinder.volume_get(IsA(http.HttpRequest), volume.id).AndReturn(volume) mock_volume_get.return_value = volume
cinder.volume_reset_state(IsA(http.HttpRequest),
volume.id,
formData['status'])
self.mox.ReplayAll()
res = self.client.post( res = self.client.post(
reverse('horizon:admin:volumes:update_status', reverse('horizon:admin:volumes:update_status',
args=(volume.id,)), args=(volume.id,)),
formData) formData)
mock_reset.assert_called_once_with(test.IsHttpRequest(),
volume.id, formData['status'])
mock_volume_get.assert_called_once_with(test.IsHttpRequest(),
volume.id)
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
@test.create_stubs({cinder: ('volume_manage', @mock.patch.object(cinder, 'extension_supported')
'volume_type_list', @mock.patch.object(cinder, 'availability_zone_list')
'availability_zone_list', @mock.patch.object(cinder, 'volume_type_list')
'extension_supported')}) @mock.patch.object(cinder, 'volume_manage')
def test_manage_volume(self): def test_manage_volume(self, mock_manage, mock_type_list, mock_az_list,
mock_extension):
metadata = {'key': u'k1', metadata = {'key': u'k1',
'value': u'v1'} 'value': u'v1'}
formData = {'host': 'host-1', formData = {'host': 'host-1',
@ -228,18 +227,17 @@ class VolumeTests(test.BaseAdminViewTests):
'availability_zone': 'nova', 'availability_zone': 'nova',
'metadata': metadata['key'] + '=' + metadata['value'], 'metadata': metadata['key'] + '=' + metadata['value'],
'bootable': False} 'bootable': False}
cinder.volume_type_list(
IsA(http.HttpRequest)). \ mock_type_list.return_value = self.cinder_volume_types.list()
AndReturn(self.cinder_volume_types.list()) mock_az_list.return_value = self.availability_zones.list()
cinder.availability_zone_list( mock_extension.return_value = True
IsA(http.HttpRequest)). \
AndReturn(self.availability_zones.list()) res = self.client.post(
cinder.extension_supported( reverse('horizon:admin:volumes:manage'),
IsA(http.HttpRequest), formData)
'AvailabilityZones'). \
AndReturn(True) mock_manage.assert_called_once_with(
cinder.volume_manage( test.IsHttpRequest(),
IsA(http.HttpRequest),
host=formData['host'], host=formData['host'],
identifier=formData['identifier'], identifier=formData['identifier'],
id_type=formData['id_type'], id_type=formData['id_type'],
@ -249,15 +247,15 @@ class VolumeTests(test.BaseAdminViewTests):
availability_zone=formData['availability_zone'], availability_zone=formData['availability_zone'],
metadata={metadata['key']: metadata['value']}, metadata={metadata['key']: metadata['value']},
bootable=formData['bootable']) bootable=formData['bootable'])
self.mox.ReplayAll() mock_type_list.assert_called_once()
res = self.client.post( mock_az_list.assert_called_once()
reverse('horizon:admin:volumes:manage'), mock_extension.assert_called_once_with(test.IsHttpRequest(),
formData) 'AvailabilityZones')
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
@test.create_stubs({cinder: ('volume_unmanage', @mock.patch.object(cinder, 'volume_get')
'volume_get')}) @mock.patch.object(cinder, 'volume_unmanage')
def test_unmanage_volume(self): def test_unmanage_volume(self, mock_unmanage, mock_get):
# important - need to get the v2 cinder volume which has host data # important - need to get the v2 cinder volume which has host data
volume_list = [x for x in self.cinder_volumes.list() volume_list = [x for x in self.cinder_volumes.list()
if x.name == 'v2_volume'] if x.name == 'v2_volume']
@ -266,111 +264,105 @@ class VolumeTests(test.BaseAdminViewTests):
'host_name': 'host@backend-name#pool', 'host_name': 'host@backend-name#pool',
'volume_id': volume.id} 'volume_id': volume.id}
cinder.volume_get(IsA(http.HttpRequest), volume.id).AndReturn(volume) mock_get.return_value = volume
cinder.volume_unmanage(IsA(http.HttpRequest), volume.id). \ mock_unmanage.return_value = volume
AndReturn(volume)
self.mox.ReplayAll()
res = self.client.post( res = self.client.post(
reverse('horizon:admin:volumes:unmanage', reverse('horizon:admin:volumes:unmanage',
args=(volume.id,)), args=(volume.id,)),
formData) formData)
mock_unmanage.assert_called_once_with(test.IsHttpRequest(), volume.id)
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
@test.create_stubs({cinder: ('pool_list', @mock.patch.object(cinder, 'volume_get')
'volume_get',)}) @mock.patch.object(cinder, 'pool_list')
def test_volume_migrate_get(self): def test_volume_migrate_get(self, mock_pool, mock_get):
volume = self.cinder_volumes.get(name='v2_volume') volume = self.cinder_volumes.get(name='v2_volume')
cinder.volume_get(IsA(http.HttpRequest), volume.id) \
.AndReturn(volume)
cinder.pool_list(IsA(http.HttpRequest)) \
.AndReturn(self.cinder_pools.list())
self.mox.ReplayAll() mock_pool.return_value = self.cinder_pools.list()
mock_get.return_value = volume
url = reverse('horizon:admin:volumes:migrate', url = reverse('horizon:admin:volumes:migrate',
args=[volume.id]) args=[volume.id])
res = self.client.get(url) res = self.client.get(url)
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
mock_pool.assert_called_once()
self.assertTemplateUsed(res, self.assertTemplateUsed(res,
'admin/volumes/migrate_volume.html') 'admin/volumes/migrate_volume.html')
@test.create_stubs({cinder: ('volume_get',)}) @mock.patch.object(cinder, 'volume_get')
def test_volume_migrate_get_volume_get_exception(self): def test_volume_migrate_get_volume_get_exception(self, mock_get):
volume = self.cinder_volumes.get(name='v2_volume') volume = self.cinder_volumes.get(name='v2_volume')
cinder.volume_get(IsA(http.HttpRequest), volume.id) \ mock_get.side_effect = self.exceptions.cinder
.AndRaise(self.exceptions.cinder)
self.mox.ReplayAll()
url = reverse('horizon:admin:volumes:migrate', url = reverse('horizon:admin:volumes:migrate',
args=[volume.id]) args=[volume.id])
res = self.client.get(url) res = self.client.get(url)
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('pool_list', @mock.patch.object(cinder, 'volume_get')
'volume_get',)}) @mock.patch.object(cinder, 'pool_list')
def test_volume_migrate_list_pool_get_exception(self): def test_volume_migrate_list_pool_get_exception(self, mock_pool, mock_get):
volume = self.cinder_volumes.get(name='v2_volume') volume = self.cinder_volumes.get(name='v2_volume')
cinder.volume_get(IsA(http.HttpRequest), volume.id) \
.AndReturn(volume)
cinder.pool_list(IsA(http.HttpRequest)) \
.AndRaise(self.exceptions.cinder)
self.mox.ReplayAll() mock_get.return_value = volume
mock_pool.side_effect = self.exceptions.cinder
url = reverse('horizon:admin:volumes:migrate', url = reverse('horizon:admin:volumes:migrate',
args=[volume.id]) args=[volume.id])
res = self.client.get(url) res = self.client.get(url)
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
mock_pool.assert_called_once()
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('pool_list', @mock.patch.object(cinder, 'volume_migrate')
'volume_get', @mock.patch.object(cinder, 'volume_get')
'volume_migrate',)}) @mock.patch.object(cinder, 'pool_list')
def test_volume_migrate_post(self): def test_volume_migrate_post(self, mock_pool, mock_get, mock_migtate):
volume = self.cinder_volumes.get(name='v2_volume') volume = self.cinder_volumes.get(name='v2_volume')
host = self.cinder_pools.first().name host = self.cinder_pools.first().name
cinder.volume_get(IsA(http.HttpRequest), volume.id) \ mock_get.return_value = volume
.AndReturn(volume) mock_pool.return_value = self.cinder_pools.list()
cinder.pool_list(IsA(http.HttpRequest)) \ mock_migtate.return_value = None
.AndReturn(self.cinder_pools.list())
cinder.volume_migrate(IsA(http.HttpRequest),
volume.id,
host,
False) \
.AndReturn(None)
self.mox.ReplayAll()
url = reverse('horizon:admin:volumes:migrate', url = reverse('horizon:admin:volumes:migrate',
args=[volume.id]) args=[volume.id])
res = self.client.post(url, {'host': host, 'volume_id': volume.id}) res = self.client.post(url, {'host': host, 'volume_id': volume.id})
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
mock_pool.assert_called_once()
mock_migtate.assert_called_once_with(test.IsHttpRequest(),
volume.id, host, False)
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('pool_list', @mock.patch.object(cinder, 'volume_migrate')
'volume_get', @mock.patch.object(cinder, 'volume_get')
'volume_migrate',)}) @mock.patch.object(cinder, 'pool_list')
def test_volume_migrate_post_api_exception(self): def test_volume_migrate_post_api_exception(self, mock_pool, mock_get,
mock_migtate):
volume = self.cinder_volumes.get(name='v2_volume') volume = self.cinder_volumes.get(name='v2_volume')
host = self.cinder_pools.first().name host = self.cinder_pools.first().name
cinder.volume_get(IsA(http.HttpRequest), volume.id) \ mock_get.return_value = volume
.AndReturn(volume) mock_pool.return_value = self.cinder_pools.list()
cinder.pool_list(IsA(http.HttpRequest)) \ mock_migtate.side_effect = self.exceptions.cinder
.AndReturn(self.cinder_pools.list())
cinder.volume_migrate(IsA(http.HttpRequest),
volume.id,
host,
False) \
.AndRaise(self.exceptions.cinder)
self.mox.ReplayAll()
url = reverse('horizon:admin:volumes:migrate', url = reverse('horizon:admin:volumes:migrate',
args=[volume.id]) args=[volume.id])
res = self.client.post(url, {'host': host, 'volume_id': volume.id}) res = self.client.post(url, {'host': host, 'volume_id': volume.id})
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
mock_pool.assert_called_once()
mock_migtate.assert_called_once_with(test.IsHttpRequest(), volume.id,
host, False)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
def test_get_volume_status_choices_without_current(self): def test_get_volume_status_choices_without_current(self):
@ -381,16 +373,15 @@ class VolumeTests(test.BaseAdminViewTests):
self.assertNotIn(current_status, self.assertNotIn(current_status,
[status[0] for status in status_choices]) [status[0] for status in status_choices])
@test.create_stubs({cinder: ('volume_get',)}) @mock.patch.object(cinder, 'volume_get')
def test_update_volume_status_get(self): def test_update_volume_status_get(self, mock_get):
volume = self.cinder_volumes.get(name='v2_volume') volume = self.cinder_volumes.get(name='v2_volume')
cinder.volume_get(IsA(http.HttpRequest), volume.id) \ mock_get.return_value = volume
.AndReturn(volume)
self.mox.ReplayAll()
url = reverse('horizon:admin:volumes:update_status', url = reverse('horizon:admin:volumes:update_status',
args=[volume.id]) args=[volume.id])
res = self.client.get(url) res = self.client.get(url)
status_option = "<option value=\"%s\"></option>" % volume.status status_option = "<option value=\"%s\"></option>" % volume.status
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
self.assertNotContains(res, status_option) self.assertNotContains(res, status_option)

View File

@ -30,6 +30,7 @@ from django.conf import settings
from django.contrib.messages.storage import default_storage from django.contrib.messages.storage import default_storage
from django.core.handlers import wsgi from django.core.handlers import wsgi
from django.core import urlresolvers from django.core import urlresolvers
from django import http as http_request
from django.test.client import RequestFactory from django.test.client import RequestFactory
from django.test import utils as django_test_utils from django.test import utils as django_test_utils
from django.utils import http from django.utils import http
@ -693,3 +694,9 @@ def mock_factory(r):
mocked = mock_obj_to_dict(r) mocked = mock_obj_to_dict(r)
mocked.configure_mock(**r) mocked.configure_mock(**r)
return mocked return mocked
class IsHttpRequest(object):
"""Class to compare param is django.http.HttpRequest."""
def __eq__(self, other):
return isinstance(other, http_request.HttpRequest)