Use assertIn and assertNotIn
Tests should use: self.assertIn(value, list) self.assertNotIn(value, list) instead of: self.assertTrue(value in list) self.assertFalse(value in list) because assertIn and assertNotIn raise more meaningful errors: self.assertIn(3, [1, 2]) >>> MismatchError: 3 not in [1, 2] self.assertTrue(3 in [1, 2]) >>> AssertionError: False is not true Closes-Bug: #1510007 Change-Id: If33252cc93c06a85e61871fb7b22b726f4a08500
This commit is contained in:
parent
a930ac216b
commit
798c7e35ef
|
@ -18,3 +18,5 @@ Magnum Specific Commandments
|
||||||
assertIsNotNone(A).
|
assertIsNotNone(A).
|
||||||
- [M316] Change assertTrue(isinstance(A, B)) by optimal assert like
|
- [M316] Change assertTrue(isinstance(A, B)) by optimal assert like
|
||||||
assertIsInstance(A, B).
|
assertIsInstance(A, B).
|
||||||
|
- [M334] Change assertTrue/False(A in/not in B, message) to the more specific
|
||||||
|
assertIn/NotIn(A, B, message)
|
||||||
|
|
|
@ -33,9 +33,13 @@ Guidelines for writing new hacking checks
|
||||||
enforce_re = re.compile(r"@policy.enforce_wsgi*")
|
enforce_re = re.compile(r"@policy.enforce_wsgi*")
|
||||||
decorator_re = re.compile(r"@.*")
|
decorator_re = re.compile(r"@.*")
|
||||||
mutable_default_args = re.compile(r"^\s*def .+\((.+=\{\}|.+=\[\])")
|
mutable_default_args = re.compile(r"^\s*def .+\((.+=\{\}|.+=\[\])")
|
||||||
asse_equal_end_with_none_re = re.compile(
|
assert_equal_in_end_with_true_or_false_re = re.compile(
|
||||||
|
r"assertEqual\((\w|[][.'\"])+ in (\w|[][.'\", ])+, (True|False)\)")
|
||||||
|
assert_equal_in_start_with_true_or_false_re = re.compile(
|
||||||
|
r"assertEqual\((True|False), (\w|[][.'\"])+ in (\w|[][.'\", ])+\)")
|
||||||
|
assert_equal_end_with_none_re = re.compile(
|
||||||
r"(.)*assertEqual\((\w|\.|\'|\"|\[|\])+, None\)")
|
r"(.)*assertEqual\((\w|\.|\'|\"|\[|\])+, None\)")
|
||||||
asse_equal_start_with_none_re = re.compile(
|
assert_equal_start_with_none_re = re.compile(
|
||||||
r"(.)*assertEqual\(None, (\w|\.|\'|\"|\[|\])+\)")
|
r"(.)*assertEqual\(None, (\w|\.|\'|\"|\[|\])+\)")
|
||||||
assert_equal_with_true_re = re.compile(
|
assert_equal_with_true_re = re.compile(
|
||||||
r"assertEqual\(True,")
|
r"assertEqual\(True,")
|
||||||
|
@ -65,8 +69,8 @@ def assert_equal_none(logical_line):
|
||||||
"""
|
"""
|
||||||
msg = ("M318: assertEqual(A, None) or assertEqual(None, A) "
|
msg = ("M318: assertEqual(A, None) or assertEqual(None, A) "
|
||||||
"sentences not allowed")
|
"sentences not allowed")
|
||||||
res = (asse_equal_start_with_none_re.match(logical_line) or
|
res = (assert_equal_start_with_none_re.match(logical_line) or
|
||||||
asse_equal_end_with_none_re.match(logical_line))
|
assert_equal_end_with_none_re.match(logical_line))
|
||||||
if res:
|
if res:
|
||||||
yield (0, msg)
|
yield (0, msg)
|
||||||
|
|
||||||
|
@ -106,6 +110,19 @@ def assert_true_isinstance(logical_line):
|
||||||
yield (0, "M316: assertTrue(isinstance(a, b)) sentences not allowed")
|
yield (0, "M316: assertTrue(isinstance(a, b)) sentences not allowed")
|
||||||
|
|
||||||
|
|
||||||
|
def assert_equal_in(logical_line):
|
||||||
|
"""Check for assertEqual(True|False, A in B), assertEqual(A in B, True|False)
|
||||||
|
|
||||||
|
M338
|
||||||
|
"""
|
||||||
|
res = (assert_equal_in_start_with_true_or_false_re.search(logical_line) or
|
||||||
|
assert_equal_in_end_with_true_or_false_re.search(logical_line))
|
||||||
|
if res:
|
||||||
|
yield (0, "M338: Use assertIn/NotIn(A, B) rather than "
|
||||||
|
"assertEqual(A in B, True/False) when checking collection "
|
||||||
|
"contents.")
|
||||||
|
|
||||||
|
|
||||||
def factory(register):
|
def factory(register):
|
||||||
register(check_policy_enforce_decorator)
|
register(check_policy_enforce_decorator)
|
||||||
register(no_mutable_default_args)
|
register(no_mutable_default_args)
|
||||||
|
@ -113,3 +130,4 @@ def factory(register):
|
||||||
register(assert_equal_true_or_false)
|
register(assert_equal_true_or_false)
|
||||||
register(assert_equal_not_none)
|
register(assert_equal_not_none)
|
||||||
register(assert_true_isinstance)
|
register(assert_true_isinstance)
|
||||||
|
register(assert_equal_in)
|
||||||
|
|
|
@ -153,20 +153,20 @@ class BayTest(BaseMagnumClient):
|
||||||
def _test_baymodel_create_and_delete(self, delete=True):
|
def _test_baymodel_create_and_delete(self, delete=True):
|
||||||
baymodel = self._create_baymodel('testbay', coe=self.coe)
|
baymodel = self._create_baymodel('testbay', coe=self.coe)
|
||||||
list = [item.uuid for item in self.cs.baymodels.list()]
|
list = [item.uuid for item in self.cs.baymodels.list()]
|
||||||
self.assertTrue(baymodel.uuid in list)
|
self.assertIn(baymodel.uuid, list)
|
||||||
|
|
||||||
if not delete:
|
if not delete:
|
||||||
return baymodel
|
return baymodel
|
||||||
else:
|
else:
|
||||||
self.cs.baymodels.delete(baymodel.uuid)
|
self.cs.baymodels.delete(baymodel.uuid)
|
||||||
list = [item.uuid for item in self.cs.baymodels.list()]
|
list = [item.uuid for item in self.cs.baymodels.list()]
|
||||||
self.assertTrue(baymodel.uuid not in list)
|
self.assertNotIn(baymodel.uuid, list)
|
||||||
|
|
||||||
def _test_bay_create_and_delete(self):
|
def _test_bay_create_and_delete(self):
|
||||||
baymodel = self._test_baymodel_create_and_delete(delete=False)
|
baymodel = self._test_baymodel_create_and_delete(delete=False)
|
||||||
bay = self._create_bay('testbay', baymodel.uuid)
|
bay = self._create_bay('testbay', baymodel.uuid)
|
||||||
list = [item.uuid for item in self.cs.bays.list()]
|
list = [item.uuid for item in self.cs.bays.list()]
|
||||||
self.assertTrue(bay.uuid in list)
|
self.assertIn(bay.uuid, list)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.assertIn(self.cs.bays.get(bay.uuid).status,
|
self.assertIn(self.cs.bays.get(bay.uuid).status,
|
||||||
|
|
|
@ -47,7 +47,7 @@ class ContextTestCase(base.TestCase):
|
||||||
self.assertEqual("tenant1", ctx.project_name)
|
self.assertEqual("tenant1", ctx.project_name)
|
||||||
self.assertEqual("tenant-id1", ctx.project_id)
|
self.assertEqual("tenant-id1", ctx.project_id)
|
||||||
for role in ctx.roles:
|
for role in ctx.roles:
|
||||||
self.assertTrue(role in ['admin', 'service'])
|
self.assertIn(role, ['admin', 'service'])
|
||||||
self.assertTrue(ctx.is_admin)
|
self.assertTrue(ctx.is_admin)
|
||||||
self.assertTrue(ctx.read_only)
|
self.assertTrue(ctx.read_only)
|
||||||
self.assertTrue(ctx.show_deleted)
|
self.assertTrue(ctx.show_deleted)
|
||||||
|
|
|
@ -226,7 +226,7 @@ class _TestObject(object):
|
||||||
except NotImplementedError as ex:
|
except NotImplementedError as ex:
|
||||||
raised = True
|
raised = True
|
||||||
self.assertTrue(raised)
|
self.assertTrue(raised)
|
||||||
self.assertTrue('foobar' in str(ex))
|
self.assertIn('foobar', str(ex))
|
||||||
|
|
||||||
def test_loaded_in_primitive(self):
|
def test_loaded_in_primitive(self):
|
||||||
obj = MyObj(self.context)
|
obj = MyObj(self.context)
|
||||||
|
@ -246,7 +246,7 @@ class _TestObject(object):
|
||||||
obj.foo = 123
|
obj.foo = 123
|
||||||
self.assertEqual(set(['foo']), obj.obj_what_changed())
|
self.assertEqual(set(['foo']), obj.obj_what_changed())
|
||||||
primitive = obj.obj_to_primitive()
|
primitive = obj.obj_to_primitive()
|
||||||
self.assertTrue('magnum_object.changes' in primitive)
|
self.assertIn('magnum_object.changes', primitive)
|
||||||
obj2 = MyObj.obj_from_primitive(primitive)
|
obj2 = MyObj.obj_from_primitive(primitive)
|
||||||
self.assertEqual(set(['foo']), obj2.obj_what_changed())
|
self.assertEqual(set(['foo']), obj2.obj_what_changed())
|
||||||
obj2.obj_reset_changes()
|
obj2.obj_reset_changes()
|
||||||
|
@ -346,10 +346,10 @@ class _TestObject(object):
|
||||||
|
|
||||||
def test_contains(self):
|
def test_contains(self):
|
||||||
obj = MyObj(self.context)
|
obj = MyObj(self.context)
|
||||||
self.assertFalse('foo' in obj)
|
self.assertNotIn('foo', obj)
|
||||||
obj.foo = 1
|
obj.foo = 1
|
||||||
self.assertTrue('foo' in obj)
|
self.assertIn('foo', obj)
|
||||||
self.assertFalse('does_not_exist' in obj)
|
self.assertNotIn('does_not_exist', obj)
|
||||||
|
|
||||||
def test_obj_attr_is_set(self):
|
def test_obj_attr_is_set(self):
|
||||||
obj = MyObj(self.context, foo=1)
|
obj = MyObj(self.context, foo=1)
|
||||||
|
@ -463,7 +463,7 @@ class TestObjectSerializer(test_base.TestCase):
|
||||||
ser = base.MagnumObjectSerializer()
|
ser = base.MagnumObjectSerializer()
|
||||||
obj = MyObj(self.context)
|
obj = MyObj(self.context)
|
||||||
primitive = ser.serialize_entity(self.context, obj)
|
primitive = ser.serialize_entity(self.context, obj)
|
||||||
self.assertTrue('magnum_object.name' in primitive)
|
self.assertIn('magnum_object.name', primitive)
|
||||||
obj2 = ser.deserialize_entity(self.context, primitive)
|
obj2 = ser.deserialize_entity(self.context, primitive)
|
||||||
self.assertIsInstance(obj2, MyObj)
|
self.assertIsInstance(obj2, MyObj)
|
||||||
self.assertEqual(self.context, obj2._context)
|
self.assertEqual(self.context, obj2._context)
|
||||||
|
|
|
@ -86,6 +86,43 @@ class HackingTestCase(base.TestCase):
|
||||||
self._assert_has_errors(code, checks.check_policy_enforce_decorator,
|
self._assert_has_errors(code, checks.check_policy_enforce_decorator,
|
||||||
expected_errors=[(2, 0, "M301")])
|
expected_errors=[(2, 0, "M301")])
|
||||||
|
|
||||||
|
def test_assert_equal_in(self):
|
||||||
|
self.assertEqual(1, len(list(checks.assert_equal_in(
|
||||||
|
"self.assertEqual(a in b, True)"))))
|
||||||
|
|
||||||
|
self.assertEqual(1, len(list(checks.assert_equal_in(
|
||||||
|
"self.assertEqual('str' in 'string', True)"))))
|
||||||
|
|
||||||
|
self.assertEqual(0, len(list(checks.assert_equal_in(
|
||||||
|
"self.assertEqual(any(a==1 for a in b), True)"))))
|
||||||
|
|
||||||
|
self.assertEqual(1, len(list(checks.assert_equal_in(
|
||||||
|
"self.assertEqual(True, a in b)"))))
|
||||||
|
|
||||||
|
self.assertEqual(1, len(list(checks.assert_equal_in(
|
||||||
|
"self.assertEqual(True, 'str' in 'string')"))))
|
||||||
|
|
||||||
|
self.assertEqual(0, len(list(checks.assert_equal_in(
|
||||||
|
"self.assertEqual(True, any(a==1 for a in b))"))))
|
||||||
|
|
||||||
|
self.assertEqual(1, len(list(checks.assert_equal_in(
|
||||||
|
"self.assertEqual(a in b, False)"))))
|
||||||
|
|
||||||
|
self.assertEqual(1, len(list(checks.assert_equal_in(
|
||||||
|
"self.assertEqual('str' in 'string', False)"))))
|
||||||
|
|
||||||
|
self.assertEqual(0, len(list(checks.assert_equal_in(
|
||||||
|
"self.assertEqual(any(a==1 for a in b), False)"))))
|
||||||
|
|
||||||
|
self.assertEqual(1, len(list(checks.assert_equal_in(
|
||||||
|
"self.assertEqual(False, a in b)"))))
|
||||||
|
|
||||||
|
self.assertEqual(1, len(list(checks.assert_equal_in(
|
||||||
|
"self.assertEqual(False, 'str' in 'string')"))))
|
||||||
|
|
||||||
|
self.assertEqual(0, len(list(checks.assert_equal_in(
|
||||||
|
"self.assertEqual(False, any(a==1 for a in b))"))))
|
||||||
|
|
||||||
def test_assert_equal_none(self):
|
def test_assert_equal_none(self):
|
||||||
self.assertEqual(len(list(checks.assert_equal_none(
|
self.assertEqual(len(list(checks.assert_equal_none(
|
||||||
"self.assertEqual(A, None)"))), 1)
|
"self.assertEqual(A, None)"))), 1)
|
||||||
|
|
Loading…
Reference in New Issue