Remove six usage from horizon package

We don't support Python 2 anymore so we don't need this
compatibility library.

six.reraise usages are left as is until it'll be moved to some
base lib like oslo.utils to not re-implenent this method in
Horizon.

This patch also removes Python2-specific base test case methods
assertItemsEqual and assertNotRegexpMatches in flavor of new
Python 3 analogues.

Change-Id: I0b567382edf4d68674a7b8d0b02333fb57293958
This commit is contained in:
Ivan Kolodyazhny 2020-01-09 00:14:08 +02:00
parent aa3c7e1919
commit e976461d85
53 changed files with 233 additions and 306 deletions

View File

@ -37,7 +37,6 @@ from django.utils.functional import empty
from django.utils.functional import SimpleLazyObject from django.utils.functional import SimpleLazyObject
from django.utils.module_loading import module_has_submodule from django.utils.module_loading import module_has_submodule
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import six
from horizon import conf from horizon import conf
from horizon.decorators import _current_component from horizon.decorators import _current_component
@ -350,7 +349,6 @@ class Panel(HorizonComponent):
return urlpatterns, self.slug, self.slug return urlpatterns, self.slug, self.slug
@six.python_2_unicode_compatible
class PanelGroup(object): class PanelGroup(object):
"""A container for a set of :class:`~horizon.Panel` classes. """A container for a set of :class:`~horizon.Panel` classes.
@ -593,7 +591,7 @@ class Dashboard(Registry, HorizonComponent):
panel_groups = [] panel_groups = []
# If we have a flat iterable of panel names, wrap it again so # If we have a flat iterable of panel names, wrap it again so
# we have a consistent structure for the next step. # we have a consistent structure for the next step.
if all([isinstance(i, six.string_types) for i in self.panels]): if all([isinstance(i, str) for i in self.panels]):
self.panels = [self.panels] self.panels = [self.panels]
# Now iterate our panel sets. # Now iterate our panel sets.
@ -824,7 +822,7 @@ class Site(Registry, HorizonComponent):
if user_home: if user_home:
if callable(user_home): if callable(user_home):
return user_home(user) return user_home(user)
elif isinstance(user_home, six.string_types): elif isinstance(user_home, str):
# Assume we've got a URL if there's a slash in it # Assume we've got a URL if there's a slash in it
if '/' in user_home: if '/' in user_home:
return user_home return user_home

View File

@ -111,7 +111,6 @@ class ServiceCatalogException(HorizonException):
super(ServiceCatalogException, self).__init__(message) super(ServiceCatalogException, self).__init__(message)
@six.python_2_unicode_compatible
class AlreadyExists(HorizonException): class AlreadyExists(HorizonException):
"""API resources tried to create already exists.""" """API resources tried to create already exists."""
def __init__(self, name, resource_type): def __init__(self, name, resource_type):
@ -125,7 +124,6 @@ class AlreadyExists(HorizonException):
return self.msg % self.attrs return self.msg % self.attrs
@six.python_2_unicode_compatible
class GetFileError(HorizonException): class GetFileError(HorizonException):
"""Exception to be raised when the value of get_file is not expected. """Exception to be raised when the value of get_file is not expected.

View File

@ -17,7 +17,6 @@ import itertools
import re import re
import netaddr import netaddr
import six
from oslo_utils import uuidutils from oslo_utils import uuidutils
@ -278,7 +277,7 @@ class SelectWidget(widgets.Widget):
def get_data_attrs(self, option_label): def get_data_attrs(self, option_label):
other_html = [] other_html = []
if not isinstance(option_label, (six.string_types, Promise)): if not isinstance(option_label, (str, Promise)):
for data_attr in self.data_attrs: for data_attr in self.data_attrs:
data_value = html.conditional_escape( data_value = html.conditional_escape(
force_text(getattr(option_label, force_text(getattr(option_label,
@ -287,7 +286,7 @@ class SelectWidget(widgets.Widget):
return ' '.join(other_html) return ' '.join(other_html)
def transform_option_label(self, option_label): def transform_option_label(self, option_label):
if (not isinstance(option_label, (six.string_types, Promise)) and if (not isinstance(option_label, (str, Promise)) and
callable(self.transform)): callable(self.transform)):
option_label = self.transform(option_label) option_label = self.transform(option_label)
return html.conditional_escape(force_text(option_label)) return html.conditional_escape(force_text(option_label))

View File

@ -15,12 +15,12 @@
import json import json
import logging import logging
import re import re
from urllib import parse
from django.conf import settings from django.conf import settings
from django.contrib import messages as django_messages from django.contrib import messages as django_messages
from django.core.exceptions import MiddlewareNotUsed from django.core.exceptions import MiddlewareNotUsed
import six.moves.urllib.parse as urlparse
from horizon.utils import settings as setting_utils from horizon.utils import settings as setting_utils
@ -123,7 +123,7 @@ class OperationLogMiddleware(object):
method = request.method.upper() method = request.method.upper()
if not (method in self.target_methods): if not (method in self.target_methods):
return return
request_url = urlparse.unquote(request.path) request_url = parse.unquote(request.path)
for rule in self._ignored_urls: for rule in self._ignored_urls:
if rule.search(request_url): if rule.search(request_url):
return return
@ -134,8 +134,8 @@ class OperationLogMiddleware(object):
user = request.user user = request.user
referer_url = None referer_url = None
try: try:
referer_dic = urlparse.urlsplit( referer_dic = parse.urlsplit(
urlparse.unquote(request.META.get('HTTP_REFERER'))) parse.unquote(request.META.get('HTTP_REFERER')))
referer_url = referer_dic[2] referer_url = referer_dic[2]
if referer_dic[3]: if referer_dic[3]:
referer_url += "?" + referer_dic[3] referer_url += "?" + referer_dic[3]
@ -143,7 +143,7 @@ class OperationLogMiddleware(object):
referer_url = referer_url.decode('utf-8') referer_url = referer_url.decode('utf-8')
except Exception: except Exception:
pass pass
request_url = urlparse.unquote(request.path) request_url = parse.unquote(request.path)
if request.META['QUERY_STRING']: if request.META['QUERY_STRING']:
request_url += '?' + request.META['QUERY_STRING'] request_url += '?' + request.META['QUERY_STRING']
return { return {

View File

@ -26,7 +26,6 @@ from django import urls
from django.utils.functional import Promise from django.utils.functional import Promise
from django.utils.http import urlencode from django.utils.http import urlencode
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import six
from horizon import exceptions from horizon import exceptions
from horizon import messages from horizon import messages
@ -82,8 +81,7 @@ class BaseActionMetaClass(type):
return klass return klass
@six.add_metaclass(BaseActionMetaClass) class BaseAction(html.HTMLElement, metaclass=BaseActionMetaClass):
class BaseAction(html.HTMLElement):
"""Common base class for all ``Action`` classes.""" """Common base class for all ``Action`` classes."""
def __init__(self, **kwargs): def __init__(self, **kwargs):
@ -719,7 +717,7 @@ class BatchAction(Action):
count = len(items) count = len(items)
action_attr = getattr(self, "action_%s" % action_type)(count) action_attr = getattr(self, "action_%s" % action_type)(count)
if isinstance(action_attr, (six.string_types, Promise)): if isinstance(action_attr, (str, Promise)):
action = action_attr action = action_attr
else: else:
toggle_selection = getattr(self, "current_%s_action" % action_type) toggle_selection = getattr(self, "current_%s_action" % action_type)

View File

@ -72,7 +72,6 @@ else:
getargspec = inspect.getargspec getargspec = inspect.getargspec
@six.python_2_unicode_compatible
class Column(html.HTMLElement): class Column(html.HTMLElement):
"""A class which represents a single column in a :class:`.DataTable`. """A class which represents a single column in a :class:`.DataTable`.
@ -332,7 +331,7 @@ class Column(html.HTMLElement):
self.transform = transform self.transform = transform
self.name = "<%s callable>" % transform.__name__ self.name = "<%s callable>" % transform.__name__
else: else:
self.transform = six.text_type(transform) self.transform = str(transform)
self.name = self.transform self.name = self.transform
# Empty string is a valid value for verbose_name # Empty string is a valid value for verbose_name
@ -342,7 +341,7 @@ class Column(html.HTMLElement):
else: else:
self.verbose_name = self.transform.title() self.verbose_name = self.transform.title()
else: else:
self.verbose_name = verbose_name self.verbose_name = str(verbose_name)
self.auto = auto self.auto = auto
self.sortable = sortable self.sortable = sortable
@ -386,7 +385,7 @@ class Column(html.HTMLElement):
self.classes.append('anchor') self.classes.append('anchor')
def __str__(self): def __str__(self):
return six.text_type(self.verbose_name) return self.verbose_name
def __repr__(self): def __repr__(self):
return '<%s: %s>' % (self.__class__.__name__, self.name) return '<%s: %s>' % (self.__class__.__name__, self.name)
@ -457,7 +456,7 @@ class Column(html.HTMLElement):
"'%(data)s' on column '%(col_name)s'") "'%(data)s' on column '%(col_name)s'")
args = {'filter': filter_func.__name__, args = {'filter': filter_func.__name__,
'data': data, 'data': data,
'col_name': six.text_type(self.verbose_name)} 'col_name': self.verbose_name}
LOG.warning(msg, args) LOG.warning(msg, args)
if data and self.truncate: if data and self.truncate:
@ -766,7 +765,7 @@ class Cell(html.HTMLElement):
widget = ThemableCheckboxInput(check_test=lambda value: False) widget = ThemableCheckboxInput(check_test=lambda value: False)
# Convert value to string to avoid accidental type conversion # Convert value to string to avoid accidental type conversion
data = widget.render('object_ids', data = widget.render('object_ids',
six.text_type(table.get_object_id(datum)), table.get_object_id(datum),
{'class': 'table-row-multi-select'}) {'class': 'table-row-multi-select'})
table._data_cache[column][table.get_object_id(datum)] = data table._data_cache[column][table.get_object_id(datum)] = data
elif column.auto == "form_field": elif column.auto == "form_field":
@ -776,7 +775,7 @@ class Cell(html.HTMLElement):
widget_name = "%s__%s" % \ widget_name = "%s__%s" % \
(column.name, (column.name,
six.text_type(table.get_object_id(datum))) table.get_object_id(datum))
# Create local copy of attributes, so it don't change column # Create local copy of attributes, so it don't change column
# class form_field_attributes # class form_field_attributes
@ -813,7 +812,7 @@ class Cell(html.HTMLElement):
@property @property
def id(self): def id(self):
return ("%s__%s" % (self.column.name, return ("%s__%s" % (self.column.name,
six.text_type(self.row.table.get_object_id(self.datum)))) self.row.table.get_object_id(self.datum)))
@property @property
def value(self): def value(self):
@ -844,7 +843,7 @@ class Cell(html.HTMLElement):
data = mark_safe('<a href="%s" %s>%s</a>' % ( data = mark_safe('<a href="%s" %s>%s</a>' % (
(escape(self.url), (escape(self.url),
link_attrs, link_attrs,
escape(six.text_type(data))))) escape(data))))
return data return data
@property @property
@ -867,10 +866,10 @@ class Cell(html.HTMLElement):
if self.column.status or \ if self.column.status or \
self.column.name in self.column.table._meta.status_columns: self.column.name in self.column.table._meta.status_columns:
# returns the first matching status found # returns the first matching status found
data_status_lower = six.text_type( data_status_lower = str(
self.column.get_raw_data(self.datum)).lower() self.column.get_raw_data(self.datum)).lower()
for status_name, status_value in self.column.status_choices: for status_name, status_value in self.column.status_choices:
if six.text_type(status_name).lower() == data_status_lower: if str(status_name).lower() == data_status_lower:
self._status = status_value self._status = status_value
return self._status return self._status
self._status = None self._status = None
@ -1149,9 +1148,9 @@ class DataTableOptions(object):
getattr(options, getattr(options,
'table_actions_template', 'table_actions_template',
'horizon/common/_data_table_table_actions.html') 'horizon/common/_data_table_table_actions.html')
self.context_var_name = six.text_type(getattr(options, self.context_var_name = getattr(options,
'context_var_name', 'context_var_name',
'table')) 'table')
self.actions_column = getattr(options, self.actions_column = getattr(options,
'actions_column', 'actions_column',
len(self.row_actions) > 0) len(self.row_actions) > 0)
@ -1266,9 +1265,7 @@ class DataTableMetaclass(type):
return type.__new__(cls, name, bases, dt_attrs) return type.__new__(cls, name, bases, dt_attrs)
@six.python_2_unicode_compatible class DataTable(object, metaclass=DataTableMetaclass):
@six.add_metaclass(DataTableMetaclass)
class DataTable(object):
"""A class which defines a table with all data and associated actions. """A class which defines a table with all data and associated actions.
.. attribute:: name .. attribute:: name
@ -1333,7 +1330,7 @@ class DataTable(object):
self.set_multiselect_column_visibility(bool(batch_actions)) self.set_multiselect_column_visibility(bool(batch_actions))
def __str__(self): def __str__(self):
return six.text_type(self._meta.verbose_name) return str(self._meta.verbose_name)
def __repr__(self): def __repr__(self):
return '<%s: %s>' % (self.__class__.__name__, self._meta.name) return '<%s: %s>' % (self.__class__.__name__, self._meta.name)
@ -1490,17 +1487,13 @@ class DataTable(object):
Uses :meth:`~horizon.tables.DataTable.get_object_id` internally. Uses :meth:`~horizon.tables.DataTable.get_object_id` internally.
""" """
if not isinstance(lookup, six.text_type): if not isinstance(lookup, str):
lookup = str(lookup) lookup = str(lookup)
if six.PY2:
lookup = lookup.decode('utf-8')
matches = [] matches = []
for datum in self.data: for datum in self.data:
obj_id = self.get_object_id(datum) obj_id = self.get_object_id(datum)
if not isinstance(obj_id, six.text_type): if not isinstance(obj_id, str):
obj_id = str(obj_id) obj_id = str(obj_id)
if six.PY2:
obj_id = obj_id.decode('utf-8')
if obj_id == lookup: if obj_id == lookup:
matches.append(datum) matches.append(datum)
if len(matches) > 1: if len(matches) > 1:

View File

@ -11,6 +11,7 @@
# under the License. # under the License.
import collections import collections
import itertools
import logging import logging
import sys import sys
@ -38,8 +39,7 @@ class FormsetCell(horizon_tables.Cell):
if self.field.errors: if self.field.errors:
self.attrs['class'] = (self.attrs.get('class', '') + self.attrs['class'] = (self.attrs.get('class', '') +
' error form-group') ' error form-group')
self.attrs['title'] = ' '.join( self.attrs['title'] = ' '.join(self.field.errors)
six.text_type(error) for error in self.field.errors)
class FormsetRow(horizon_tables.Row): class FormsetRow(horizon_tables.Row):
@ -136,7 +136,7 @@ class FormsetDataTableMixin(object):
else: else:
formset = self.get_formset() formset = self.get_formset()
formset.is_valid() formset.is_valid()
for datum, form in six.moves.zip_longest(self.filtered_data, for datum, form in itertools.zip_longest(self.filtered_data,
formset): formset):
row = self._meta.row_class(self, datum, form) row = self._meta.row_class(self, datum, form)
if self.get_object_id(datum) == self.current_item_id: if self.get_object_id(datum) == self.current_item_id:

View File

@ -316,7 +316,6 @@ class Tab(html.HTMLElement):
# Priority: constructor, class-defined, fallback # Priority: constructor, class-defined, fallback
if not self.name: if not self.name:
raise ValueError("%s must have a name." % self.__class__.__name__) raise ValueError("%s must have a name." % self.__class__.__name__)
self.name = six.text_type(self.name) # Force unicode.
if not self.slug: if not self.slug:
raise ValueError("%s must have a slug." % self.__class__.__name__) raise ValueError("%s must have a slug." % self.__class__.__name__)
self.tab_group = tab_group self.tab_group = tab_group

View File

@ -19,7 +19,6 @@ from django.core.cache import caches
from django.core.cache.utils import make_template_fragment_key from django.core.cache.utils import make_template_fragment_key
from django.dispatch import receiver from django.dispatch import receiver
from django import template from django import template
import six
register = template.Library() register = template.Library()
@ -113,14 +112,8 @@ def angular_templates(context):
result.extend(finder.find(relative_path, True)) result.extend(finder.find(relative_path, True))
path = result[-1] path = result[-1]
try: try:
if six.PY3:
with open(path, encoding='utf-8') as template_file: with open(path, encoding='utf-8') as template_file:
angular_templates[template_static_path] = template_file.\ angular_templates[template_static_path] = template_file.read()
read()
else:
with open(path) as template_file:
angular_templates[template_static_path] = template_file.\
read()
except (OSError, IOError): except (OSError, IOError):
# Failed to read template, leave the template dictionary blank # Failed to read template, leave the template dictionary blank
# If the caller is using this dictionary to pre-populate a cache # If the caller is using this dictionary to pre-populate a cache

View File

@ -38,7 +38,6 @@ from django.test.client import RequestFactory
from django.test import tag from django.test import tag
from django.test import utils as django_test_utils from django.test import utils as django_test_utils
from django.utils.encoding import force_text from django.utils.encoding import force_text
import six
from django.contrib.staticfiles.testing \ from django.contrib.staticfiles.testing \
import StaticLiveServerTestCase as LiveServerTestCase import StaticLiveServerTestCase as LiveServerTestCase
@ -178,14 +177,6 @@ class TestCase(django_test.TestCase):
if hasattr(self.user, "_perm_cache"): if hasattr(self.user, "_perm_cache"):
del self.user._perm_cache del self.user._perm_cache
if six.PY3:
# Python 2 assert methods renamed in Python 3
def assertItemsEqual(self, expected_seq, actual_seq, msg=None):
self.assertCountEqual(expected_seq, actual_seq, msg)
def assertNotRegexpMatches(self, text, unexpected_regexp, msg=None):
self.assertNotRegex(text, unexpected_regexp, msg)
def assertNoMessages(self, response=None): def assertNoMessages(self, response=None):
"""Asserts no messages have been attached by the messages framework. """Asserts no messages have been attached by the messages framework.

View File

@ -25,9 +25,7 @@ from django.template import defaultfilters
from django.test.utils import override_settings from django.test.utils import override_settings
from django.urls import reverse from django.urls import reverse
from django.utils.translation import ungettext_lazy from django.utils.translation import ungettext_lazy
import mock import mock
import six
from horizon import exceptions from horizon import exceptions
from horizon import tables from horizon import tables
@ -421,7 +419,7 @@ class DataTableTests(test.TestCase):
self.assertTrue(self.table._meta.actions_column) self.assertTrue(self.table._meta.actions_column)
self.assertTrue(self.table._meta.multi_select) self.assertTrue(self.table._meta.multi_select)
# Test for verbose_name # Test for verbose_name
self.assertEqual(u"My Table", six.text_type(self.table)) self.assertEqual(u"My Table", str(self.table))
# Column ordering and exclusion. # Column ordering and exclusion.
# This should include auto-columns for multi_select and actions, # This should include auto-columns for multi_select and actions,
# but should not contain the excluded column. # but should not contain the excluded column.
@ -603,8 +601,8 @@ class DataTableTests(test.TestCase):
self.assertEqual('1', row.cells['id'].data) # Standard attr access self.assertEqual('1', row.cells['id'].data) # Standard attr access
self.assertEqual('custom object_1', row.cells['name'].data) # Callable self.assertEqual('custom object_1', row.cells['name'].data) # Callable
# name and verbose_name # name and verbose_name
self.assertEqual("Id", six.text_type(id_col)) self.assertEqual("Id", str(id_col))
self.assertEqual("Verbose Name", six.text_type(name_col)) self.assertEqual("Verbose Name", str(name_col))
# sortable # sortable
self.assertFalse(id_col.sortable) self.assertFalse(id_col.sortable)
self.assertNotIn("sortable", id_col.get_final_attrs().get('class', "")) self.assertNotIn("sortable", id_col.get_final_attrs().get('class', ""))
@ -821,7 +819,7 @@ class DataTableTests(test.TestCase):
self.assertIsNone(handled) self.assertIsNone(handled)
self.assertQuerysetEqual(self.table.filtered_data, self.assertQuerysetEqual(self.table.filtered_data,
['FakeObject: object_2'], ['FakeObject: object_2'],
transform=six.text_type) transform=str)
# with empty filter string, it should return all data # with empty filter string, it should return all data
req = self.factory.post('/my_url/', {action_string: ''}) req = self.factory.post('/my_url/', {action_string: ''})
@ -833,7 +831,7 @@ class DataTableTests(test.TestCase):
'FakeObject: object_2', 'FakeObject: object_2',
'FakeObject: object_3', 'FakeObject: object_3',
u'FakeObject: öbject_4'], u'FakeObject: öbject_4'],
transform=six.text_type) transform=str)
# with unknown value it should return empty list # with unknown value it should return empty list
req = self.factory.post('/my_url/', {action_string: 'horizon'}) req = self.factory.post('/my_url/', {action_string: 'horizon'})
@ -889,15 +887,13 @@ class DataTableTests(test.TestCase):
req = self.factory.get('/my_url/') req = self.factory.get('/my_url/')
self.table = MyTable(req, TEST_DATA_3) self.table = MyTable(req, TEST_DATA_3)
toggle_action = self.table.get_row_actions(TEST_DATA_3[0])[2] toggle_action = self.table.get_row_actions(TEST_DATA_3[0])[2]
self.assertEqual("Batch Item", self.assertEqual("Batch Item", toggle_action.verbose_name)
six.text_type(toggle_action.verbose_name))
# Batch action with custom help text # Batch action with custom help text
req = self.factory.get('/my_url/') req = self.factory.get('/my_url/')
self.table = MyTable(req, TEST_DATA_3) self.table = MyTable(req, TEST_DATA_3)
toggle_action = self.table.get_row_actions(TEST_DATA_3[0])[4] toggle_action = self.table.get_row_actions(TEST_DATA_3[0])[4]
self.assertEqual("BatchHelp Item", self.assertEqual("BatchHelp Item", toggle_action.verbose_name)
six.text_type(toggle_action.verbose_name))
# Single object toggle action # Single object toggle action
# GET page - 'up' to 'down' # GET page - 'up' to 'down'
@ -905,8 +901,7 @@ class DataTableTests(test.TestCase):
self.table = MyTable(req, TEST_DATA_3) self.table = MyTable(req, TEST_DATA_3)
self.assertEqual(5, len(self.table.get_row_actions(TEST_DATA_3[0]))) self.assertEqual(5, len(self.table.get_row_actions(TEST_DATA_3[0])))
toggle_action = self.table.get_row_actions(TEST_DATA_3[0])[3] toggle_action = self.table.get_row_actions(TEST_DATA_3[0])[3]
self.assertEqual("Down Item", self.assertEqual("Down Item", toggle_action.verbose_name)
six.text_type(toggle_action.verbose_name))
# Toggle from status 'up' to 'down' # Toggle from status 'up' to 'down'
# POST page # POST page
@ -927,7 +922,7 @@ class DataTableTests(test.TestCase):
self.table = MyTable(req, TEST_DATA_2) self.table = MyTable(req, TEST_DATA_2)
self.assertEqual(4, len(self.table.get_row_actions(TEST_DATA_2[0]))) self.assertEqual(4, len(self.table.get_row_actions(TEST_DATA_2[0])))
toggle_action = self.table.get_row_actions(TEST_DATA_2[0])[2] toggle_action = self.table.get_row_actions(TEST_DATA_2[0])[2]
self.assertEqual("Up Item", six.text_type(toggle_action.verbose_name)) self.assertEqual("Up Item", toggle_action.verbose_name)
# POST page # POST page
action_string = "my_table__toggle__2" action_string = "my_table__toggle__2"
@ -1008,7 +1003,7 @@ class DataTableTests(test.TestCase):
self.assertIsNone(handled) self.assertIsNone(handled)
self.assertQuerysetEqual(self.table.filtered_data, self.assertQuerysetEqual(self.table.filtered_data,
['FakeObject: object_2'], ['FakeObject: object_2'],
transform=six.text_type) transform=str)
# Ensure filtering respects the request method, e.g. no filter here # Ensure filtering respects the request method, e.g. no filter here
req = self.factory.get('/my_url/', {action_string: '2'}) req = self.factory.get('/my_url/', {action_string: '2'})
@ -1020,7 +1015,7 @@ class DataTableTests(test.TestCase):
'FakeObject: object_2', 'FakeObject: object_2',
'FakeObject: object_3', 'FakeObject: object_3',
u'FakeObject: öbject_4'], u'FakeObject: öbject_4'],
transform=six.text_type) transform=str)
# Updating and preemptive actions # Updating and preemptive actions
params = {"table": "my_table", "action": "row_update", "obj_id": "1"} params = {"table": "my_table", "action": "row_update", "obj_id": "1"}
@ -1046,16 +1041,12 @@ class DataTableTests(test.TestCase):
# Verbose names # Verbose names
table_actions = self.table.get_table_actions() table_actions = self.table.get_table_actions()
self.assertEqual("Filter", self.assertEqual("Filter", table_actions[0].verbose_name)
six.text_type(table_actions[0].verbose_name)) self.assertEqual("Delete Me", table_actions[1].verbose_name)
self.assertEqual("Delete Me",
six.text_type(table_actions[1].verbose_name))
row_actions = self.table.get_row_actions(TEST_DATA[0]) row_actions = self.table.get_row_actions(TEST_DATA[0])
self.assertEqual("Delete Me", self.assertEqual("Delete Me", row_actions[0].verbose_name)
six.text_type(row_actions[0].verbose_name)) self.assertEqual("Log In", row_actions[1].verbose_name)
self.assertEqual("Log In",
six.text_type(row_actions[1].verbose_name))
def test_server_filtering(self): def test_server_filtering(self):
filter_value_param = "my_table__filter__q" filter_value_param = "my_table__filter__q"
@ -1070,7 +1061,7 @@ class DataTableTests(test.TestCase):
self.assertIsNone(handled) self.assertIsNone(handled)
self.assertQuerysetEqual(self.table.filtered_data, self.assertQuerysetEqual(self.table.filtered_data,
['FakeObject: object_2'], ['FakeObject: object_2'],
transform=six.text_type) transform=str)
# Ensure API filtering does not filter on server, e.g. no filter here # Ensure API filtering does not filter on server, e.g. no filter here
req = self.factory.post('/my_url/') req = self.factory.post('/my_url/')
@ -1084,7 +1075,7 @@ class DataTableTests(test.TestCase):
'FakeObject: object_2', 'FakeObject: object_2',
'FakeObject: object_3', 'FakeObject: object_3',
u'FakeObject: öbject_4'], u'FakeObject: öbject_4'],
transform=six.text_type) transform=str)
def test_column_uniqueness(self): def test_column_uniqueness(self):
table1 = MyTable(self.request) table1 = MyTable(self.request)
@ -1195,8 +1186,8 @@ class DataTableTests(test.TestCase):
self.assertEqual('1', row.cells['id'].data) # Standard attr access self.assertEqual('1', row.cells['id'].data) # Standard attr access
self.assertEqual('custom object_1', row.cells['name'].data) # Callable self.assertEqual('custom object_1', row.cells['name'].data) # Callable
# name and verbose_name # name and verbose_name
self.assertEqual("Id", six.text_type(id_col)) self.assertEqual("Id", str(id_col))
self.assertEqual("Verbose Name", six.text_type(name_col)) self.assertEqual("Verbose Name", str(name_col))
self.assertIn("sortable", name_col.get_final_attrs().get('class', "")) self.assertIn("sortable", name_col.get_final_attrs().get('class', ""))
# hidden # hidden
self.assertTrue(id_col.hidden) self.assertTrue(id_col.hidden)
@ -1378,7 +1369,7 @@ class DataTableViewTests(test.TestCase):
'FakeObject: object_2', 'FakeObject: object_2',
'FakeObject: object_3', 'FakeObject: object_3',
u'FakeObject: öbject_4'], u'FakeObject: öbject_4'],
transform=six.text_type) transform=str)
self.assertEqual(req.session.get(self.fil_value_param), 'up') self.assertEqual(req.session.get(self.fil_value_param), 'up')
self.assertEqual(req.session.get(self.fil_field_param), 'status') self.assertEqual(req.session.get(self.fil_field_param), 'status')

View File

@ -20,8 +20,6 @@ from django.conf import settings
from django import http from django import http
from django.test.utils import override_settings from django.test.utils import override_settings
import six
from horizon import exceptions from horizon import exceptions
from horizon import middleware from horizon import middleware
from horizon import tabs as horizon_tabs from horizon import tabs as horizon_tabs
@ -299,7 +297,7 @@ class TabTests(test.TestCase):
'FakeObject: object_2', 'FakeObject: object_2',
'FakeObject: object_3', 'FakeObject: object_3',
u'FakeObject: öbject_4'], u'FakeObject: öbject_4'],
transform=six.text_type) transform=str)
context = tab.get_context_data(self.request) context = tab.get_context_data(self.request)
# Make sure our table is loaded into the context correctly # Make sure our table is loaded into the context correctly
self.assertEqual(table, context['my_table_table']) self.assertEqual(table, context['my_table_table'])

View File

@ -17,10 +17,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from importlib import import_module import importlib
import six
from six import moves
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
@ -106,7 +103,7 @@ class BaseHorizonTests(test.TestCase):
del base.Horizon del base.Horizon
base.Horizon = base.HorizonSite() base.Horizon = base.HorizonSite()
# Reload the convenience references to Horizon stored in __init__ # Reload the convenience references to Horizon stored in __init__
moves.reload_module(import_module("horizon")) importlib.reload(importlib.import_module("horizon"))
# Re-register our original dashboards and panels. # Re-register our original dashboards and panels.
# This is necessary because autodiscovery only works on the first # This is necessary because autodiscovery only works on the first
# import, and calling reload introduces innumerable additional # import, and calling reload introduces innumerable additional
@ -126,7 +123,7 @@ class BaseHorizonTests(test.TestCase):
Useful only for testing and should never be used on a live site. Useful only for testing and should never be used on a live site.
""" """
urls.clear_url_caches() urls.clear_url_caches()
moves.reload_module(import_module(settings.ROOT_URLCONF)) importlib.reload(importlib.import_module(settings.ROOT_URLCONF))
base.Horizon._urls() base.Horizon._urls()
@ -168,7 +165,7 @@ class HorizonTests(BaseHorizonTests):
horizon.get_dashboard(MyDash) horizon.get_dashboard(MyDash)
def test_site(self): def test_site(self):
self.assertEqual("Horizon", six.text_type(base.Horizon)) self.assertEqual("Horizon", str(base.Horizon))
self.assertEqual("<Site: horizon>", repr(base.Horizon)) self.assertEqual("<Site: horizon>", repr(base.Horizon))
dash = base.Horizon.get_dashboard('cats') dash = base.Horizon.get_dashboard('cats')
self.assertEqual(dash, base.Horizon.get_default_dashboard()) self.assertEqual(dash, base.Horizon.get_default_dashboard())
@ -499,7 +496,7 @@ class RbacHorizonTests(test.TestCase):
del base.Horizon del base.Horizon
base.Horizon = base.HorizonSite() base.Horizon = base.HorizonSite()
# Reload the convenience references to Horizon stored in __init__ # Reload the convenience references to Horizon stored in __init__
moves.reload_module(import_module("horizon")) importlib.reload(importlib.import_module("horizon"))
# Reset Cats and Dogs default_panel to default values # Reset Cats and Dogs default_panel to default values
Cats.default_panel = 'kittens' Cats.default_panel = 'kittens'

View File

@ -37,7 +37,7 @@ class HandleTests(test.TestCase):
# The real test here is to make sure the handle method doesn't throw a # The real test here is to make sure the handle method doesn't throw a
# UnicodeEncodeError, but making sure the message is correct and # UnicodeEncodeError, but making sure the message is correct and
# useful as well. # useful as well.
self.assertItemsEqual(req.horizon['async_messages'], [expected]) self.assertCountEqual(req.horizon['async_messages'], [expected])
def test_handle_message_as_recoverable(self): def test_handle_message_as_recoverable(self):
# tests that if a message is passed to handle that it is treated # tests that if a message is passed to handle that it is treated

View File

@ -29,10 +29,10 @@ class MessageTests(test.TestCase):
string = "Giant ants are attacking San Francisco!" string = "Giant ants are attacking San Francisco!"
expected = ["error", force_text(string), ""] expected = ["error", force_text(string), ""]
self.assertIn("async_messages", req.horizon) self.assertIn("async_messages", req.horizon)
self.assertItemsEqual(req.horizon['async_messages'], []) self.assertCountEqual(req.horizon['async_messages'], [])
req.META['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest' req.META['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
messages.error(req, string) messages.error(req, string)
self.assertItemsEqual(req.horizon['async_messages'], [expected]) self.assertCountEqual(req.horizon['async_messages'], [expected])
res = http.HttpResponse() res = http.HttpResponse()
res = middleware.HorizonMiddleware('dummy_get_response') \ res = middleware.HorizonMiddleware('dummy_get_response') \
._process_response(req, res) ._process_response(req, res)
@ -44,10 +44,10 @@ class MessageTests(test.TestCase):
string = mark_safe("We are now safe from ants! Go <a>here</a>!") string = mark_safe("We are now safe from ants! Go <a>here</a>!")
expected = ["error", force_text(string), " safe"] expected = ["error", force_text(string), " safe"]
self.assertIn("async_messages", req.horizon) self.assertIn("async_messages", req.horizon)
self.assertItemsEqual(req.horizon['async_messages'], []) self.assertCountEqual(req.horizon['async_messages'], [])
req.META['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest' req.META['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'
messages.error(req, string) messages.error(req, string)
self.assertItemsEqual(req.horizon['async_messages'], [expected]) self.assertCountEqual(req.horizon['async_messages'], [expected])
res = http.HttpResponse() res = http.HttpResponse()
res = middleware.HorizonMiddleware('dummy_get_response') \ res = middleware.HorizonMiddleware('dummy_get_response') \
._process_response(req, res) ._process_response(req, res)

View File

@ -13,7 +13,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from six import StringIO import io
from horizon.test import helpers as test from horizon.test import helpers as test
from horizon.utils.babel_extract_angular import extract_angular from horizon.utils.babel_extract_angular import extract_angular
@ -24,13 +24,13 @@ default_keys = []
class ExtractAngularTestCase(test.TestCase): class ExtractAngularTestCase(test.TestCase):
def test_extract_no_tags(self): def test_extract_no_tags(self):
buf = StringIO('<html></html>') buf = io.StringIO('<html></html>')
messages = list(extract_angular(buf, default_keys, [], {})) messages = list(extract_angular(buf, default_keys, [], {}))
self.assertEqual([], messages) self.assertEqual([], messages)
def test_simple_string(self): def test_simple_string(self):
buf = StringIO( buf = io.StringIO(
"""<html><translate>hello world!</translate>' """<html><translate>hello world!</translate>'
<div translate>hello world!</div></html>""" <div translate>hello world!</div></html>"""
) )
@ -45,27 +45,27 @@ class ExtractAngularTestCase(test.TestCase):
def test_attr_value(self): def test_attr_value(self):
"""Should not translate tags with translate as the value of an attr.""" """Should not translate tags with translate as the value of an attr."""
buf = StringIO('<html><div id="translate">hello world!</div></html>') buf = io.StringIO('<html><div id="translate">hello world!</div></html>')
messages = list(extract_angular(buf, [], [], {})) messages = list(extract_angular(buf, [], [], {}))
self.assertEqual([], messages) self.assertEqual([], messages)
def test_attr_value_plus_directive(self): def test_attr_value_plus_directive(self):
"""Unless they also have a translate directive.""" """Unless they also have a translate directive."""
buf = StringIO( buf = io.StringIO(
'<html><div id="translate" translate>hello world!</div></html>') '<html><div id="translate" translate>hello world!</div></html>')
messages = list(extract_angular(buf, [], [], {})) messages = list(extract_angular(buf, [], [], {}))
self.assertEqual([(1, 'gettext', 'hello world!', [])], messages) self.assertEqual([(1, 'gettext', 'hello world!', [])], messages)
def test_translate_tag(self): def test_translate_tag(self):
buf = StringIO('<html><translate>hello world!</translate></html>') buf = io.StringIO('<html><translate>hello world!</translate></html>')
messages = list(extract_angular(buf, [], [], {})) messages = list(extract_angular(buf, [], [], {}))
self.assertEqual([(1, 'gettext', 'hello world!', [])], messages) self.assertEqual([(1, 'gettext', 'hello world!', [])], messages)
def test_plural_form(self): def test_plural_form(self):
buf = StringIO( buf = io.StringIO(
( (
'<html><translate translate-plural="hello {$count$} worlds!">' '<html><translate translate-plural="hello {$count$} worlds!">'
'hello one world!</translate></html>' 'hello one world!</translate></html>'
@ -82,7 +82,7 @@ class ExtractAngularTestCase(test.TestCase):
], messages) ], messages)
def test_translate_tag_comments(self): def test_translate_tag_comments(self):
buf = StringIO( buf = io.StringIO(
'<html><translate translate-comment=' '<html><translate translate-comment='
'"What a beautiful world">hello world!</translate></html>') '"What a beautiful world">hello world!</translate></html>')
@ -94,7 +94,7 @@ class ExtractAngularTestCase(test.TestCase):
messages) messages)
def test_comments(self): def test_comments(self):
buf = StringIO( buf = io.StringIO(
'<html><div translate translate-comment=' '<html><div translate translate-comment='
'"What a beautiful world">hello world!</div></html>') '"What a beautiful world">hello world!</div></html>')
@ -106,7 +106,7 @@ class ExtractAngularTestCase(test.TestCase):
messages) messages)
def test_multiple_comments(self): def test_multiple_comments(self):
buf = StringIO( buf = io.StringIO(
'<html><translate ' '<html><translate '
'translate-comment="What a beautiful world"' 'translate-comment="What a beautiful world"'
'translate-comment="Another comment"' 'translate-comment="Another comment"'
@ -125,7 +125,7 @@ class ExtractAngularTestCase(test.TestCase):
def test_filter(self): def test_filter(self):
# test also for some forms that should not match # test also for some forms that should not match
buf = StringIO( buf = io.StringIO(
""" """
<img alt="{$ 'hello world1' | translate $}"> <img alt="{$ 'hello world1' | translate $}">
<p>{$'hello world2'|translate$}</p> <p>{$'hello world2'|translate$}</p>
@ -167,7 +167,7 @@ class ExtractAngularTestCase(test.TestCase):
messages) messages)
def test_trim_translate_tag(self): def test_trim_translate_tag(self):
buf = StringIO( buf = io.StringIO(
"<html><translate> \n hello\n world! \n " "<html><translate> \n hello\n world! \n "
"</translate></html>") "</translate></html>")
@ -175,7 +175,7 @@ class ExtractAngularTestCase(test.TestCase):
self.assertEqual([(1, 'gettext', 'hello\n world!', [])], messages) self.assertEqual([(1, 'gettext', 'hello\n world!', [])], messages)
def test_nested_translate_tag(self): def test_nested_translate_tag(self):
buf = StringIO( buf = io.StringIO(
"<html><translate>hello <b>beautiful <i>world</i></b> !" "<html><translate>hello <b>beautiful <i>world</i></b> !"
"</translate></html>" "</translate></html>"
) )
@ -186,7 +186,7 @@ class ExtractAngularTestCase(test.TestCase):
messages) messages)
def test_nested_variations(self): def test_nested_variations(self):
buf = StringIO( buf = io.StringIO(
''' '''
<p translate>To <a href="link">link</a> here</p> <p translate>To <a href="link">link</a> here</p>
<p translate>To <!-- a comment!! --> here</p> <p translate>To <!-- a comment!! --> here</p>

View File

@ -12,11 +12,10 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from django import forms
from django import http
import mock import mock
import six from django import forms
from django import http
from horizon import base from horizon import base
from horizon import exceptions from horizon import exceptions
@ -345,10 +344,10 @@ class WorkflowsTests(test.TestCase):
req = self.factory.get("/foo") req = self.factory.get("/foo")
flow = TestWorkflow(req) flow = TestWorkflow(req)
output = http.HttpResponse(flow.render()) output = http.HttpResponse(flow.render())
self.assertContains(output, six.text_type(flow.name)) self.assertContains(output, flow.name)
self.assertContains(output, six.text_type(TestActionOne.name)) self.assertContains(output, TestActionOne.name)
self.assertContains(output, six.text_type(TestActionTwo.name)) self.assertContains(output, TestActionTwo.name)
self.assertContains(output, six.text_type(TestActionThree.name)) self.assertContains(output, TestActionThree.name)
def test_has_permissions(self): def test_has_permissions(self):
self.assertQuerysetEqual(TestWorkflow._cls_registry, []) self.assertQuerysetEqual(TestWorkflow._cls_registry, [])
@ -356,7 +355,7 @@ class WorkflowsTests(test.TestCase):
flow = TestWorkflow(self.request) flow = TestWorkflow(self.request)
step = AdminStep(flow) step = AdminStep(flow)
self.assertItemsEqual(step.permissions, self.assertCountEqual(step.permissions,
("horizon.test",)) ("horizon.test",))
self.assertQuerysetEqual(flow.steps, self.assertQuerysetEqual(flow.steps,
['<TestStepOne: test_action_one>', ['<TestStepOne: test_action_one>',
@ -391,8 +390,7 @@ class WorkflowsTests(test.TestCase):
TestWorkflow.register(AdminForbiddenStep) TestWorkflow.register(AdminForbiddenStep)
flow = TestWorkflow(self.request) flow = TestWorkflow(self.request)
output = http.HttpResponse(flow.render()) output = http.HttpResponse(flow.render())
self.assertNotContains(output, self.assertNotContains(output, AdminForbiddenAction.name)
six.text_type(AdminForbiddenAction.name))
def test_entry_point(self): def test_entry_point(self):
req = self.factory.get("/foo") req = self.factory.get("/foo")

View File

@ -13,10 +13,10 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from html import parser
import re import re
from oslo_utils import encodeutils from oslo_utils import encodeutils
from six.moves import html_parser
# regex to find filter translation expressions # regex to find filter translation expressions
@ -35,7 +35,7 @@ HTML_ENTITY_DECODED = {
} }
class AngularGettextHTMLParser(html_parser.HTMLParser): class AngularGettextHTMLParser(parser.HTMLParser):
"""Parse HTML to find translate directives. """Parse HTML to find translate directives.
Currently this parses for these forms of translation: Currently this parses for these forms of translation:
@ -54,13 +54,9 @@ class AngularGettextHTMLParser(html_parser.HTMLParser):
""" """
def __init__(self): def __init__(self):
try:
super(AngularGettextHTMLParser, self).__init__( super(AngularGettextHTMLParser, self).__init__(
convert_charrefs=False convert_charrefs=False
) )
except TypeError:
# handle HTMLParser not being a type on Python 2
html_parser.HTMLParser.__init__(self)
self.in_translate = False self.in_translate = False
self.inner_tags = [] self.inner_tags = []

View File

@ -13,13 +13,11 @@
from __future__ import division from __future__ import division
import csv import csv
import io
from django.http import HttpResponse from django.http import HttpResponse
from django.http import StreamingHttpResponse from django.http import StreamingHttpResponse
from django import template as django_template from django import template as django_template
import six
from six import StringIO
class CsvDataMixin(object): class CsvDataMixin(object):
@ -32,7 +30,7 @@ class CsvDataMixin(object):
will be shown in the result file. Optional. will be shown in the result file. Optional.
""" """
def __init__(self): def __init__(self):
self.out = StringIO() self.out = io.StringIO()
super(CsvDataMixin, self).__init__() super(CsvDataMixin, self).__init__()
if hasattr(self, "columns"): if hasattr(self, "columns"):
columns = [self.encode(col) for col in self.columns] columns = [self.encode(col) for col in self.columns]
@ -61,12 +59,7 @@ class CsvDataMixin(object):
self.writer.writerow([self.encode(col) for col in args]) self.writer.writerow([self.encode(col) for col in args])
def encode(self, value): def encode(self, value):
value = six.text_type(value) return str(value)
if six.PY2:
# csv and StringIO cannot work with mixed encodings,
# so encode all with utf-8
value = value.encode('utf-8')
return value
class BaseCsvResponse(CsvDataMixin, HttpResponse): class BaseCsvResponse(CsvDataMixin, HttpResponse):

View File

@ -16,7 +16,6 @@ import math
import re import re
from oslo_utils import units from oslo_utils import units
import six
from django.conf import settings from django.conf import settings
from django.contrib.auth import logout from django.contrib.auth import logout
@ -31,7 +30,7 @@ def _lazy_join(separator, strings):
for s in strings]) for s in strings])
lazy_join = lazy(_lazy_join, six.text_type) lazy_join = lazy(_lazy_join, str)
def bytes_to_gigabytes(bytes): def bytes_to_gigabytes(bytes):
@ -44,9 +43,7 @@ def add_logout_reason(request, response, reason, status='success'):
# Store the translated string in the cookie # Store the translated string in the cookie
lang = translation.get_language_from_request(request) lang = translation.get_language_from_request(request)
with translation.override(lang): with translation.override(lang):
reason = six.text_type(reason) reason = str(reason)
if six.PY2:
reason = reason.encode('utf-8')
response.set_cookie('logout_reason', reason, max_age=10) response.set_cookie('logout_reason', reason, max_age=10)
response.set_cookie('logout_status', status, max_age=10) response.set_cookie('logout_status', status, max_age=10)

View File

@ -20,8 +20,6 @@ from django_pyscss import DjangoScssCompiler
from scss.namespace import Namespace from scss.namespace import Namespace
from scss.types import String from scss.types import String
import six
class HorizonScssFilter(DjangoScssFilter): class HorizonScssFilter(DjangoScssFilter):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -32,7 +30,7 @@ class HorizonScssFilter(DjangoScssFilter):
# Add variables to the SCSS Global Namespace Here # Add variables to the SCSS Global Namespace Here
self.namespace.set_variable( self.namespace.set_variable(
'$static_url', '$static_url',
String(six.text_type(settings.STATIC_URL)) String(settings.STATIC_URL)
) )
# Create a compiler with the right namespace # Create a compiler with the right namespace

View File

@ -10,8 +10,6 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import six
from django.conf import settings from django.conf import settings
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
@ -19,7 +17,7 @@ from horizon import defaults
def import_object(name_or_object): def import_object(name_or_object):
if isinstance(name_or_object, six.string_types): if isinstance(name_or_object, str):
return import_string(name_or_object) return import_string(name_or_object)
return name_or_object return name_or_object

View File

@ -30,7 +30,6 @@ from django.utils.encoding import force_text
from django.utils import module_loading from django.utils import module_loading
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from openstack_auth import policy from openstack_auth import policy
import six
from horizon import base from horizon import base
from horizon import exceptions from horizon import exceptions
@ -78,9 +77,7 @@ class ActionMetaclass(forms.forms.DeclarativeFieldsMetaclass):
return cls_ return cls_
@six.python_2_unicode_compatible class Action(forms.Form, metaclass=ActionMetaclass):
@six.add_metaclass(ActionMetaclass)
class Action(forms.Form):
"""An ``Action`` represents an atomic logical interaction with the system. """An ``Action`` represents an atomic logical interaction with the system.
This is easier to understand with a conceptual example: in the context of This is easier to understand with a conceptual example: in the context of
@ -216,7 +213,6 @@ class MembershipAction(Action):
return self.slug + "_role_" + role_id return self.slug + "_role_" + role_id
@six.python_2_unicode_compatible
class Step(object): class Step(object):
"""A wrapper around an action which defines its context in a workflow. """A wrapper around an action which defines its context in a workflow.
@ -348,7 +344,7 @@ class Step(object):
# If it's callable we know the function exists and is valid # If it's callable we know the function exists and is valid
self._handlers[key].append(possible_handler) self._handlers[key].append(possible_handler)
continue continue
elif not isinstance(possible_handler, six.string_types): elif not isinstance(possible_handler, str):
raise TypeError("Connection handlers must be either " raise TypeError("Connection handlers must be either "
"callables or strings.") "callables or strings.")
bits = possible_handler.split(".") bits = possible_handler.split(".")
@ -525,9 +521,7 @@ class UpdateMembersStep(Step):
return self.slug + "_role_" + role_id return self.slug + "_role_" + role_id
@six.python_2_unicode_compatible class Workflow(html.HTMLElement, metaclass=WorkflowMetaclass):
@six.add_metaclass(WorkflowMetaclass)
class Workflow(html.HTMLElement):
"""A Workflow is a collection of Steps. """A Workflow is a collection of Steps.
Its interface is very straightforward, but it is responsible for handling Its interface is very straightforward, but it is responsible for handling

View File

@ -20,8 +20,6 @@ from django import http
from django import shortcuts from django import shortcuts
from django.views import generic from django.views import generic
import six
from horizon import exceptions from horizon import exceptions
from horizon.forms import views as hz_views from horizon.forms import views as hz_views
from horizon.forms.views import ADD_TO_FIELD_HEADER from horizon.forms.views import ADD_TO_FIELD_HEADER
@ -159,7 +157,7 @@ class WorkflowView(hz_views.ModalBackdropMixin, generic.TemplateView):
for step in workflow.steps[start:end + 1]: for step in workflow.steps[start:end + 1]:
if not step.action.is_valid(): if not step.action.is_valid():
errors[step.slug] = dict( errors[step.slug] = dict(
(field, [six.text_type(error) for error in errors]) (field, [str(error) for error in errors])
for (field, errors) in step.action.errors.items()) for (field, errors) in step.action.errors.items())
return { return {
'has_errors': bool(errors), 'has_errors': bool(errors),

View File

@ -220,9 +220,9 @@ class AggregatesViewTests(test.BaseAdminViewTests):
res = self.client.get(reverse(constants.AGGREGATES_INDEX_URL)) res = self.client.get(reverse(constants.AGGREGATES_INDEX_URL))
self.assertTemplateUsed(res, constants.AGGREGATES_INDEX_VIEW_TEMPLATE) self.assertTemplateUsed(res, constants.AGGREGATES_INDEX_VIEW_TEMPLATE)
self.assertItemsEqual(res.context['host_aggregates_table'].data, self.assertCountEqual(res.context['host_aggregates_table'].data,
self.aggregates.list()) self.aggregates.list())
self.assertItemsEqual(res.context['availability_zones_table'].data, self.assertCountEqual(res.context['availability_zones_table'].data,
self.availability_zones.list()) self.availability_zones.list())
self.mock_aggregate_details_list.assert_called_once_with( self.mock_aggregate_details_list.assert_called_once_with(
test.IsHttpRequest()) test.IsHttpRequest())

View File

@ -34,7 +34,7 @@ class FlavorsViewTests(test.BaseAdminViewTests):
res = self.client.get(reverse(constants.FLAVORS_INDEX_URL)) res = self.client.get(reverse(constants.FLAVORS_INDEX_URL))
self.assertTemplateUsed(res, constants.FLAVORS_TEMPLATE_NAME) self.assertTemplateUsed(res, constants.FLAVORS_TEMPLATE_NAME)
self.assertItemsEqual(res.context['table'].data, self.flavors.list()) self.assertCountEqual(res.context['table'].data, self.flavors.list())
self.mock_flavor_list_paged.assert_called_once_with( self.mock_flavor_list_paged.assert_called_once_with(
test.IsHttpRequest(), None, marker=None, paginate=True, test.IsHttpRequest(), None, marker=None, paginate=True,
@ -57,13 +57,13 @@ class FlavorsViewTests(test.BaseAdminViewTests):
# get all # get all
res = self.client.get(reverse(constants.FLAVORS_INDEX_URL)) res = self.client.get(reverse(constants.FLAVORS_INDEX_URL))
self.assertTemplateUsed(res, constants.FLAVORS_TEMPLATE_NAME) self.assertTemplateUsed(res, constants.FLAVORS_TEMPLATE_NAME)
self.assertItemsEqual(res.context['table'].data, self.assertCountEqual(res.context['table'].data,
self.flavors.list()[:5]) self.flavors.list()[:5])
# get first page with 2 items # get first page with 2 items
res = self.client.get(reverse(constants.FLAVORS_INDEX_URL)) res = self.client.get(reverse(constants.FLAVORS_INDEX_URL))
self.assertTemplateUsed(res, constants.FLAVORS_TEMPLATE_NAME) self.assertTemplateUsed(res, constants.FLAVORS_TEMPLATE_NAME)
self.assertItemsEqual(res.context['table'].data, self.assertCountEqual(res.context['table'].data,
self.flavors.list()[:2]) self.flavors.list()[:2])
# get second page (items 2-4) # get second page (items 2-4)
@ -71,7 +71,7 @@ class FlavorsViewTests(test.BaseAdminViewTests):
flavors_list[2].id]) flavors_list[2].id])
url = "?".join([reverse(constants.FLAVORS_INDEX_URL), params]) url = "?".join([reverse(constants.FLAVORS_INDEX_URL), params])
res = self.client.get(url) res = self.client.get(url)
self.assertItemsEqual(res.context['table'].data, self.assertCountEqual(res.context['table'].data,
self.flavors.list()[2:4]) self.flavors.list()[2:4])
self.mock_flavor_list_paged.assert_has_calls([ self.mock_flavor_list_paged.assert_has_calls([
@ -108,13 +108,13 @@ class FlavorsViewTests(test.BaseAdminViewTests):
# get all # get all
res = self.client.get(reverse(constants.FLAVORS_INDEX_URL)) res = self.client.get(reverse(constants.FLAVORS_INDEX_URL))
self.assertTemplateUsed(res, constants.FLAVORS_TEMPLATE_NAME) self.assertTemplateUsed(res, constants.FLAVORS_TEMPLATE_NAME)
self.assertItemsEqual(res.context['table'].data, self.assertCountEqual(res.context['table'].data,
self.flavors.list()[:3]) self.flavors.list()[:3])
# get first page with 2 items # get first page with 2 items
res = self.client.get(reverse(constants.FLAVORS_INDEX_URL)) res = self.client.get(reverse(constants.FLAVORS_INDEX_URL))
self.assertEqual(len(res.context['table'].data), self.assertEqual(len(res.context['table'].data),
settings.API_RESULT_PAGE_SIZE) settings.API_RESULT_PAGE_SIZE)
self.assertItemsEqual(res.context['table'].data, self.assertCountEqual(res.context['table'].data,
self.flavors.list()[:2]) self.flavors.list()[:2])
params = "=".join([tables.FlavorsTable._meta.pagination_param, params = "=".join([tables.FlavorsTable._meta.pagination_param,
flavors_list[2].id]) flavors_list[2].id])
@ -122,7 +122,7 @@ class FlavorsViewTests(test.BaseAdminViewTests):
res = self.client.get(url) res = self.client.get(url)
# get second page (item 3) # get second page (item 3)
self.assertEqual(len(res.context['table'].data), 1) self.assertEqual(len(res.context['table'].data), 1)
self.assertItemsEqual(res.context['table'].data, self.assertCountEqual(res.context['table'].data,
self.flavors.list()[2:3]) self.flavors.list()[2:3])
params = "=".join([tables.FlavorsTable._meta.prev_pagination_param, params = "=".join([tables.FlavorsTable._meta.prev_pagination_param,
@ -132,7 +132,7 @@ class FlavorsViewTests(test.BaseAdminViewTests):
# prev back to get first page with 2 items # prev back to get first page with 2 items
self.assertEqual(len(res.context['table'].data), self.assertEqual(len(res.context['table'].data),
settings.API_RESULT_PAGE_SIZE) settings.API_RESULT_PAGE_SIZE)
self.assertItemsEqual(res.context['table'].data, self.assertCountEqual(res.context['table'].data,
self.flavors.list()[:2]) self.flavors.list()[:2])
self.mock_flavor_list_paged.assert_has_calls([ self.mock_flavor_list_paged.assert_has_calls([

View File

@ -38,12 +38,12 @@ class HypervisorViewTest(test.BaseAdminViewTests):
self.assertTemplateUsed(res, 'admin/hypervisors/index.html') self.assertTemplateUsed(res, 'admin/hypervisors/index.html')
hypervisors_tab = res.context['tab_group'].get_tab('hypervisor') hypervisors_tab = res.context['tab_group'].get_tab('hypervisor')
self.assertItemsEqual(hypervisors_tab._tables['hypervisors'].data, self.assertCountEqual(hypervisors_tab._tables['hypervisors'].data,
hypervisors) hypervisors)
host_tab = res.context['tab_group'].get_tab('compute_host') host_tab = res.context['tab_group'].get_tab('compute_host')
host_table = host_tab._tables['compute_host'] host_table = host_tab._tables['compute_host']
self.assertItemsEqual(host_table.data, compute_services) self.assertCountEqual(host_table.data, compute_services)
actions_host_up = host_table.get_row_actions(host_table.data[0]) actions_host_up = host_table.get_row_actions(host_table.data[0])
self.assertEqual(1, len(actions_host_up)) self.assertEqual(1, len(actions_host_up))
actions_host_down = host_table.get_row_actions(host_table.data[1]) actions_host_down = host_table.get_row_actions(host_table.data[1])
@ -105,7 +105,7 @@ class HypervisorDetailViewTest(test.BaseAdminViewTests):
hypervisor.hypervisor_hostname)]) hypervisor.hypervisor_hostname)])
res = self.client.get(url) res = self.client.get(url)
self.assertTemplateUsed(res, 'admin/hypervisors/detail.html') self.assertTemplateUsed(res, 'admin/hypervisors/detail.html')
self.assertItemsEqual(res.context['table'].data, hypervisor.servers) self.assertCountEqual(res.context['table'].data, hypervisor.servers)
self.mock_hypervisor_search.assert_called_once_with( self.mock_hypervisor_search.assert_called_once_with(
test.IsHttpRequest(), hypervisor.hypervisor_hostname) test.IsHttpRequest(), hypervisor.hypervisor_hostname)

View File

@ -78,7 +78,7 @@ class ImagesViewTest(test.BaseAdminViewTests):
res = self.client.get(reverse('horizon:admin:images:index')) res = self.client.get(reverse('horizon:admin:images:index'))
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
images = res.context['table'].data images = res.context['table'].data
self.assertItemsEqual(images, []) self.assertCountEqual(images, [])
@override_settings(API_RESULT_PAGE_SIZE=2) @override_settings(API_RESULT_PAGE_SIZE=2)
@mock.patch.object(api.glance, 'image_list_detailed') @mock.patch.object(api.glance, 'image_list_detailed')

View File

@ -50,7 +50,7 @@ class InstanceViewTest(test.BaseAdminViewTests):
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
instances = res.context['table'].data instances = res.context['table'].data
self.assertItemsEqual(instances, servers) self.assertCountEqual(instances, servers)
self.mock_extension_supported.assert_has_calls([ self.mock_extension_supported.assert_has_calls([
mock.call('AdminActions', test.IsHttpRequest()), mock.call('AdminActions', test.IsHttpRequest()),
@ -94,7 +94,7 @@ class InstanceViewTest(test.BaseAdminViewTests):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
instances = res.context['table'].data instances = res.context['table'].data
self.assertItemsEqual(instances, servers) self.assertCountEqual(instances, servers)
search_opts = {'marker': None, 'paginate': True, 'all_tenants': True} search_opts = {'marker': None, 'paginate': True, 'all_tenants': True}
self.mock_server_list_paged.assert_called_once_with( self.mock_server_list_paged.assert_called_once_with(
@ -143,7 +143,7 @@ class InstanceViewTest(test.BaseAdminViewTests):
# there will be only one error message for all instances # there will be only one error message for all instances
# (messages de-duplication). # (messages de-duplication).
self.assertMessageCount(res, error=1) self.assertMessageCount(res, error=1)
self.assertItemsEqual(instances, servers) self.assertCountEqual(instances, servers)
self.mock_image_list_detailed_by_ids.assert_called_once_with( self.mock_image_list_detailed_by_ids.assert_called_once_with(
test.IsHttpRequest(), instances_img_ids) test.IsHttpRequest(), instances_img_ids)
@ -487,7 +487,7 @@ class InstanceViewTest(test.BaseAdminViewTests):
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
instances = res.context['table'].data instances = res.context['table'].data
self.assertItemsEqual(instances, []) self.assertCountEqual(instances, [])
@test.create_mocks({ @test.create_mocks({
api.nova: ['flavor_list', api.nova: ['flavor_list',
@ -559,7 +559,7 @@ class InstanceViewTest(test.BaseAdminViewTests):
has_more=True, has_more=True,
has_prev=False) has_prev=False)
servers = res.context['table'].data servers = res.context['table'].data
self.assertItemsEqual(servers, expected_servers) self.assertCountEqual(servers, expected_servers)
# get second page # get second page
expected_servers = mox_servers[size:2 * size] expected_servers = mox_servers[size:2 * size]
@ -570,7 +570,7 @@ class InstanceViewTest(test.BaseAdminViewTests):
has_more=True, has_more=True,
has_prev=True) has_prev=True)
servers = res.context['table'].data servers = res.context['table'].data
self.assertItemsEqual(servers, expected_servers) self.assertCountEqual(servers, expected_servers)
# get last page # get last page
expected_servers = mox_servers[-size:] expected_servers = mox_servers[-size:]
@ -581,7 +581,7 @@ class InstanceViewTest(test.BaseAdminViewTests):
has_more=False, has_more=False,
has_prev=True) has_prev=True)
servers = res.context['table'].data servers = res.context['table'].data
self.assertItemsEqual(servers, expected_servers) self.assertCountEqual(servers, expected_servers)
@override_settings(API_RESULT_PAGE_SIZE=1) @override_settings(API_RESULT_PAGE_SIZE=1)
def test_servers_index_paginated_prev(self): def test_servers_index_paginated_prev(self):
@ -598,7 +598,7 @@ class InstanceViewTest(test.BaseAdminViewTests):
has_more=False, has_more=False,
has_prev=True) has_prev=True)
servers = res.context['table'].data servers = res.context['table'].data
self.assertItemsEqual(servers, expected_servers) self.assertCountEqual(servers, expected_servers)
# back to first page # back to first page
expected_servers = mox_servers[:size] expected_servers = mox_servers[:size]
@ -609,4 +609,4 @@ class InstanceViewTest(test.BaseAdminViewTests):
has_more=True, has_more=True,
has_prev=False) has_prev=False)
servers = res.context['table'].data servers = res.context['table'].data
self.assertItemsEqual(servers, expected_servers) self.assertCountEqual(servers, expected_servers)

View File

@ -416,7 +416,7 @@ class NetworkSubnetTests(test.BaseAdminViewTests):
res = self.client.get(url) res = self.client.get(url)
self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertTemplateUsed(res, 'horizon/common/_detail.html')
subnets = res.context['subnets_table'].data subnets = res.context['subnets_table'].data
self.assertItemsEqual(subnets, [self.subnets.first()]) self.assertCountEqual(subnets, [self.subnets.first()])
self._check_is_extension_supported( self._check_is_extension_supported(
{'network-ip-availability': 2, {'network-ip-availability': 2,

View File

@ -67,7 +67,7 @@ class NetworkTests(test.BaseAdminViewTests):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
networks = res.context['networks_table'].data networks = res.context['networks_table'].data
self.assertItemsEqual(networks, self.networks.list()) self.assertCountEqual(networks, self.networks.list())
self.mock_network_list.assert_called_once_with(test.IsHttpRequest()) self.mock_network_list.assert_called_once_with(test.IsHttpRequest())
self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest()) self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest())
@ -174,7 +174,7 @@ class NetworkTests(test.BaseAdminViewTests):
self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertTemplateUsed(res, 'horizon/common/_detail.html')
subnets = res.context['subnets_table'].data subnets = res.context['subnets_table'].data
self.assertItemsEqual(subnets, [self.subnets.first()]) self.assertCountEqual(subnets, [self.subnets.first()])
self.mock_show_network_ip_availability.assert_called_once_with( self.mock_show_network_ip_availability.assert_called_once_with(
test.IsHttpRequest(), network.id) test.IsHttpRequest(), network.id)
@ -216,7 +216,7 @@ class NetworkTests(test.BaseAdminViewTests):
self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertTemplateUsed(res, 'horizon/common/_detail.html')
ports = res.context['ports_table'].data ports = res.context['ports_table'].data
self.assertItemsEqual(ports, [self.ports.first()]) self.assertCountEqual(ports, [self.ports.first()])
self.assert_mock_multiple_calls_with_same_arguments( self.assert_mock_multiple_calls_with_same_arguments(
self.mock_network_get, 2, self.mock_network_get, 2,
@ -263,7 +263,7 @@ class NetworkTests(test.BaseAdminViewTests):
result_agents = res.context['agents_table'].data result_agents = res.context['agents_table'].data
expected_agents = self.agents.list() expected_agents = self.agents.list()
self.assertItemsEqual(result_agents, expected_agents) self.assertCountEqual(result_agents, expected_agents)
self._check_is_extension_supported( self._check_is_extension_supported(
{'network-ip-availability': 1, {'network-ip-availability': 1,
@ -404,7 +404,7 @@ class NetworkTests(test.BaseAdminViewTests):
self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertTemplateUsed(res, 'horizon/common/_detail.html')
subnets = res.context['subnets_table'].data subnets = res.context['subnets_table'].data
self.assertItemsEqual(subnets, [self.subnets.first()]) self.assertCountEqual(subnets, [self.subnets.first()])
self.mock_show_network_ip_availability.assert_called_once_with( self.mock_show_network_ip_availability.assert_called_once_with(
test.IsHttpRequest(), network.id) test.IsHttpRequest(), network.id)
@ -966,7 +966,7 @@ class NetworkTests(test.BaseAdminViewTests):
res = self.client.get(reverse('horizon:admin:networks:index')) res = self.client.get(reverse('horizon:admin:networks:index'))
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
networks = res.context['networks_table'].data networks = res.context['networks_table'].data
self.assertItemsEqual(networks, []) self.assertCountEqual(networks, [])
self._check_is_extension_supported( self._check_is_extension_supported(
{'network_availability_zone': 1, {'network_availability_zone': 1,
@ -987,7 +987,7 @@ class NetworkTests(test.BaseAdminViewTests):
res = self.client.get(reverse('horizon:admin:networks:index')) res = self.client.get(reverse('horizon:admin:networks:index'))
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
networks = res.context['networks_table'].data networks = res.context['networks_table'].data
self.assertItemsEqual(networks, []) self.assertCountEqual(networks, [])
self._check_is_extension_supported( self._check_is_extension_supported(
{'network_availability_zone': 2, {'network_availability_zone': 2,

View File

@ -40,7 +40,7 @@ class RBACPolicyTests(test.BaseAdminViewTests):
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
rbac_policies = res.context['table'].data rbac_policies = res.context['table'].data
self.assertItemsEqual(rbac_policies, self.rbac_policies.list()) self.assertCountEqual(rbac_policies, self.rbac_policies.list())
self.mock_network_list.assert_called_once_with(test.IsHttpRequest()) self.mock_network_list.assert_called_once_with(test.IsHttpRequest())
self.mock_policy_list.assert_called_once_with(test.IsHttpRequest()) self.mock_policy_list.assert_called_once_with(test.IsHttpRequest())
self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest()) self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest())

View File

@ -88,7 +88,7 @@ class RouterTests(RouterMixin, r_test.RouterTestCase, test.BaseAdminViewTests):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
routers = res.context['table'].data routers = res.context['table'].data
self.assertItemsEqual(routers, self.routers.list()) self.assertCountEqual(routers, self.routers.list())
self.mock_router_list.assert_called_once_with(test.IsHttpRequest()) self.mock_router_list.assert_called_once_with(test.IsHttpRequest())
self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest()) self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest())
@ -143,7 +143,7 @@ class RouterTests(RouterMixin, r_test.RouterTestCase, test.BaseAdminViewTests):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
routers = res.context['table'].data routers = res.context['table'].data
self.assertItemsEqual(routers, self.routers.list()) self.assertCountEqual(routers, self.routers.list())
self.mock_agent_list.assert_called_once_with( self.mock_agent_list.assert_called_once_with(
test.IsHttpRequest(), id=agent.id) test.IsHttpRequest(), id=agent.id)
@ -305,7 +305,7 @@ class RouterTests(RouterMixin, r_test.RouterTestCase, test.BaseAdminViewTests):
res = self.client.get(self.INDEX_URL) res = self.client.get(self.INDEX_URL)
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
routers = res.context['table'].data routers = res.context['table'].data
self.assertItemsEqual(routers, []) self.assertCountEqual(routers, [])
self.assert_mock_multiple_calls_with_same_arguments( self.assert_mock_multiple_calls_with_same_arguments(
self.mock_tenant_quota_usages, 2, self.mock_tenant_quota_usages, 2,
@ -329,7 +329,7 @@ class RouterTests(RouterMixin, r_test.RouterTestCase, test.BaseAdminViewTests):
res = self.client.get(self.INDEX_URL) res = self.client.get(self.INDEX_URL)
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
routers = res.context['table'].data routers = res.context['table'].data
self.assertItemsEqual(routers, []) self.assertCountEqual(routers, [])
self.assert_mock_multiple_calls_with_same_arguments( self.assert_mock_multiple_calls_with_same_arguments(
self.mock_tenant_quota_usages, 2, self.mock_tenant_quota_usages, 2,

View File

@ -42,7 +42,7 @@ class VolumeSnapshotsViewTests(test.BaseAdminViewTests):
self.assertEqual(res.status_code, 200) self.assertEqual(res.status_code, 200)
self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html') self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html')
snapshots = res.context['volume_snapshots_table'].data snapshots = res.context['volume_snapshots_table'].data
self.assertItemsEqual(snapshots, self.cinder_volume_snapshots.list()) self.assertCountEqual(snapshots, self.cinder_volume_snapshots.list())
self.mock_volume_snapshot_list_paged.assert_called_once_with( self.mock_volume_snapshot_list_paged.assert_called_once_with(
test.IsHttpRequest(), paginate=True, marker=None, sort_dir='desc', test.IsHttpRequest(), paginate=True, marker=None, sort_dir='desc',
@ -89,7 +89,7 @@ class VolumeSnapshotsViewTests(test.BaseAdminViewTests):
marker=None, sort_dir="desc", snapshots=expected_snapshots, marker=None, sort_dir="desc", snapshots=expected_snapshots,
url=base_url, has_more=True, has_prev=False) url=base_url, has_more=True, has_prev=False)
result = res.context['volume_snapshots_table'].data result = res.context['volume_snapshots_table'].data
self.assertItemsEqual(result, expected_snapshots) self.assertCountEqual(result, expected_snapshots)
# get second page # get second page
expected_snapshots = snapshots[size:2 * size] expected_snapshots = snapshots[size:2 * size]
@ -99,7 +99,7 @@ class VolumeSnapshotsViewTests(test.BaseAdminViewTests):
marker=marker, sort_dir="desc", snapshots=expected_snapshots, marker=marker, sort_dir="desc", snapshots=expected_snapshots,
url=url, has_more=True, has_prev=True) url=url, has_more=True, has_prev=True)
result = res.context['volume_snapshots_table'].data result = res.context['volume_snapshots_table'].data
self.assertItemsEqual(result, expected_snapshots) self.assertCountEqual(result, expected_snapshots)
# get last page # get last page
expected_snapshots = snapshots[-size:] expected_snapshots = snapshots[-size:]
@ -109,7 +109,7 @@ class VolumeSnapshotsViewTests(test.BaseAdminViewTests):
marker=marker, sort_dir="desc", snapshots=expected_snapshots, marker=marker, sort_dir="desc", snapshots=expected_snapshots,
url=url, has_more=False, has_prev=True) url=url, has_more=False, has_prev=True)
result = res.context['volume_snapshots_table'].data result = res.context['volume_snapshots_table'].data
self.assertItemsEqual(result, expected_snapshots) self.assertCountEqual(result, expected_snapshots)
@override_settings(API_RESULT_PAGE_SIZE=1) @override_settings(API_RESULT_PAGE_SIZE=1)
def test_snapshots_index_paginated_prev(self): def test_snapshots_index_paginated_prev(self):
@ -126,7 +126,7 @@ class VolumeSnapshotsViewTests(test.BaseAdminViewTests):
marker=marker, sort_dir="asc", snapshots=expected_snapshots, marker=marker, sort_dir="asc", snapshots=expected_snapshots,
url=url, has_more=False, has_prev=True) url=url, has_more=False, has_prev=True)
snapshots = res.context['volume_snapshots_table'].data snapshots = res.context['volume_snapshots_table'].data
self.assertItemsEqual(snapshots, expected_snapshots) self.assertCountEqual(snapshots, expected_snapshots)
# back to first page # back to first page
expected_snapshots = max_snapshots[:size] expected_snapshots = max_snapshots[:size]
@ -136,7 +136,7 @@ class VolumeSnapshotsViewTests(test.BaseAdminViewTests):
marker=marker, sort_dir="asc", snapshots=expected_snapshots, marker=marker, sort_dir="asc", snapshots=expected_snapshots,
url=url, has_more=True, has_prev=False) url=url, has_more=True, has_prev=False)
snapshots = res.context['volume_snapshots_table'].data snapshots = res.context['volume_snapshots_table'].data
self.assertItemsEqual(snapshots, expected_snapshots) self.assertCountEqual(snapshots, expected_snapshots)
@test.create_mocks({cinder: ('volume_snapshot_reset_state', @test.create_mocks({cinder: ('volume_snapshot_reset_state',
'volume_snapshot_get')}) 'volume_snapshot_get')})

View File

@ -42,9 +42,9 @@ class VolumeTypeTests(test.BaseAdminViewTests):
self.assertTemplateUsed( self.assertTemplateUsed(
res, 'admin/volume_types/volume_types_tables.html') res, 'admin/volume_types/volume_types_tables.html')
volume_types = res.context['volume_types_table'].data volume_types = res.context['volume_types_table'].data
self.assertItemsEqual(volume_types, self.cinder_volume_types.list()) self.assertCountEqual(volume_types, self.cinder_volume_types.list())
qos_specs = res.context['qos_specs_table'].data qos_specs = res.context['qos_specs_table'].data
self.assertItemsEqual(qos_specs, self.cinder_qos_specs.list()) self.assertCountEqual(qos_specs, self.cinder_qos_specs.list())
self.mock_volume_type_list_with_qos_associations.\ self.mock_volume_type_list_with_qos_associations.\
assert_called_once_with(test.IsHttpRequest()) assert_called_once_with(test.IsHttpRequest())

View File

@ -70,7 +70,7 @@ class VolumeTests(test.BaseAdminViewTests):
self.mock_tenant_list.assert_called_once() self.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.assertCountEqual(volumes, self.cinder_volumes.list())
def test_index_without_attachments(self): def test_index_without_attachments(self):
self._test_index(True) self._test_index(True)
@ -116,7 +116,7 @@ class VolumeTests(test.BaseAdminViewTests):
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
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.assertCountEqual(volumes, [])
def _ensure_attachments_exist(self, volumes): def _ensure_attachments_exist(self, volumes):
volumes = copy.copy(volumes) volumes = copy.copy(volumes)
@ -138,7 +138,7 @@ class VolumeTests(test.BaseAdminViewTests):
res = self._test_index_paginated(None, "desc", expected_volumes, url, res = self._test_index_paginated(None, "desc", expected_volumes, url,
True, False) True, False)
result = res.context['volumes_table'].data result = res.context['volumes_table'].data
self.assertItemsEqual(result, expected_volumes) self.assertCountEqual(result, expected_volumes)
# get second page # get second page
expected_volumes = volumes[size:2 * size] expected_volumes = volumes[size:2 * size]
@ -148,7 +148,7 @@ class VolumeTests(test.BaseAdminViewTests):
res = self._test_index_paginated(marker, "desc", expected_volumes, url, res = self._test_index_paginated(marker, "desc", expected_volumes, url,
True, True) True, True)
result = res.context['volumes_table'].data result = res.context['volumes_table'].data
self.assertItemsEqual(result, expected_volumes) self.assertCountEqual(result, expected_volumes)
# get last page # get last page
expected_volumes = volumes[-size:] expected_volumes = volumes[-size:]
@ -158,7 +158,7 @@ class VolumeTests(test.BaseAdminViewTests):
res = self._test_index_paginated(marker, "desc", expected_volumes, url, res = self._test_index_paginated(marker, "desc", expected_volumes, url,
False, True) False, True)
result = res.context['volumes_table'].data result = res.context['volumes_table'].data
self.assertItemsEqual(result, expected_volumes) self.assertCountEqual(result, 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):
@ -174,7 +174,7 @@ class VolumeTests(test.BaseAdminViewTests):
res = self._test_index_paginated(marker, "asc", expected_volumes, url, res = self._test_index_paginated(marker, "asc", expected_volumes, url,
False, True) False, True)
result = res.context['volumes_table'].data result = res.context['volumes_table'].data
self.assertItemsEqual(result, expected_volumes) self.assertCountEqual(result, expected_volumes)
# back to first page # back to first page
expected_volumes = volumes[:size] expected_volumes = volumes[:size]
@ -184,7 +184,7 @@ class VolumeTests(test.BaseAdminViewTests):
res = self._test_index_paginated(marker, "asc", expected_volumes, url, res = self._test_index_paginated(marker, "asc", expected_volumes, url,
True, False) True, False)
result = res.context['volumes_table'].data result = res.context['volumes_table'].data
self.assertItemsEqual(result, expected_volumes) self.assertCountEqual(result, expected_volumes)
@test.create_mocks({api.cinder: ['volume_get', 'volume_reset_state']}) @test.create_mocks({api.cinder: ['volume_get', 'volume_reset_state']})
def test_update_volume_status(self): def test_update_volume_status(self):

View File

@ -40,7 +40,7 @@ class DomainsViewTests(test.BaseAdminViewTests):
res = self.client.get(DOMAINS_INDEX_URL) res = self.client.get(DOMAINS_INDEX_URL)
self.assertTemplateUsed(res, constants.DOMAINS_INDEX_VIEW_TEMPLATE) self.assertTemplateUsed(res, constants.DOMAINS_INDEX_VIEW_TEMPLATE)
self.assertItemsEqual(res.context['table'].data, self.domains.list()) self.assertCountEqual(res.context['table'].data, self.domains.list())
self.assertContains(res, 'Create Domain') self.assertContains(res, 'Create Domain')
self.assertContains(res, 'Edit') self.assertContains(res, 'Edit')
self.assertContains(res, 'Delete Domain') self.assertContains(res, 'Delete Domain')
@ -58,7 +58,7 @@ class DomainsViewTests(test.BaseAdminViewTests):
res = self.client.get(DOMAINS_INDEX_URL) res = self.client.get(DOMAINS_INDEX_URL)
self.assertTemplateUsed(res, constants.DOMAINS_INDEX_VIEW_TEMPLATE) self.assertTemplateUsed(res, constants.DOMAINS_INDEX_VIEW_TEMPLATE)
self.assertItemsEqual(res.context['table'].data, self.domains.list()) self.assertCountEqual(res.context['table'].data, self.domains.list())
self.assertNotContains(res, 'Create Domain') self.assertNotContains(res, 'Create Domain')
self.assertNotContains(res, 'Edit') self.assertNotContains(res, 'Edit')
self.assertNotContains(res, 'Delete Domain') self.assertNotContains(res, 'Delete Domain')
@ -156,14 +156,14 @@ class DomainsViewTests(test.BaseAdminViewTests):
res = self.client.post(DOMAINS_INDEX_URL, formData) res = self.client.post(DOMAINS_INDEX_URL, formData)
self.assertTemplateUsed(res, constants.DOMAINS_INDEX_VIEW_TEMPLATE) self.assertTemplateUsed(res, constants.DOMAINS_INDEX_VIEW_TEMPLATE)
self.assertItemsEqual(res.context['table'].data, [domain, ]) self.assertCountEqual(res.context['table'].data, [domain, ])
self.assertContains(res, "<em>another_test_domain:</em>") self.assertContains(res, "<em>another_test_domain:</em>")
formData = {'action': 'domains__clear_domain_context__%s' % domain.id} formData = {'action': 'domains__clear_domain_context__%s' % domain.id}
res = self.client.post(DOMAINS_INDEX_URL, formData) res = self.client.post(DOMAINS_INDEX_URL, formData)
self.assertTemplateUsed(res, constants.DOMAINS_INDEX_VIEW_TEMPLATE) self.assertTemplateUsed(res, constants.DOMAINS_INDEX_VIEW_TEMPLATE)
self.assertItemsEqual(res.context['table'].data, self.domains.list()) self.assertCountEqual(res.context['table'].data, self.domains.list())
self.assertNotContains(res, "<em>test_domain:</em>") self.assertNotContains(res, "<em>test_domain:</em>")
self.assertNotContains(res, "<em>another_test_domain:</em>") self.assertNotContains(res, "<em>another_test_domain:</em>")

View File

@ -55,10 +55,10 @@ class GroupsViewTests(test.BaseAdminViewTests):
res = self.client.get(GROUPS_INDEX_URL) res = self.client.get(GROUPS_INDEX_URL)
self.assertTemplateUsed(res, constants.GROUPS_INDEX_VIEW_TEMPLATE) self.assertTemplateUsed(res, constants.GROUPS_INDEX_VIEW_TEMPLATE)
self.assertItemsEqual(res.context['table'].data, groups) self.assertCountEqual(res.context['table'].data, groups)
if domain_id: if domain_id:
for group in res.context['table'].data: for group in res.context['table'].data:
self.assertItemsEqual(group.domain_id, domain_id) self.assertCountEqual(group.domain_id, domain_id)
self.assertContains(res, 'Create Group') self.assertContains(res, 'Create Group')
self.assertContains(res, 'Edit') self.assertContains(res, 'Edit')
@ -83,10 +83,10 @@ class GroupsViewTests(test.BaseAdminViewTests):
res = self.client.get(GROUPS_INDEX_URL) res = self.client.get(GROUPS_INDEX_URL)
self.assertTemplateUsed(res, constants.GROUPS_INDEX_VIEW_TEMPLATE) self.assertTemplateUsed(res, constants.GROUPS_INDEX_VIEW_TEMPLATE)
self.assertItemsEqual(res.context['table'].data, groups) self.assertCountEqual(res.context['table'].data, groups)
if domain.id: if domain.id:
for group in res.context['table'].data: for group in res.context['table'].data:
self.assertItemsEqual(group.domain_id, domain.id) self.assertCountEqual(group.domain_id, domain.id)
self.assertContains(res, 'Create Group') self.assertContains(res, 'Create Group')
self.assertContains(res, 'Edit') self.assertContains(res, 'Edit')
@ -110,7 +110,7 @@ class GroupsViewTests(test.BaseAdminViewTests):
res = self.client.get(GROUPS_INDEX_URL) res = self.client.get(GROUPS_INDEX_URL)
self.assertTemplateUsed(res, constants.GROUPS_INDEX_VIEW_TEMPLATE) self.assertTemplateUsed(res, constants.GROUPS_INDEX_VIEW_TEMPLATE)
self.assertItemsEqual(res.context['table'].data, groups) self.assertCountEqual(res.context['table'].data, groups)
self.assertNotContains(res, 'Create Group') self.assertNotContains(res, 'Create Group')
self.assertNotContains(res, 'Edit') self.assertNotContains(res, 'Edit')
@ -239,7 +239,7 @@ class GroupsViewTests(test.BaseAdminViewTests):
res = self.client.get(GROUP_MANAGE_URL) res = self.client.get(GROUP_MANAGE_URL)
self.assertTemplateUsed(res, constants.GROUPS_MANAGE_VIEW_TEMPLATE) self.assertTemplateUsed(res, constants.GROUPS_MANAGE_VIEW_TEMPLATE)
self.assertItemsEqual(res.context['table'].data, group_members) self.assertCountEqual(res.context['table'].data, group_members)
self.mock_group_get.assert_called_once_with(test.IsHttpRequest(), self.mock_group_get.assert_called_once_with(test.IsHttpRequest(),
group.id) group.id)
@ -326,4 +326,4 @@ class GroupsViewTests(test.BaseAdminViewTests):
res = self.client.get(GROUPS_INDEX_URL) res = self.client.get(GROUPS_INDEX_URL)
self.assertTemplateUsed(res, constants.GROUPS_INDEX_VIEW_TEMPLATE) self.assertTemplateUsed(res, constants.GROUPS_INDEX_VIEW_TEMPLATE)
groups = res.context['table'].data groups = res.context['table'].data
self.assertItemsEqual(groups, []) self.assertCountEqual(groups, [])

View File

@ -36,7 +36,7 @@ class IdPsViewTests(test.BaseAdminViewTests):
res = self.client.get(IDPS_INDEX_URL) res = self.client.get(IDPS_INDEX_URL)
self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html') self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html')
self.assertItemsEqual(res.context['table'].data, self.assertCountEqual(res.context['table'].data,
self.identity_providers.list()) self.identity_providers.list())
self.mock_identity_provider_list.assert_called_once_with( self.mock_identity_provider_list.assert_called_once_with(
@ -145,7 +145,7 @@ class IdPsViewTests(test.BaseAdminViewTests):
self.assertTemplateUsed( self.assertTemplateUsed(
res, 'identity/identity_providers/_detail_overview.html') res, 'identity/identity_providers/_detail_overview.html')
self.assertTemplateUsed(res, 'horizon/common/_detail_table.html') self.assertTemplateUsed(res, 'horizon/common/_detail_table.html')
self.assertItemsEqual(res.context['idp_protocols_table'].data, self.assertCountEqual(res.context['idp_protocols_table'].data,
self.idp_protocols.list()) self.idp_protocols.list())
self.mock_identity_provider_get.assert_called_once_with( self.mock_identity_provider_get.assert_called_once_with(

View File

@ -35,7 +35,7 @@ class MappingsViewTests(test.BaseAdminViewTests):
res = self.client.get(MAPPINGS_INDEX_URL) res = self.client.get(MAPPINGS_INDEX_URL)
self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html') self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html')
self.assertItemsEqual(res.context['table'].data, self.assertCountEqual(res.context['table'].data,
self.idp_mappings.list()) self.idp_mappings.list())
self.mock_mapping_list.assert_called_once_with(test.IsHttpRequest()) self.mock_mapping_list.assert_called_once_with(test.IsHttpRequest())

View File

@ -54,7 +54,7 @@ class TenantsViewTests(test.BaseAdminViewTests):
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
self.assertTemplateUsed(res, 'identity/projects/index.html') self.assertTemplateUsed(res, 'identity/projects/index.html')
self.assertItemsEqual(res.context['table'].data, self.tenants.list()) self.assertCountEqual(res.context['table'].data, self.tenants.list())
self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest(), self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest(),
domain=None, domain=None,
@ -86,7 +86,7 @@ class TenantsViewTests(test.BaseAdminViewTests):
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
self.assertTemplateUsed(res, 'identity/projects/index.html') self.assertTemplateUsed(res, 'identity/projects/index.html')
self.assertItemsEqual(res.context['table'].data, domain_tenants) self.assertCountEqual(res.context['table'].data, domain_tenants)
self.assertContains(res, "<em>test_domain:</em>") self.assertContains(res, "<em>test_domain:</em>")
self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest(), self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest(),
@ -102,7 +102,7 @@ class TenantsViewTests(test.BaseAdminViewTests):
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
self.assertTemplateUsed(res, 'identity/projects/index.html') self.assertTemplateUsed(res, 'identity/projects/index.html')
projects = res.context['table'].data projects = res.context['table'].data
self.assertItemsEqual(projects, []) self.assertCountEqual(projects, [])
class ProjectsViewNonAdminTests(test.TestCase): class ProjectsViewNonAdminTests(test.TestCase):
@ -118,7 +118,7 @@ class ProjectsViewNonAdminTests(test.TestCase):
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
self.assertTemplateUsed(res, 'identity/projects/index.html') self.assertTemplateUsed(res, 'identity/projects/index.html')
self.assertItemsEqual(res.context['table'].data, self.tenants.list()) self.assertCountEqual(res.context['table'].data, self.tenants.list())
self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest(), self.mock_tenant_list.assert_called_once_with(test.IsHttpRequest(),
user=self.user.id, user=self.user.id,
@ -1466,13 +1466,13 @@ class DetailProjectViewTests(test.BaseAdminViewTests):
users_id_observed = [user.id for user in users_id_observed = [user.id for user in
res.context["userstable_table"].data] res.context["userstable_table"].data]
self.assertItemsEqual(users_expected.keys(), users_id_observed) self.assertCountEqual(users_expected.keys(), users_id_observed)
# Check the users groups and roles # Check the users groups and roles
for user in res.context["userstable_table"].data: for user in res.context["userstable_table"].data:
self.assertItemsEqual(users_expected[user.id]["roles"], self.assertCountEqual(users_expected[user.id]["roles"],
user.roles) user.roles)
self.assertItemsEqual(users_expected[user.id]["roles_from_groups"], self.assertCountEqual(users_expected[user.id]["roles_from_groups"],
user.roles_from_groups) user.roles_from_groups)
self.mock_tenant_get.assert_called_once_with(test.IsHttpRequest(), self.mock_tenant_get.assert_called_once_with(test.IsHttpRequest(),
@ -1571,7 +1571,7 @@ class DetailProjectViewTests(test.BaseAdminViewTests):
res.context["groupstable_table"].data] res.context["groupstable_table"].data]
# Check the group is displayed # Check the group is displayed
self.assertItemsEqual(groups_id_observed, groups_expected.keys()) self.assertCountEqual(groups_id_observed, groups_expected.keys())
# Check the groups roles # Check the groups roles
for group in res.context["groupstable_table"].data: for group in res.context["groupstable_table"].data:

View File

@ -40,7 +40,7 @@ class RolesViewTests(test.BaseAdminViewTests):
self.assertContains(res, 'Delete Role') self.assertContains(res, 'Delete Role')
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
self.assertItemsEqual(res.context['table'].data, self.roles.list()) self.assertCountEqual(res.context['table'].data, self.roles.list())
self.mock_role_list.assert_called_once_with(test.IsHttpRequest(), self.mock_role_list.assert_called_once_with(test.IsHttpRequest(),
filters=filters) filters=filters)
@ -60,7 +60,7 @@ class RolesViewTests(test.BaseAdminViewTests):
self.assertNotContains(res, 'Delete Role') self.assertNotContains(res, 'Delete Role')
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
self.assertItemsEqual(res.context['table'].data, self.roles.list()) self.assertCountEqual(res.context['table'].data, self.roles.list())
self.mock_role_list.assert_called_once_with(test.IsHttpRequest(), self.mock_role_list.assert_called_once_with(test.IsHttpRequest(),
filters=filters) filters=filters)
@ -128,4 +128,4 @@ class RolesViewTests(test.BaseAdminViewTests):
res = self.client.get(ROLES_INDEX_URL) res = self.client.get(ROLES_INDEX_URL)
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
roles = res.context['table'].data roles = res.context['table'].data
self.assertItemsEqual(roles, []) self.assertCountEqual(roles, [])

View File

@ -69,11 +69,11 @@ class UsersViewTests(test.BaseAdminViewTests):
res = self.client.get(USERS_INDEX_URL) res = self.client.get(USERS_INDEX_URL)
self.assertTemplateUsed(res, 'identity/users/index.html') self.assertTemplateUsed(res, 'identity/users/index.html')
self.assertItemsEqual(res.context['table'].data, users) self.assertCountEqual(res.context['table'].data, users)
if domain_id: if domain_id:
for user in res.context['table'].data: for user in res.context['table'].data:
self.assertItemsEqual(user.domain_id, domain_id) self.assertCountEqual(user.domain_id, domain_id)
if with_domain: if with_domain:
self.mock_get_effective_domain_id.assert_not_called() self.mock_get_effective_domain_id.assert_not_called()
@ -1001,7 +1001,7 @@ class UsersViewTests(test.BaseAdminViewTests):
role_assignments_expected = user_role_assignments role_assignments_expected = user_role_assignments
role_assignments_expected.extend(group_role_assignments) role_assignments_expected.extend(group_role_assignments)
role_assignments_observed = res.context["table"].data role_assignments_observed = res.context["table"].data
self.assertItemsEqual(role_assignments_expected, self.assertCountEqual(role_assignments_expected,
role_assignments_observed) role_assignments_observed)
self.mock_domain_get.assert_called_once_with(test.IsHttpRequest(), '1') self.mock_domain_get.assert_called_once_with(test.IsHttpRequest(), '1')
@ -1092,7 +1092,7 @@ class UsersViewTests(test.BaseAdminViewTests):
# Check the table contains the good data # Check the table contains the good data
groups_expected = groups groups_expected = groups
groups_observed = res.context["table"].data groups_observed = res.context["table"].data
self.assertItemsEqual(groups_expected, groups_observed) self.assertCountEqual(groups_expected, groups_observed)
self.mock_domain_get.assert_called_once_with(test.IsHttpRequest(), '1') self.mock_domain_get.assert_called_once_with(test.IsHttpRequest(), '1')
self.mock_user_get.assert_called_once_with(test.IsHttpRequest(), '1', self.mock_user_get.assert_called_once_with(test.IsHttpRequest(), '1',
@ -1223,7 +1223,7 @@ class UsersViewTests(test.BaseAdminViewTests):
res = self.client.get(USERS_INDEX_URL) res = self.client.get(USERS_INDEX_URL)
self.assertTemplateUsed(res, 'identity/users/index.html') self.assertTemplateUsed(res, 'identity/users/index.html')
users = res.context['table'].data users = res.context['table'].data
self.assertItemsEqual(users, []) self.assertCountEqual(users, [])
class SeleniumTests(test.SeleniumAdminTestCase): class SeleniumTests(test.SeleniumAdminTestCase):

View File

@ -63,7 +63,7 @@ class VolumeBackupsViewTests(test.TestCase):
marker=None, sort_dir="desc", backups=expected_backups, marker=None, sort_dir="desc", backups=expected_backups,
url=base_url, has_more=True, has_prev=False) url=base_url, has_more=True, has_prev=False)
result = res.context['volume_backups_table'].data result = res.context['volume_backups_table'].data
self.assertItemsEqual(result, expected_backups) self.assertCountEqual(result, expected_backups)
# get second page # get second page
expected_backups = backups[size:2 * size] expected_backups = backups[size:2 * size]
@ -74,7 +74,7 @@ class VolumeBackupsViewTests(test.TestCase):
marker=marker, sort_dir="desc", backups=expected_backups, url=url, marker=marker, sort_dir="desc", backups=expected_backups, url=url,
has_more=True, has_prev=True) has_more=True, has_prev=True)
result = res.context['volume_backups_table'].data result = res.context['volume_backups_table'].data
self.assertItemsEqual(result, expected_backups) self.assertCountEqual(result, expected_backups)
self.assertEqual(result[0].snapshot.id, expected_snapshosts[1].id) self.assertEqual(result[0].snapshot.id, expected_snapshosts[1].id)
# get last page # get last page
expected_backups = backups[-size:] expected_backups = backups[-size:]
@ -84,7 +84,7 @@ class VolumeBackupsViewTests(test.TestCase):
marker=marker, sort_dir="desc", backups=expected_backups, url=url, marker=marker, sort_dir="desc", backups=expected_backups, url=url,
has_more=False, has_prev=True) has_more=False, has_prev=True)
result = res.context['volume_backups_table'].data result = res.context['volume_backups_table'].data
self.assertItemsEqual(result, expected_backups) self.assertCountEqual(result, expected_backups)
@override_settings(API_RESULT_PAGE_SIZE=1) @override_settings(API_RESULT_PAGE_SIZE=1)
def test_backups_index_paginated_prev_page(self): def test_backups_index_paginated_prev_page(self):
@ -101,7 +101,7 @@ class VolumeBackupsViewTests(test.TestCase):
marker=marker, sort_dir="asc", backups=expected_backups, url=url, marker=marker, sort_dir="asc", backups=expected_backups, url=url,
has_more=True, has_prev=True) has_more=True, has_prev=True)
result = res.context['volume_backups_table'].data result = res.context['volume_backups_table'].data
self.assertItemsEqual(result, expected_backups) self.assertCountEqual(result, expected_backups)
# back to first page # back to first page
expected_backups = backups[:size] expected_backups = backups[:size]
@ -111,7 +111,7 @@ class VolumeBackupsViewTests(test.TestCase):
marker=marker, sort_dir="asc", backups=expected_backups, url=url, marker=marker, sort_dir="asc", backups=expected_backups, url=url,
has_more=True, has_prev=False) has_more=True, has_prev=False)
result = res.context['volume_backups_table'].data result = res.context['volume_backups_table'].data
self.assertItemsEqual(result, expected_backups) self.assertCountEqual(result, expected_backups)
@test.create_mocks({api.cinder: ('volume_backup_create', @test.create_mocks({api.cinder: ('volume_backup_create',
'volume_snapshot_list', 'volume_snapshot_list',

View File

@ -274,7 +274,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
instances = res.context['instances_table'].data instances = res.context['instances_table'].data
self.assertItemsEqual(instances, self.servers.list()) self.assertCountEqual(instances, self.servers.list())
self.assertNotContains(res, "Launch Instance (Quota exceeded)") self.assertNotContains(res, "Launch Instance (Quota exceeded)")
self._check_get_index() self._check_get_index()
@ -285,7 +285,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
instances = res.context['instances_table'].data instances = res.context['instances_table'].data
self.assertItemsEqual(instances, self.servers.list()) self.assertCountEqual(instances, self.servers.list())
self.assertNotContains(res, "Launch Instance (Quota exceeded)") self.assertNotContains(res, "Launch Instance (Quota exceeded)")
self._check_get_index(use_servers_update_address=False) self._check_get_index(use_servers_update_address=False)
@ -355,7 +355,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
instances = res.context['instances_table'].data instances = res.context['instances_table'].data
self.assertItemsEqual(instances, self.servers.list()) self.assertCountEqual(instances, self.servers.list())
self._check_extension_supported({'AdminActions': 20, self._check_extension_supported({'AdminActions': 20,
'Shelve': 5}) 'Shelve': 5})
@ -1506,7 +1506,7 @@ class InstanceDetailTests(InstanceTestBase):
server, volumes_return=volumes, server, volumes_return=volumes,
security_groups_return=security_groups) security_groups_return=security_groups)
self.assertItemsEqual(res.context['instance'].volumes, volumes) self.assertCountEqual(res.context['instance'].volumes, volumes)
self.mock_is_extension_supported.assert_called_once_with( self.mock_is_extension_supported.assert_called_once_with(
helpers.IsHttpRequest(), 'mac-learning') helpers.IsHttpRequest(), 'mac-learning')
@ -1522,7 +1522,7 @@ class InstanceDetailTests(InstanceTestBase):
server, volumes_return=volumes, server, volumes_return=volumes,
security_groups_return=security_groups) security_groups_return=security_groups)
self.assertItemsEqual(res.context['instance'].volumes, volumes) self.assertCountEqual(res.context['instance'].volumes, volumes)
self.assertEqual(res.context['instance'].volumes[0].device, self.assertEqual(res.context['instance'].volumes[0].device,
"/dev/hda") "/dev/hda")
self.assertEqual(res.context['instance'].volumes[1].device, self.assertEqual(res.context['instance'].volumes[1].device,
@ -1571,7 +1571,7 @@ class InstanceDetailTests(InstanceTestBase):
"created": "2013-10-07T00:08:32Z"} "created": "2013-10-07T00:08:32Z"}
res = self._get_instance_details(server) res = self._get_instance_details(server)
self.assertItemsEqual(res.context['instance'].fault, server.fault) self.assertCountEqual(res.context['instance'].fault, server.fault)
self.mock_is_extension_supported.assert_called_once_with( self.mock_is_extension_supported.assert_called_once_with(
helpers.IsHttpRequest(), 'mac-learning') helpers.IsHttpRequest(), 'mac-learning')

View File

@ -44,7 +44,7 @@ class KeyPairTests(test.TestCase):
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html') self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html')
self.assertItemsEqual(res.context['keypairs_table'].data, keypairs) self.assertCountEqual(res.context['keypairs_table'].data, keypairs)
self.assert_mock_multiple_calls_with_same_arguments( self.assert_mock_multiple_calls_with_same_arguments(
self.mock_tenant_quota_usages, 4, self.mock_tenant_quota_usages, 4,

View File

@ -282,7 +282,7 @@ class NetworkPortTests(test.TestCase):
self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertTemplateUsed(res, 'horizon/common/_detail.html')
self.assertEqual(res.context['port'].id, port.id) self.assertEqual(res.context['port'].id, port.id)
address_pairs = res.context['allowed_address_pairs_table'].data address_pairs = res.context['allowed_address_pairs_table'].data
self.assertItemsEqual(port.allowed_address_pairs, address_pairs) self.assertCountEqual(port.allowed_address_pairs, address_pairs)
self.mock_port_get.assert_called_once_with(test.IsHttpRequest(), self.mock_port_get.assert_called_once_with(test.IsHttpRequest(),
port.id) port.id)

View File

@ -149,7 +149,7 @@ class NetworkTests(test.TestCase, NetworkStubMixin):
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
networks = res.context['networks_table'].data networks = res.context['networks_table'].data
self.assertItemsEqual(networks, self.networks.list()) self.assertCountEqual(networks, self.networks.list())
self.mock_tenant_quota_usages.assert_has_calls([ self.mock_tenant_quota_usages.assert_has_calls([
mock.call(test.IsHttpRequest(), targets=('network', )), mock.call(test.IsHttpRequest(), targets=('network', )),
@ -241,7 +241,7 @@ class NetworkTests(test.TestCase, NetworkStubMixin):
self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertTemplateUsed(res, 'horizon/common/_detail.html')
subnets = res.context['subnets_table'].data subnets = res.context['subnets_table'].data
self.assertItemsEqual(subnets, [self.subnets.first()]) self.assertCountEqual(subnets, [self.subnets.first()])
self.mock_network_get.assert_called_once_with( self.mock_network_get.assert_called_once_with(
test.IsHttpRequest(), network_id) test.IsHttpRequest(), network_id)
@ -351,7 +351,7 @@ class NetworkTests(test.TestCase, NetworkStubMixin):
res = self.client.get(url) res = self.client.get(url)
self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertTemplateUsed(res, 'horizon/common/_detail.html')
subnets = res.context['subnets_table'].data subnets = res.context['subnets_table'].data
self.assertItemsEqual(subnets, [self.subnets.first()]) self.assertCountEqual(subnets, [self.subnets.first()])
self.mock_network_get.assert_called_once_with( self.mock_network_get.assert_called_once_with(
test.IsHttpRequest(), network_id) test.IsHttpRequest(), network_id)
@ -1113,7 +1113,7 @@ class NetworkViewTests(test.TestCase, NetworkStubMixin):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
networks = res.context['networks_table'].data networks = res.context['networks_table'].data
self.assertItemsEqual(networks, self.networks.list()) self.assertCountEqual(networks, self.networks.list())
button = find_button_fn(res) button = find_button_fn(res)
self.assertFalse('disabled' in button.classes, self.assertFalse('disabled' in button.classes,
@ -1150,7 +1150,7 @@ class NetworkViewTests(test.TestCase, NetworkStubMixin):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
networks = res.context['networks_table'].data networks = res.context['networks_table'].data
self.assertItemsEqual(networks, self.networks.list()) self.assertCountEqual(networks, self.networks.list())
button = find_button_fn(res) button = find_button_fn(res)
self.assertIn('disabled', button.classes, self.assertIn('disabled', button.classes,
@ -1224,7 +1224,7 @@ class NetworkViewTests(test.TestCase, NetworkStubMixin):
self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertTemplateUsed(res, 'horizon/common/_detail.html')
subnets = res.context['subnets_table'].data subnets = res.context['subnets_table'].data
self.assertItemsEqual(subnets, self.subnets.list()) self.assertCountEqual(subnets, self.subnets.list())
self.mock_network_get.assert_called_once_with(test.IsHttpRequest(), self.mock_network_get.assert_called_once_with(test.IsHttpRequest(),
network_id) network_id)
@ -1297,7 +1297,7 @@ class NetworkViewTests(test.TestCase, NetworkStubMixin):
self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertTemplateUsed(res, 'horizon/common/_detail.html')
ports = res.context['ports_table'].data ports = res.context['ports_table'].data
self.assertItemsEqual(ports, self.ports.list()) self.assertCountEqual(ports, self.ports.list())
self.mock_network_get.assert_called_once_with( self.mock_network_get.assert_called_once_with(
test.IsHttpRequest(), network_id) test.IsHttpRequest(), network_id)

View File

@ -99,7 +99,7 @@ class RouterTestCase(object):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
routers = res.context['table'].data routers = res.context['table'].data
self.assertItemsEqual(routers, self.routers.list()) self.assertCountEqual(routers, self.routers.list())
self.mock_router_list.assert_called_once_with( self.mock_router_list.assert_called_once_with(
test.IsHttpRequest(), tenant_id=self.tenant.id) test.IsHttpRequest(), tenant_id=self.tenant.id)
@ -176,7 +176,7 @@ class RouterTestCase(object):
self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertTemplateUsed(res, 'horizon/common/_detail.html')
ports = res.context['interfaces_table'].data ports = res.context['interfaces_table'].data
self.assertItemsEqual(ports, [self.ports.first()]) self.assertCountEqual(ports, [self.ports.first()])
self._check_get_detail(router) self._check_get_detail(router)
@ -1070,7 +1070,7 @@ class RouterRouteTestCase(object):
self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertTemplateUsed(res, 'horizon/common/_detail.html')
routes = res.context['extra_routes_table'].data routes = res.context['extra_routes_table'].data
routes_dict = [r._apidict for r in routes] routes_dict = [r._apidict for r in routes]
self.assertItemsEqual(routes_dict, router['routes']) self.assertCountEqual(routes_dict, router['routes'])
self._check_get_detail(router, extraroute=True) self._check_get_detail(router, extraroute=True)
@ -1188,7 +1188,7 @@ class RouterViewTests(RouterMixin, test.TestCase):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
routers = res.context['routers_table'].data routers = res.context['routers_table'].data
self.assertItemsEqual(routers, self.routers.list()) self.assertCountEqual(routers, self.routers.list())
create_action = self.getAndAssertTableAction(res, 'routers', 'create') create_action = self.getAndAssertTableAction(res, 'routers', 'create')
self.assertIn('disabled', create_action.classes, self.assertIn('disabled', create_action.classes,
@ -1221,7 +1221,7 @@ class RouterViewTests(RouterMixin, test.TestCase):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
routers = res.context['routers_table'].data routers = res.context['routers_table'].data
self.assertItemsEqual(routers, self.routers.list()) self.assertCountEqual(routers, self.routers.list())
create_action = self.getAndAssertTableAction(res, 'routers', 'create') create_action = self.getAndAssertTableAction(res, 'routers', 'create')
self.assertFalse('disabled' in create_action.classes, self.assertFalse('disabled' in create_action.classes,
@ -1254,7 +1254,7 @@ class RouterViewTests(RouterMixin, test.TestCase):
self.assertTemplateUsed(res, INDEX_TEMPLATE) self.assertTemplateUsed(res, INDEX_TEMPLATE)
routers = res.context['routers_table'].data routers = res.context['routers_table'].data
self.assertItemsEqual(routers, self.routers.list()) self.assertCountEqual(routers, self.routers.list())
create_action = self.getAndAssertTableAction(res, 'routers', 'create') create_action = self.getAndAssertTableAction(res, 'routers', 'create')
self.assertEqual(set(['ajax-modal']), set(create_action.classes)) self.assertEqual(set(['ajax-modal']), set(create_action.classes))

View File

@ -78,7 +78,7 @@ class SecurityGroupsViewTests(test.TestCase):
# Security groups # Security groups
sec_groups_from_ctx = res.context['security_groups_table'].data sec_groups_from_ctx = res.context['security_groups_table'].data
# Context data needs to contains all items from the test data. # Context data needs to contains all items from the test data.
self.assertItemsEqual(sec_groups_from_ctx, self.assertCountEqual(sec_groups_from_ctx,
sec_groups) sec_groups)
# Sec groups in context need to be sorted by their ``name`` attribute. # Sec groups in context need to be sorted by their ``name`` attribute.
# This assertion is somewhat weak since it's only meaningful as long as # This assertion is somewhat weak since it's only meaningful as long as
@ -107,7 +107,7 @@ class SecurityGroupsViewTests(test.TestCase):
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
security_groups = res.context['security_groups_table'].data security_groups = res.context['security_groups_table'].data
self.assertItemsEqual(security_groups, self.security_groups.list()) self.assertCountEqual(security_groups, self.security_groups.list())
create_action = self.getAndAssertTableAction(res, 'security_groups', create_action = self.getAndAssertTableAction(res, 'security_groups',
'create') 'create')
@ -140,7 +140,7 @@ class SecurityGroupsViewTests(test.TestCase):
res = self.client.get(INDEX_URL) res = self.client.get(INDEX_URL)
security_groups = res.context['security_groups_table'].data security_groups = res.context['security_groups_table'].data
self.assertItemsEqual(security_groups, self.security_groups.list()) self.assertCountEqual(security_groups, self.security_groups.list())
create_action = self.getAndAssertTableAction(res, 'security_groups', create_action = self.getAndAssertTableAction(res, 'security_groups',
'create') 'create')

View File

@ -78,7 +78,7 @@ class VolumeSnapshotsViewTests(test.TestCase):
marker=None, sort_dir="desc", snapshots=expected_snapshots, marker=None, sort_dir="desc", snapshots=expected_snapshots,
url=base_url, has_more=True, has_prev=False) url=base_url, has_more=True, has_prev=False)
snapshots = res.context['volume_snapshots_table'].data snapshots = res.context['volume_snapshots_table'].data
self.assertItemsEqual(snapshots, expected_snapshots) self.assertCountEqual(snapshots, expected_snapshots)
# get second page # get second page
expected_snapshots = mock_snapshots[size:2 * size] expected_snapshots = mock_snapshots[size:2 * size]
@ -89,7 +89,7 @@ class VolumeSnapshotsViewTests(test.TestCase):
marker=marker, sort_dir="desc", snapshots=expected_snapshots, marker=marker, sort_dir="desc", snapshots=expected_snapshots,
url=url, has_more=True, has_prev=True) url=url, has_more=True, has_prev=True)
snapshots = res.context['volume_snapshots_table'].data snapshots = res.context['volume_snapshots_table'].data
self.assertItemsEqual(snapshots, expected_snapshots) self.assertCountEqual(snapshots, expected_snapshots)
# get last page # get last page
expected_snapshots = mock_snapshots[-size:] expected_snapshots = mock_snapshots[-size:]
@ -99,7 +99,7 @@ class VolumeSnapshotsViewTests(test.TestCase):
marker=marker, sort_dir="desc", snapshots=expected_snapshots, marker=marker, sort_dir="desc", snapshots=expected_snapshots,
url=url, has_more=False, has_prev=True) url=url, has_more=False, has_prev=True)
snapshots = res.context['volume_snapshots_table'].data snapshots = res.context['volume_snapshots_table'].data
self.assertItemsEqual(snapshots, expected_snapshots) self.assertCountEqual(snapshots, expected_snapshots)
@override_settings(API_RESULT_PAGE_SIZE=1) @override_settings(API_RESULT_PAGE_SIZE=1)
def test_snapshots_index_with_group(self): def test_snapshots_index_with_group(self):
@ -113,7 +113,7 @@ class VolumeSnapshotsViewTests(test.TestCase):
marker=None, sort_dir="desc", snapshots=expected_snapshots, marker=None, sort_dir="desc", snapshots=expected_snapshots,
url=base_url, has_more=False, has_prev=False, with_groups=True) url=base_url, has_more=False, has_prev=False, with_groups=True)
snapshots = res.context['volume_snapshots_table'].data snapshots = res.context['volume_snapshots_table'].data
self.assertItemsEqual(snapshots, mock_snapshots) self.assertCountEqual(snapshots, mock_snapshots)
@override_settings(API_RESULT_PAGE_SIZE=1) @override_settings(API_RESULT_PAGE_SIZE=1)
def test_snapshots_index_paginated_prev_page(self): def test_snapshots_index_paginated_prev_page(self):
@ -130,7 +130,7 @@ class VolumeSnapshotsViewTests(test.TestCase):
marker=marker, sort_dir="asc", snapshots=expected_snapshots, marker=marker, sort_dir="asc", snapshots=expected_snapshots,
url=url, has_more=True, has_prev=True) url=url, has_more=True, has_prev=True)
snapshots = res.context['volume_snapshots_table'].data snapshots = res.context['volume_snapshots_table'].data
self.assertItemsEqual(snapshots, expected_snapshots) self.assertCountEqual(snapshots, expected_snapshots)
# back to first page # back to first page
expected_snapshots = mock_snapshots[:size] expected_snapshots = mock_snapshots[:size]
@ -140,7 +140,7 @@ class VolumeSnapshotsViewTests(test.TestCase):
marker=marker, sort_dir="asc", snapshots=expected_snapshots, marker=marker, sort_dir="asc", snapshots=expected_snapshots,
url=url, has_more=True, has_prev=False) url=url, has_more=True, has_prev=False)
snapshots = res.context['volume_snapshots_table'].data snapshots = res.context['volume_snapshots_table'].data
self.assertItemsEqual(snapshots, expected_snapshots) self.assertCountEqual(snapshots, expected_snapshots)
@test.create_mocks({api.cinder: ('volume_get',), @test.create_mocks({api.cinder: ('volume_get',),
quotas: ('tenant_quota_usages',)}) quotas: ('tenant_quota_usages',)})

View File

@ -160,7 +160,7 @@ class VolumeIndexViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
res = self._test_index_paginated(None, "desc", expected_volumes, url, res = self._test_index_paginated(None, "desc", expected_volumes, url,
True, False) True, False)
result = res.context['volumes_table'].data result = res.context['volumes_table'].data
self.assertItemsEqual(result, expected_volumes) self.assertCountEqual(result, expected_volumes)
# get second page # get second page
expected_volumes = volumes[size:2 * size] expected_volumes = volumes[size:2 * size]
@ -170,7 +170,7 @@ class VolumeIndexViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
res = self._test_index_paginated(marker, "desc", expected_volumes, url, res = self._test_index_paginated(marker, "desc", expected_volumes, url,
True, True) True, True)
result = res.context['volumes_table'].data result = res.context['volumes_table'].data
self.assertItemsEqual(result, expected_volumes) self.assertCountEqual(result, expected_volumes)
# get last page # get last page
expected_volumes = volumes[-size:] expected_volumes = volumes[-size:]
@ -180,7 +180,7 @@ class VolumeIndexViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
res = self._test_index_paginated(marker, "desc", expected_volumes, url, res = self._test_index_paginated(marker, "desc", expected_volumes, url,
False, True) False, True)
result = res.context['volumes_table'].data result = res.context['volumes_table'].data
self.assertItemsEqual(result, expected_volumes) self.assertCountEqual(result, expected_volumes)
@override_settings(API_RESULT_PAGE_SIZE=2) @override_settings(API_RESULT_PAGE_SIZE=2)
def test_index_paginated_prev_page(self): def test_index_paginated_prev_page(self):
@ -195,7 +195,7 @@ class VolumeIndexViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
res = self._test_index_paginated(marker, "asc", expected_volumes, url, res = self._test_index_paginated(marker, "asc", expected_volumes, url,
True, True) True, True)
result = res.context['volumes_table'].data result = res.context['volumes_table'].data
self.assertItemsEqual(result, expected_volumes) self.assertCountEqual(result, expected_volumes)
# back to first page # back to first page
expected_volumes = volumes[:size] expected_volumes = volumes[:size]
@ -205,7 +205,7 @@ class VolumeIndexViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
res = self._test_index_paginated(marker, "asc", expected_volumes, url, res = self._test_index_paginated(marker, "asc", expected_volumes, url,
True, False) True, False)
result = res.context['volumes_table'].data result = res.context['volumes_table'].data
self.assertItemsEqual(result, expected_volumes) self.assertCountEqual(result, expected_volumes)
class VolumeViewTests(test.ResetImageAPIVersionMixin, test.TestCase): class VolumeViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
@ -1348,7 +1348,7 @@ class VolumeViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
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.assertCountEqual(volumes, self.cinder_volumes.list())
create_action = self.getAndAssertTableAction(res, 'volumes', 'create') create_action = self.getAndAssertTableAction(res, 'volumes', 'create')
@ -1392,7 +1392,7 @@ class VolumeViewTests(test.ResetImageAPIVersionMixin, test.TestCase):
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.assertCountEqual(volumes, self.cinder_volumes.list())
create_action = self.getAndAssertTableAction(res, 'volumes', 'create') create_action = self.getAndAssertTableAction(res, 'volumes', 'create')
self.assertIn('disabled', create_action.classes, self.assertIn('disabled', create_action.classes,

View File

@ -141,7 +141,7 @@ class QuotaTests(test.APITestCase):
with_volume=True, with_compute=True) with_volume=True, with_compute=True)
# Compare internal structure of usages to expected. # Compare internal structure of usages to expected.
self.assertItemsEqual(expected_output, quota_usages.usages) self.assertCountEqual(expected_output, quota_usages.usages)
# Compare available resources # Compare available resources
self.assertAvailableQuotasEqual(expected_output, quota_usages.usages) self.assertAvailableQuotasEqual(expected_output, quota_usages.usages)
@ -179,7 +179,7 @@ class QuotaTests(test.APITestCase):
unlimited_items=unlimited_items) unlimited_items=unlimited_items)
# Compare internal structure of usages to expected. # Compare internal structure of usages to expected.
self.assertItemsEqual(expected_output, quota_usages.usages) self.assertCountEqual(expected_output, quota_usages.usages)
# Compare available resources # Compare available resources
self.assertAvailableQuotasEqual(expected_output, quota_usages.usages) self.assertAvailableQuotasEqual(expected_output, quota_usages.usages)
@ -221,7 +221,7 @@ class QuotaTests(test.APITestCase):
expected_quotas = (quotas.CINDER_QUOTA_FIELDS | expected_quotas = (quotas.CINDER_QUOTA_FIELDS |
quotas.NEUTRON_QUOTA_FIELDS | quotas.NEUTRON_QUOTA_FIELDS |
quotas.NOVA_QUOTA_FIELDS) quotas.NOVA_QUOTA_FIELDS)
self.assertItemsEqual(result_quotas, expected_quotas) self.assertCountEqual(result_quotas, expected_quotas)
self._check_service_enabled({'compute': 1, 'network': 1, 'volume': 1}) self._check_service_enabled({'compute': 1, 'network': 1, 'volume': 1})
@ -238,7 +238,7 @@ class QuotaTests(test.APITestCase):
expected_output = self.get_usages_from_limits(with_volume=False) expected_output = self.get_usages_from_limits(with_volume=False)
# Compare internal structure of usages to expected. # Compare internal structure of usages to expected.
self.assertItemsEqual(expected_output, quota_usages.usages) self.assertCountEqual(expected_output, quota_usages.usages)
# Make sure that the `in` operator and the `.get()` method # Make sure that the `in` operator and the `.get()` method
# behave as expected # behave as expected
@ -265,7 +265,7 @@ class QuotaTests(test.APITestCase):
'cores': {'available': 10, 'used': 0, 'quota': 10}}) 'cores': {'available': 10, 'used': 0, 'quota': 10}})
# Compare internal structure of usages to expected. # Compare internal structure of usages to expected.
self.assertItemsEqual(expected_output, quota_usages.usages) self.assertCountEqual(expected_output, quota_usages.usages)
self._check_service_enabled({'compute': 2, 'network': 1, 'volume': 1}) self._check_service_enabled({'compute': 2, 'network': 1, 'volume': 1})
self.mock_tenant_absolute_limits.assert_called_once_with( self.mock_tenant_absolute_limits.assert_called_once_with(
@ -294,7 +294,7 @@ class QuotaTests(test.APITestCase):
'quota': float("inf")}}) 'quota': float("inf")}})
# Compare internal structure of usages to expected. # Compare internal structure of usages to expected.
self.assertItemsEqual(expected_output, quota_usages.usages) self.assertCountEqual(expected_output, quota_usages.usages)
self._check_service_enabled({'compute': 2, 'network': 1, 'volume': 1}) self._check_service_enabled({'compute': 2, 'network': 1, 'volume': 1})
self.mock_nova_tenant_absolute_limits.assert_called_once_with( self.mock_nova_tenant_absolute_limits.assert_called_once_with(
@ -320,7 +320,7 @@ class QuotaTests(test.APITestCase):
expected_output = self.get_usages_from_limits() expected_output = self.get_usages_from_limits()
# Compare internal structure of usages to expected. # Compare internal structure of usages to expected.
self.assertItemsEqual(expected_output, quota_usages.usages) self.assertCountEqual(expected_output, quota_usages.usages)
self._check_service_enabled({'compute': 2, 'network': 1, 'volume': 1}) self._check_service_enabled({'compute': 2, 'network': 1, 'volume': 1})
self.mock_nova_tenant_absolute_limits.assert_called_once_with( self.mock_nova_tenant_absolute_limits.assert_called_once_with(
@ -413,7 +413,7 @@ class QuotaTests(test.APITestCase):
expected = dict((k, v) for k, v in expected.items() if k in targets) expected = dict((k, v) for k, v in expected.items() if k in targets)
# Compare internal structure of usages to expected. # Compare internal structure of usages to expected.
self.assertItemsEqual(expected, quota_usages.usages) self.assertCountEqual(expected, quota_usages.usages)
# Compare available resources # Compare available resources
self.assertAvailableQuotasEqual(expected, quota_usages.usages) self.assertAvailableQuotasEqual(expected, quota_usages.usages)