From 37c5a0343ed323d1a492e3bc07d8e104d3064e44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Iranzo=20G=C3=B3mez?= Date: Mon, 4 Jul 2016 15:55:54 +0200 Subject: [PATCH] Add validator to test integers This is needed to add a validator to weight in https://review.openstack.org/#/c/336461/ in order to close the bug https://launchpad.net/bugs/1573857. Change-Id: I63a96f9b8565d5829192055a4d7784845f0c794d Partial-Bug: 1598879 Partial-Bug: 1603212 --- neutron_lib/api/validators.py | 35 +++++++++++++++++++ neutron_lib/tests/unit/api/test_validators.py | 24 +++++++++++++ 2 files changed, 59 insertions(+) diff --git a/neutron_lib/api/validators.py b/neutron_lib/api/validators.py index 36a3d6b..2512359 100644 --- a/neutron_lib/api/validators.py +++ b/neutron_lib/api/validators.py @@ -140,6 +140,40 @@ def validate_boolean(data, valid_values=None): return msg +def validate_integer(data, valid_values=None): + """This function validates if the data is an integer. + + It checks both number or string provided to validate it's an + integer and returns a message with the error if it's not + + :param data: The string or number to validate as integer + :param valid_values: values to limit the 'data' to + :return: Message if not an integer. + """ + + if valid_values is not None: + msg = validate_values(data=data, valid_values=valid_values) + if msg: + return msg + + msg = _("'%s' is not an integer") % data + try: + fl_n = float(data) + int_n = int(data) + except (ValueError, TypeError, OverflowError): + LOG.debug(msg) + return msg + + # Fail test if non equal or boolean + if fl_n != int_n: + LOG.debug(msg) + return msg + elif isinstance(data, bool): + msg = _("'%s' is not an integer:boolean") % data + LOG.debug(msg) + return msg + + def validate_range(data, valid_values=None): """Check that integer value is within a range provided. @@ -578,6 +612,7 @@ validators = {'type:dict': validate_dict, 'type:uuid_list': validate_uuid_list, 'type:values': validate_values, 'type:boolean': validate_boolean, + 'type:integer': validate_integer, 'type:list_of_unique_strings': validate_list_of_unique_strings} diff --git a/neutron_lib/tests/unit/api/test_validators.py b/neutron_lib/tests/unit/api/test_validators.py index 57cf5f8..583a3f1 100644 --- a/neutron_lib/tests/unit/api/test_validators.py +++ b/neutron_lib/tests/unit/api/test_validators.py @@ -181,6 +181,30 @@ class TestAttributeValidation(base.BaseTestCase): msg = validators.validate_boolean("fasle") self.assertEqual("'fasle' is not a valid boolean value", msg) + def test_validate_integer(self): + msg = validators.validate_integer(1) + self.assertIsNone(msg) + msg = validators.validate_integer(0.1) + self.assertEqual("'0.1' is not an integer", msg) + msg = validators.validate_integer("1") + self.assertIsNone(msg) + msg = validators.validate_integer("0.1") + self.assertEqual("'0.1' is not an integer", msg) + msg = validators.validate_integer(True) + self.assertEqual("'True' is not an integer:boolean", msg) + msg = validators.validate_integer(False) + self.assertEqual("'False' is not an integer:boolean", msg) + msg = validators.validate_integer(float('Inf')) + self.assertEqual("'inf' is not an integer", msg) + msg = validators.validate_integer(None) + self.assertEqual("'None' is not an integer", msg) + + def test_validate_integer_values(self): + msg = validators.validate_integer(2, [2, 3, 4, 5]) + self.assertIsNone(msg) + msg = validators.validate_integer(1, [2, 3, 4, 5]) + self.assertEqual("'1' is not in [2, 3, 4, 5]", msg) + def test_validate_no_whitespace(self): data = 'no_white_space' result = validators.validate_no_whitespace(data)