Skip to content

Commit 12735c1

Browse files
miss-islingtonand3rson
authored andcommitted
bpo-35357: Add _mock_ prefix to name/parent/from_kall attributes of _Call/_MagicProxy. (GH-10873) (#10887)
Fix minor typo in test function name. (cherry picked from commit e63e617) Co-authored-by: Andrew Dunai <[email protected]>
1 parent 6627d3a commit 12735c1

File tree

4 files changed

+34
-16
lines changed

4 files changed

+34
-16
lines changed

Lib/unittest/mock.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2016,9 +2016,9 @@ def __new__(cls, value=(), name='', parent=None, two=False,
20162016

20172017
def __init__(self, value=(), name=None, parent=None, two=False,
20182018
from_kall=True):
2019-
self.name = name
2020-
self.parent = parent
2021-
self.from_kall = from_kall
2019+
self._mock_name = name
2020+
self._mock_parent = parent
2021+
self._mock_from_kall = from_kall
20222022

20232023

20242024
def __eq__(self, other):
@@ -2035,8 +2035,8 @@ def __eq__(self, other):
20352035
else:
20362036
self_name, self_args, self_kwargs = self
20372037

2038-
if (getattr(self, 'parent', None) and getattr(other, 'parent', None)
2039-
and self.parent != other.parent):
2038+
if (getattr(self, '_mock_parent', None) and getattr(other, '_mock_parent', None)
2039+
and self._mock_parent != other._mock_parent):
20402040
return False
20412041

20422042
other_name = ''
@@ -2080,17 +2080,17 @@ def __eq__(self, other):
20802080

20812081

20822082
def __call__(self, *args, **kwargs):
2083-
if self.name is None:
2083+
if self._mock_name is None:
20842084
return _Call(('', args, kwargs), name='()')
20852085

2086-
name = self.name + '()'
2087-
return _Call((self.name, args, kwargs), name=name, parent=self)
2086+
name = self._mock_name + '()'
2087+
return _Call((self._mock_name, args, kwargs), name=name, parent=self)
20882088

20892089

20902090
def __getattr__(self, attr):
2091-
if self.name is None:
2091+
if self._mock_name is None:
20922092
return _Call(name=attr, from_kall=False)
2093-
name = '%s.%s' % (self.name, attr)
2093+
name = '%s.%s' % (self._mock_name, attr)
20942094
return _Call(name=name, parent=self, from_kall=False)
20952095

20962096

@@ -2101,8 +2101,8 @@ def index(self, *args, **kwargs):
21012101
return self.__getattr__('index')(*args, **kwargs)
21022102

21032103
def __repr__(self):
2104-
if not self.from_kall:
2105-
name = self.name or 'call'
2104+
if not self._mock_from_kall:
2105+
name = self._mock_name or 'call'
21062106
if name.startswith('()'):
21072107
name = 'call%s' % name
21082108
return name
@@ -2128,9 +2128,9 @@ def call_list(self):
21282128
vals = []
21292129
thing = self
21302130
while thing is not None:
2131-
if thing.from_kall:
2131+
if thing._mock_from_kall:
21322132
vals.append(thing)
2133-
thing = thing.parent
2133+
thing = thing._mock_parent
21342134
return _CallList(reversed(vals))
21352135

21362136

Lib/unittest/test/testmock/testcallable.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class Multi(SomeClass, Sub):
128128
result.foo.assert_called_once_with(3, 2, 1)
129129

130130

131-
def test_create_autopsec(self):
131+
def test_create_autospec(self):
132132
mock = create_autospec(X)
133133
instance = mock()
134134
self.assertRaises(TypeError, instance)

Lib/unittest/test/testmock/testmock.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from unittest.mock import (
99
call, DEFAULT, patch, sentinel,
1010
MagicMock, Mock, NonCallableMock,
11-
NonCallableMagicMock, _CallList,
11+
NonCallableMagicMock, _Call, _CallList,
1212
create_autospec
1313
)
1414

@@ -1635,6 +1635,20 @@ def test_class_assignable(self):
16351635
self.assertIsInstance(mock, int)
16361636
mock.foo
16371637

1638+
def test_name_attribute_of_call(self):
1639+
# bpo-35357: _Call should not disclose any attributes whose names
1640+
# may clash with popular ones (such as ".name")
1641+
self.assertIsNotNone(call.name)
1642+
self.assertEqual(type(call.name), _Call)
1643+
self.assertEqual(type(call.name().name), _Call)
1644+
1645+
def test_parent_attribute_of_call(self):
1646+
# bpo-35357: _Call should not disclose any attributes whose names
1647+
# may clash with popular ones (such as ".parent")
1648+
self.assertIsNotNone(call.parent)
1649+
self.assertEqual(type(call.parent), _Call)
1650+
self.assertEqual(type(call.parent().parent), _Call)
1651+
16381652

16391653
if __name__ == '__main__':
16401654
unittest.main()
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Internal attributes' names of unittest.mock._Call and
2+
unittest.mock.MagicProxy (name, parent & from_kall) are now prefixed with
3+
_mock_ in order to prevent clashes with widely used object attributes.
4+
Fixed minor typo in test function name.

0 commit comments

Comments
 (0)