Commit e63e617e authored by Andrew Dunai's avatar Andrew Dunai Committed by Chris Withers

bpo-35357: Add _mock_ prefix to name/parent/from_kall attributes of _Call/_MagicProxy. (#10873)

Fix minor typo in test function name.
parent eeb719ea
...@@ -2040,9 +2040,9 @@ class _Call(tuple): ...@@ -2040,9 +2040,9 @@ class _Call(tuple):
def __init__(self, value=(), name=None, parent=None, two=False, def __init__(self, value=(), name=None, parent=None, two=False,
from_kall=True): from_kall=True):
self.name = name self._mock_name = name
self.parent = parent self._mock_parent = parent
self.from_kall = from_kall self._mock_from_kall = from_kall
def __eq__(self, other): def __eq__(self, other):
...@@ -2059,8 +2059,8 @@ class _Call(tuple): ...@@ -2059,8 +2059,8 @@ class _Call(tuple):
else: else:
self_name, self_args, self_kwargs = self self_name, self_args, self_kwargs = self
if (getattr(self, 'parent', None) and getattr(other, 'parent', None) if (getattr(self, '_mock_parent', None) and getattr(other, '_mock_parent', None)
and self.parent != other.parent): and self._mock_parent != other._mock_parent):
return False return False
other_name = '' other_name = ''
...@@ -2104,17 +2104,17 @@ class _Call(tuple): ...@@ -2104,17 +2104,17 @@ class _Call(tuple):
def __call__(self, *args, **kwargs): def __call__(self, *args, **kwargs):
if self.name is None: if self._mock_name is None:
return _Call(('', args, kwargs), name='()') return _Call(('', args, kwargs), name='()')
name = self.name + '()' name = self._mock_name + '()'
return _Call((self.name, args, kwargs), name=name, parent=self) return _Call((self._mock_name, args, kwargs), name=name, parent=self)
def __getattr__(self, attr): def __getattr__(self, attr):
if self.name is None: if self._mock_name is None:
return _Call(name=attr, from_kall=False) return _Call(name=attr, from_kall=False)
name = '%s.%s' % (self.name, attr) name = '%s.%s' % (self._mock_name, attr)
return _Call(name=name, parent=self, from_kall=False) return _Call(name=name, parent=self, from_kall=False)
...@@ -2125,8 +2125,8 @@ class _Call(tuple): ...@@ -2125,8 +2125,8 @@ class _Call(tuple):
return self.__getattr__('index')(*args, **kwargs) return self.__getattr__('index')(*args, **kwargs)
def __repr__(self): def __repr__(self):
if not self.from_kall: if not self._mock_from_kall:
name = self.name or 'call' name = self._mock_name or 'call'
if name.startswith('()'): if name.startswith('()'):
name = 'call%s' % name name = 'call%s' % name
return name return name
...@@ -2152,9 +2152,9 @@ class _Call(tuple): ...@@ -2152,9 +2152,9 @@ class _Call(tuple):
vals = [] vals = []
thing = self thing = self
while thing is not None: while thing is not None:
if thing.from_kall: if thing._mock_from_kall:
vals.append(thing) vals.append(thing)
thing = thing.parent thing = thing._mock_parent
return _CallList(reversed(vals)) return _CallList(reversed(vals))
......
...@@ -128,7 +128,7 @@ class TestCallable(unittest.TestCase): ...@@ -128,7 +128,7 @@ class TestCallable(unittest.TestCase):
result.foo.assert_called_once_with(3, 2, 1) result.foo.assert_called_once_with(3, 2, 1)
def test_create_autopsec(self): def test_create_autospec(self):
mock = create_autospec(X) mock = create_autospec(X)
instance = mock() instance = mock()
self.assertRaises(TypeError, instance) self.assertRaises(TypeError, instance)
......
...@@ -9,7 +9,7 @@ from unittest import mock ...@@ -9,7 +9,7 @@ from unittest import mock
from unittest.mock import ( from unittest.mock import (
call, DEFAULT, patch, sentinel, call, DEFAULT, patch, sentinel,
MagicMock, Mock, NonCallableMock, MagicMock, Mock, NonCallableMock,
NonCallableMagicMock, _CallList, NonCallableMagicMock, _Call, _CallList,
create_autospec create_autospec
) )
...@@ -1665,6 +1665,20 @@ class MockTest(unittest.TestCase): ...@@ -1665,6 +1665,20 @@ class MockTest(unittest.TestCase):
self.assertIsInstance(mock, int) self.assertIsInstance(mock, int)
mock.foo mock.foo
def test_name_attribute_of_call(self):
# bpo-35357: _Call should not disclose any attributes whose names
# may clash with popular ones (such as ".name")
self.assertIsNotNone(call.name)
self.assertEqual(type(call.name), _Call)
self.assertEqual(type(call.name().name), _Call)
def test_parent_attribute_of_call(self):
# bpo-35357: _Call should not disclose any attributes whose names
# may clash with popular ones (such as ".parent")
self.assertIsNotNone(call.parent)
self.assertEqual(type(call.parent), _Call)
self.assertEqual(type(call.parent().parent), _Call)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
Internal attributes' names of unittest.mock._Call and
unittest.mock.MagicProxy (name, parent & from_kall) are now prefixed with
_mock_ in order to prevent clashes with widely used object attributes.
Fixed minor typo in test function name.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment