blob: c0178f11647072fb9f6ba733d46510a686a2da8e [file] [log] [blame]
Michael Foord345266a2012-03-14 12:24:34 -07001# mock.py
2# Test tools for mocking and patching.
Michael Foordc17adf42012-03-14 13:30:29 -07003# Maintained by Michael Foord
4# Backport for other versions of Python available from
Ned Deily9d6d06e2018-06-11 00:45:50 -04005# https://pypi.org/project/mock
Michael Foord345266a2012-03-14 12:24:34 -07006
7__all__ = (
8 'Mock',
9 'MagicMock',
10 'patch',
11 'sentinel',
12 'DEFAULT',
13 'ANY',
14 'call',
15 'create_autospec',
Lisa Roach77b3b772019-05-20 09:19:53 -070016 'AsyncMock',
Michael Foord345266a2012-03-14 12:24:34 -070017 'FILTER_DIR',
18 'NonCallableMock',
19 'NonCallableMagicMock',
20 'mock_open',
21 'PropertyMock',
Mario Corchero552be9d2017-10-17 12:35:11 +010022 'seal',
Michael Foord345266a2012-03-14 12:24:34 -070023)
24
25
Lisa Roach77b3b772019-05-20 09:19:53 -070026import asyncio
Xtreak436c2b02019-05-28 12:37:39 +053027import contextlib
Rémi Lapeyre11a88322019-05-07 12:48:36 +020028import io
Michael Foord345266a2012-03-14 12:24:34 -070029import inspect
30import pprint
31import sys
Michael Foordfddcfa22014-04-14 16:25:20 -040032import builtins
Chris Withersc7dd3c72020-01-27 14:11:19 +000033from asyncio import iscoroutinefunction
Lisa Roach77b3b772019-05-20 09:19:53 -070034from types import CodeType, ModuleType, MethodType
Petter Strandmark47d94242018-10-28 21:37:10 +010035from unittest.util import safe_repr
Antoine Pitrou5c64df72013-02-03 00:23:58 +010036from functools import wraps, partial
Michael Foord345266a2012-03-14 12:24:34 -070037
38
Michael Foordfddcfa22014-04-14 16:25:20 -040039_builtins = {name for name in dir(builtins) if not name.startswith('_')}
40
Michael Foord345266a2012-03-14 12:24:34 -070041FILTER_DIR = True
42
Nick Coghlan0b43bcf2012-05-27 18:17:07 +100043# Workaround for issue #12370
44# Without this, the __class__ properties wouldn't be set correctly
45_safe_super = super
Michael Foord345266a2012-03-14 12:24:34 -070046
Lisa Roach77b3b772019-05-20 09:19:53 -070047def _is_async_obj(obj):
Lisa Roachf1a297a2019-09-10 12:18:40 +010048 if _is_instance_mock(obj) and not isinstance(obj, AsyncMock):
Lisa Roach77b3b772019-05-20 09:19:53 -070049 return False
Matthew Kokotovich62865f42020-01-25 04:17:47 -060050 if hasattr(obj, '__func__'):
51 obj = getattr(obj, '__func__')
Chris Withersc7dd3c72020-01-27 14:11:19 +000052 return iscoroutinefunction(obj) or inspect.isawaitable(obj)
Lisa Roach77b3b772019-05-20 09:19:53 -070053
54
Xtreakff6b2e62019-05-27 18:26:23 +053055def _is_async_func(func):
56 if getattr(func, '__code__', None):
Chris Withersc7dd3c72020-01-27 14:11:19 +000057 return iscoroutinefunction(func)
Xtreakff6b2e62019-05-27 18:26:23 +053058 else:
59 return False
60
61
Michael Foord345266a2012-03-14 12:24:34 -070062def _is_instance_mock(obj):
63 # can't use isinstance on Mock objects because they override __class__
64 # The base class for all mocks is NonCallableMock
65 return issubclass(type(obj), NonCallableMock)
66
67
68def _is_exception(obj):
69 return (
Chris Withers49e27f02019-05-01 08:48:44 +010070 isinstance(obj, BaseException) or
71 isinstance(obj, type) and issubclass(obj, BaseException)
Michael Foord345266a2012-03-14 12:24:34 -070072 )
73
74
Xtreak7397cda2019-07-22 13:08:22 +053075def _extract_mock(obj):
76 # Autospecced functions will return a FunctionType with "mock" attribute
77 # which is the actual mock object that needs to be used.
78 if isinstance(obj, FunctionTypes) and hasattr(obj, 'mock'):
79 return obj.mock
80 else:
81 return obj
82
83
Antoine Pitrou5c64df72013-02-03 00:23:58 +010084def _get_signature_object(func, as_instance, eat_self):
85 """
86 Given an arbitrary, possibly callable object, try to create a suitable
87 signature object.
88 Return a (reduced func, signature) tuple, or None.
89 """
90 if isinstance(func, type) and not as_instance:
91 # If it's a type and should be modelled as a type, use __init__.
Chris Withersadbf1782019-05-01 23:04:04 +010092 func = func.__init__
Antoine Pitrou5c64df72013-02-03 00:23:58 +010093 # Skip the `self` argument in __init__
94 eat_self = True
Michael Foord345266a2012-03-14 12:24:34 -070095 elif not isinstance(func, FunctionTypes):
Antoine Pitrou5c64df72013-02-03 00:23:58 +010096 # If we really want to model an instance of the passed type,
97 # __call__ should be looked up, not __init__.
Michael Foord345266a2012-03-14 12:24:34 -070098 try:
99 func = func.__call__
100 except AttributeError:
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100101 return None
102 if eat_self:
103 sig_func = partial(func, None)
104 else:
105 sig_func = func
Michael Foord345266a2012-03-14 12:24:34 -0700106 try:
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100107 return func, inspect.signature(sig_func)
108 except ValueError:
109 # Certain callable types are not supported by inspect.signature()
110 return None
Michael Foord345266a2012-03-14 12:24:34 -0700111
112
113def _check_signature(func, mock, skipfirst, instance=False):
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100114 sig = _get_signature_object(func, instance, skipfirst)
115 if sig is None:
Michael Foord345266a2012-03-14 12:24:34 -0700116 return
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100117 func, sig = sig
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300118 def checksig(self, /, *args, **kwargs):
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100119 sig.bind(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700120 _copy_func_details(func, checksig)
121 type(mock)._mock_check_sig = checksig
Xtreakf7fa62e2018-12-12 13:24:54 +0530122 type(mock).__signature__ = sig
Michael Foord345266a2012-03-14 12:24:34 -0700123
124
125def _copy_func_details(func, funcopy):
Michael Foord345266a2012-03-14 12:24:34 -0700126 # we explicitly don't copy func.__dict__ into this copy as it would
127 # expose original attributes that should be mocked
Berker Peksag161a4dd2016-12-15 05:21:44 +0300128 for attribute in (
129 '__name__', '__doc__', '__text_signature__',
130 '__module__', '__defaults__', '__kwdefaults__',
131 ):
132 try:
133 setattr(funcopy, attribute, getattr(func, attribute))
134 except AttributeError:
135 pass
Michael Foord345266a2012-03-14 12:24:34 -0700136
137
138def _callable(obj):
139 if isinstance(obj, type):
140 return True
Xtreak9b218562019-04-22 08:00:23 +0530141 if isinstance(obj, (staticmethod, classmethod, MethodType)):
142 return _callable(obj.__func__)
Michael Foord345266a2012-03-14 12:24:34 -0700143 if getattr(obj, '__call__', None) is not None:
144 return True
145 return False
146
147
148def _is_list(obj):
149 # checks for list or tuples
150 # XXXX badly named!
151 return type(obj) in (list, tuple)
152
153
154def _instance_callable(obj):
155 """Given an object, return True if the object is callable.
156 For classes, return True if instances would be callable."""
157 if not isinstance(obj, type):
158 # already an instance
159 return getattr(obj, '__call__', None) is not None
160
Michael Foorda74b3aa2012-03-14 14:40:22 -0700161 # *could* be broken by a class overriding __mro__ or __dict__ via
162 # a metaclass
163 for base in (obj,) + obj.__mro__:
164 if base.__dict__.get('__call__') is not None:
Michael Foord345266a2012-03-14 12:24:34 -0700165 return True
166 return False
167
168
169def _set_signature(mock, original, instance=False):
170 # creates a function with signature (*args, **kwargs) that delegates to a
171 # mock. It still does signature checking by calling a lambda with the same
172 # signature as the original.
Michael Foord345266a2012-03-14 12:24:34 -0700173
174 skipfirst = isinstance(original, type)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100175 result = _get_signature_object(original, instance, skipfirst)
Michael Foord345266a2012-03-14 12:24:34 -0700176 if result is None:
Aaron Gallagher856cbcc2017-07-19 17:01:14 -0700177 return mock
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100178 func, sig = result
179 def checksig(*args, **kwargs):
180 sig.bind(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700181 _copy_func_details(func, checksig)
182
183 name = original.__name__
184 if not name.isidentifier():
185 name = 'funcopy'
Michael Foord313f85f2012-03-25 18:16:07 +0100186 context = {'_checksig_': checksig, 'mock': mock}
Michael Foord345266a2012-03-14 12:24:34 -0700187 src = """def %s(*args, **kwargs):
Michael Foord313f85f2012-03-25 18:16:07 +0100188 _checksig_(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700189 return mock(*args, **kwargs)""" % name
190 exec (src, context)
191 funcopy = context[name]
Xtreakf7fa62e2018-12-12 13:24:54 +0530192 _setup_func(funcopy, mock, sig)
Michael Foord345266a2012-03-14 12:24:34 -0700193 return funcopy
194
195
Xtreakf7fa62e2018-12-12 13:24:54 +0530196def _setup_func(funcopy, mock, sig):
Michael Foord345266a2012-03-14 12:24:34 -0700197 funcopy.mock = mock
198
Michael Foord345266a2012-03-14 12:24:34 -0700199 def assert_called_with(*args, **kwargs):
200 return mock.assert_called_with(*args, **kwargs)
Gregory P. Smithac5084b2016-10-06 14:31:23 -0700201 def assert_called(*args, **kwargs):
202 return mock.assert_called(*args, **kwargs)
203 def assert_not_called(*args, **kwargs):
204 return mock.assert_not_called(*args, **kwargs)
205 def assert_called_once(*args, **kwargs):
206 return mock.assert_called_once(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700207 def assert_called_once_with(*args, **kwargs):
208 return mock.assert_called_once_with(*args, **kwargs)
209 def assert_has_calls(*args, **kwargs):
210 return mock.assert_has_calls(*args, **kwargs)
211 def assert_any_call(*args, **kwargs):
212 return mock.assert_any_call(*args, **kwargs)
213 def reset_mock():
214 funcopy.method_calls = _CallList()
215 funcopy.mock_calls = _CallList()
216 mock.reset_mock()
217 ret = funcopy.return_value
218 if _is_instance_mock(ret) and not ret is mock:
219 ret.reset_mock()
220
221 funcopy.called = False
222 funcopy.call_count = 0
223 funcopy.call_args = None
224 funcopy.call_args_list = _CallList()
225 funcopy.method_calls = _CallList()
226 funcopy.mock_calls = _CallList()
227
228 funcopy.return_value = mock.return_value
229 funcopy.side_effect = mock.side_effect
230 funcopy._mock_children = mock._mock_children
231
232 funcopy.assert_called_with = assert_called_with
233 funcopy.assert_called_once_with = assert_called_once_with
234 funcopy.assert_has_calls = assert_has_calls
235 funcopy.assert_any_call = assert_any_call
236 funcopy.reset_mock = reset_mock
Gregory P. Smithac5084b2016-10-06 14:31:23 -0700237 funcopy.assert_called = assert_called
238 funcopy.assert_not_called = assert_not_called
239 funcopy.assert_called_once = assert_called_once
Xtreakf7fa62e2018-12-12 13:24:54 +0530240 funcopy.__signature__ = sig
Michael Foord345266a2012-03-14 12:24:34 -0700241
242 mock._mock_delegate = funcopy
243
244
Xtreakff6b2e62019-05-27 18:26:23 +0530245def _setup_async_mock(mock):
246 mock._is_coroutine = asyncio.coroutines._is_coroutine
247 mock.await_count = 0
248 mock.await_args = None
249 mock.await_args_list = _CallList()
Xtreakff6b2e62019-05-27 18:26:23 +0530250
251 # Mock is not configured yet so the attributes are set
252 # to a function and then the corresponding mock helper function
253 # is called when the helper is accessed similar to _setup_func.
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300254 def wrapper(attr, /, *args, **kwargs):
Xtreakff6b2e62019-05-27 18:26:23 +0530255 return getattr(mock.mock, attr)(*args, **kwargs)
256
257 for attribute in ('assert_awaited',
258 'assert_awaited_once',
259 'assert_awaited_with',
260 'assert_awaited_once_with',
261 'assert_any_await',
262 'assert_has_awaits',
263 'assert_not_awaited'):
264
265 # setattr(mock, attribute, wrapper) causes late binding
266 # hence attribute will always be the last value in the loop
267 # Use partial(wrapper, attribute) to ensure the attribute is bound
268 # correctly.
269 setattr(mock, attribute, partial(wrapper, attribute))
270
271
Michael Foord345266a2012-03-14 12:24:34 -0700272def _is_magic(name):
273 return '__%s__' % name[2:-2] == name
274
275
276class _SentinelObject(object):
277 "A unique, named, sentinel object."
278 def __init__(self, name):
279 self.name = name
280
281 def __repr__(self):
282 return 'sentinel.%s' % self.name
283
Serhiy Storchakad9c956f2017-01-11 20:13:03 +0200284 def __reduce__(self):
285 return 'sentinel.%s' % self.name
286
Michael Foord345266a2012-03-14 12:24:34 -0700287
288class _Sentinel(object):
289 """Access attributes to return a named object, usable as a sentinel."""
290 def __init__(self):
291 self._sentinels = {}
292
293 def __getattr__(self, name):
294 if name == '__bases__':
295 # Without this help(unittest.mock) raises an exception
296 raise AttributeError
297 return self._sentinels.setdefault(name, _SentinelObject(name))
298
Serhiy Storchakad9c956f2017-01-11 20:13:03 +0200299 def __reduce__(self):
300 return 'sentinel'
301
Michael Foord345266a2012-03-14 12:24:34 -0700302
303sentinel = _Sentinel()
304
305DEFAULT = sentinel.DEFAULT
306_missing = sentinel.MISSING
307_deleted = sentinel.DELETED
308
309
Serhiy Storchakac02d1882014-12-11 10:28:14 +0200310_allowed_names = {
311 'return_value', '_mock_return_value', 'side_effect',
312 '_mock_side_effect', '_mock_parent', '_mock_new_parent',
313 '_mock_name', '_mock_new_name'
314}
Michael Foord345266a2012-03-14 12:24:34 -0700315
316
317def _delegating_property(name):
318 _allowed_names.add(name)
319 _the_name = '_mock_' + name
320 def _get(self, name=name, _the_name=_the_name):
321 sig = self._mock_delegate
322 if sig is None:
323 return getattr(self, _the_name)
324 return getattr(sig, name)
325 def _set(self, value, name=name, _the_name=_the_name):
326 sig = self._mock_delegate
327 if sig is None:
328 self.__dict__[_the_name] = value
329 else:
330 setattr(sig, name, value)
331
332 return property(_get, _set)
333
334
335
336class _CallList(list):
337
338 def __contains__(self, value):
339 if not isinstance(value, list):
340 return list.__contains__(self, value)
341 len_value = len(value)
342 len_self = len(self)
343 if len_value > len_self:
344 return False
345
346 for i in range(0, len_self - len_value + 1):
347 sub_list = self[i:i+len_value]
348 if sub_list == value:
349 return True
350 return False
351
352 def __repr__(self):
353 return pprint.pformat(list(self))
354
355
356def _check_and_set_parent(parent, value, name, new_name):
Xtreak7397cda2019-07-22 13:08:22 +0530357 value = _extract_mock(value)
Xtreak9c3f2842019-02-26 03:16:34 +0530358
Michael Foord345266a2012-03-14 12:24:34 -0700359 if not _is_instance_mock(value):
360 return False
361 if ((value._mock_name or value._mock_new_name) or
362 (value._mock_parent is not None) or
363 (value._mock_new_parent is not None)):
364 return False
365
366 _parent = parent
367 while _parent is not None:
368 # setting a mock (value) as a child or return value of itself
369 # should not modify the mock
370 if _parent is value:
371 return False
372 _parent = _parent._mock_new_parent
373
374 if new_name:
375 value._mock_new_parent = parent
376 value._mock_new_name = new_name
377 if name:
378 value._mock_parent = parent
379 value._mock_name = name
380 return True
381
Michael Foord01bafdc2014-04-14 16:09:42 -0400382# Internal class to identify if we wrapped an iterator object or not.
383class _MockIter(object):
384 def __init__(self, obj):
385 self.obj = iter(obj)
Michael Foord01bafdc2014-04-14 16:09:42 -0400386 def __next__(self):
387 return next(self.obj)
Michael Foord345266a2012-03-14 12:24:34 -0700388
389class Base(object):
390 _mock_return_value = DEFAULT
391 _mock_side_effect = None
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300392 def __init__(self, /, *args, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -0700393 pass
394
395
396
397class NonCallableMock(Base):
398 """A non-callable version of `Mock`"""
399
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300400 def __new__(cls, /, *args, **kw):
Michael Foord345266a2012-03-14 12:24:34 -0700401 # every instance has its own class
402 # so we can create magic methods on the
403 # class without stomping on other mocks
Lisa Roach77b3b772019-05-20 09:19:53 -0700404 bases = (cls,)
Michael Foord14fd9252019-09-13 18:40:56 +0200405 if not issubclass(cls, AsyncMockMixin):
Lisa Roach77b3b772019-05-20 09:19:53 -0700406 # Check if spec is an async object or function
Michael Foord14fd9252019-09-13 18:40:56 +0200407 bound_args = _MOCK_SIG.bind_partial(cls, *args, **kw).arguments
408 spec_arg = bound_args.get('spec_set', bound_args.get('spec'))
409 if spec_arg and _is_async_obj(spec_arg):
410 bases = (AsyncMockMixin, cls)
Lisa Roach77b3b772019-05-20 09:19:53 -0700411 new = type(cls.__name__, bases, {'__doc__': cls.__doc__})
Lisa Roach9a7d9512019-09-28 18:42:44 -0700412 instance = _safe_super(NonCallableMock, cls).__new__(new)
Michael Foord345266a2012-03-14 12:24:34 -0700413 return instance
414
415
416 def __init__(
417 self, spec=None, wraps=None, name=None, spec_set=None,
418 parent=None, _spec_state=None, _new_name='', _new_parent=None,
Kushal Das8c145342014-04-16 23:32:21 +0530419 _spec_as_instance=False, _eat_self=None, unsafe=False, **kwargs
Michael Foord345266a2012-03-14 12:24:34 -0700420 ):
421 if _new_parent is None:
422 _new_parent = parent
423
424 __dict__ = self.__dict__
425 __dict__['_mock_parent'] = parent
426 __dict__['_mock_name'] = name
427 __dict__['_mock_new_name'] = _new_name
428 __dict__['_mock_new_parent'] = _new_parent
Mario Corchero552be9d2017-10-17 12:35:11 +0100429 __dict__['_mock_sealed'] = False
Michael Foord345266a2012-03-14 12:24:34 -0700430
431 if spec_set is not None:
432 spec = spec_set
433 spec_set = True
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100434 if _eat_self is None:
435 _eat_self = parent is not None
Michael Foord345266a2012-03-14 12:24:34 -0700436
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100437 self._mock_add_spec(spec, spec_set, _spec_as_instance, _eat_self)
Michael Foord345266a2012-03-14 12:24:34 -0700438
439 __dict__['_mock_children'] = {}
440 __dict__['_mock_wraps'] = wraps
441 __dict__['_mock_delegate'] = None
442
443 __dict__['_mock_called'] = False
444 __dict__['_mock_call_args'] = None
445 __dict__['_mock_call_count'] = 0
446 __dict__['_mock_call_args_list'] = _CallList()
447 __dict__['_mock_mock_calls'] = _CallList()
448
449 __dict__['method_calls'] = _CallList()
Kushal Das8c145342014-04-16 23:32:21 +0530450 __dict__['_mock_unsafe'] = unsafe
Michael Foord345266a2012-03-14 12:24:34 -0700451
452 if kwargs:
453 self.configure_mock(**kwargs)
454
Nick Coghlan0b43bcf2012-05-27 18:17:07 +1000455 _safe_super(NonCallableMock, self).__init__(
Michael Foord345266a2012-03-14 12:24:34 -0700456 spec, wraps, name, spec_set, parent,
457 _spec_state
458 )
459
460
461 def attach_mock(self, mock, attribute):
462 """
463 Attach a mock as an attribute of this one, replacing its name and
464 parent. Calls to the attached mock will be recorded in the
465 `method_calls` and `mock_calls` attributes of this one."""
Xtreak7397cda2019-07-22 13:08:22 +0530466 inner_mock = _extract_mock(mock)
467
468 inner_mock._mock_parent = None
469 inner_mock._mock_new_parent = None
470 inner_mock._mock_name = ''
471 inner_mock._mock_new_name = None
Michael Foord345266a2012-03-14 12:24:34 -0700472
473 setattr(self, attribute, mock)
474
475
476 def mock_add_spec(self, spec, spec_set=False):
477 """Add a spec to a mock. `spec` can either be an object or a
478 list of strings. Only attributes on the `spec` can be fetched as
479 attributes from the mock.
480
481 If `spec_set` is True then only attributes on the spec can be set."""
482 self._mock_add_spec(spec, spec_set)
483
484
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100485 def _mock_add_spec(self, spec, spec_set, _spec_as_instance=False,
486 _eat_self=False):
Michael Foord345266a2012-03-14 12:24:34 -0700487 _spec_class = None
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100488 _spec_signature = None
Lisa Roach77b3b772019-05-20 09:19:53 -0700489 _spec_asyncs = []
490
491 for attr in dir(spec):
Chris Withersc7dd3c72020-01-27 14:11:19 +0000492 if iscoroutinefunction(getattr(spec, attr, None)):
Lisa Roach77b3b772019-05-20 09:19:53 -0700493 _spec_asyncs.append(attr)
Michael Foord345266a2012-03-14 12:24:34 -0700494
495 if spec is not None and not _is_list(spec):
496 if isinstance(spec, type):
497 _spec_class = spec
498 else:
Chris Withersadbf1782019-05-01 23:04:04 +0100499 _spec_class = type(spec)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100500 res = _get_signature_object(spec,
501 _spec_as_instance, _eat_self)
502 _spec_signature = res and res[1]
Michael Foord345266a2012-03-14 12:24:34 -0700503
504 spec = dir(spec)
505
506 __dict__ = self.__dict__
507 __dict__['_spec_class'] = _spec_class
508 __dict__['_spec_set'] = spec_set
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100509 __dict__['_spec_signature'] = _spec_signature
Michael Foord345266a2012-03-14 12:24:34 -0700510 __dict__['_mock_methods'] = spec
Lisa Roach77b3b772019-05-20 09:19:53 -0700511 __dict__['_spec_asyncs'] = _spec_asyncs
Michael Foord345266a2012-03-14 12:24:34 -0700512
513 def __get_return_value(self):
514 ret = self._mock_return_value
515 if self._mock_delegate is not None:
516 ret = self._mock_delegate.return_value
517
518 if ret is DEFAULT:
519 ret = self._get_child_mock(
520 _new_parent=self, _new_name='()'
521 )
522 self.return_value = ret
523 return ret
524
525
526 def __set_return_value(self, value):
527 if self._mock_delegate is not None:
528 self._mock_delegate.return_value = value
529 else:
530 self._mock_return_value = value
531 _check_and_set_parent(self, value, None, '()')
532
533 __return_value_doc = "The value to be returned when the mock is called."
534 return_value = property(__get_return_value, __set_return_value,
535 __return_value_doc)
536
537
538 @property
539 def __class__(self):
540 if self._spec_class is None:
541 return type(self)
542 return self._spec_class
543
544 called = _delegating_property('called')
545 call_count = _delegating_property('call_count')
546 call_args = _delegating_property('call_args')
547 call_args_list = _delegating_property('call_args_list')
548 mock_calls = _delegating_property('mock_calls')
549
550
551 def __get_side_effect(self):
552 delegated = self._mock_delegate
553 if delegated is None:
554 return self._mock_side_effect
Michael Foord01bafdc2014-04-14 16:09:42 -0400555 sf = delegated.side_effect
Robert Collinsf58f88c2015-07-14 13:51:40 +1200556 if (sf is not None and not callable(sf)
557 and not isinstance(sf, _MockIter) and not _is_exception(sf)):
Michael Foord01bafdc2014-04-14 16:09:42 -0400558 sf = _MockIter(sf)
559 delegated.side_effect = sf
560 return sf
Michael Foord345266a2012-03-14 12:24:34 -0700561
562 def __set_side_effect(self, value):
563 value = _try_iter(value)
564 delegated = self._mock_delegate
565 if delegated is None:
566 self._mock_side_effect = value
567 else:
568 delegated.side_effect = value
569
570 side_effect = property(__get_side_effect, __set_side_effect)
571
572
Kushal Das9cd39a12016-06-02 10:20:16 -0700573 def reset_mock(self, visited=None,*, return_value=False, side_effect=False):
Michael Foord345266a2012-03-14 12:24:34 -0700574 "Restore the mock object to its initial state."
Robert Collinsb37f43f2015-07-15 11:42:28 +1200575 if visited is None:
576 visited = []
577 if id(self) in visited:
578 return
579 visited.append(id(self))
580
Michael Foord345266a2012-03-14 12:24:34 -0700581 self.called = False
582 self.call_args = None
583 self.call_count = 0
584 self.mock_calls = _CallList()
585 self.call_args_list = _CallList()
586 self.method_calls = _CallList()
587
Kushal Das9cd39a12016-06-02 10:20:16 -0700588 if return_value:
589 self._mock_return_value = DEFAULT
590 if side_effect:
591 self._mock_side_effect = None
592
Michael Foord345266a2012-03-14 12:24:34 -0700593 for child in self._mock_children.values():
Xtreakedeca922018-12-01 15:33:54 +0530594 if isinstance(child, _SpecState) or child is _deleted:
Michael Foord75963642012-06-09 17:31:59 +0100595 continue
Vegard Stikbakkeaef7dc82020-01-25 16:44:46 +0100596 child.reset_mock(visited, return_value=return_value, side_effect=side_effect)
Michael Foord345266a2012-03-14 12:24:34 -0700597
598 ret = self._mock_return_value
599 if _is_instance_mock(ret) and ret is not self:
Robert Collinsb37f43f2015-07-15 11:42:28 +1200600 ret.reset_mock(visited)
Michael Foord345266a2012-03-14 12:24:34 -0700601
602
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300603 def configure_mock(self, /, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -0700604 """Set attributes on the mock through keyword arguments.
605
606 Attributes plus return values and side effects can be set on child
607 mocks using standard dot notation and unpacking a dictionary in the
608 method call:
609
610 >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
611 >>> mock.configure_mock(**attrs)"""
612 for arg, val in sorted(kwargs.items(),
613 # we sort on the number of dots so that
614 # attributes are set before we set attributes on
615 # attributes
616 key=lambda entry: entry[0].count('.')):
617 args = arg.split('.')
618 final = args.pop()
619 obj = self
620 for entry in args:
621 obj = getattr(obj, entry)
622 setattr(obj, final, val)
623
624
625 def __getattr__(self, name):
Kushal Das8c145342014-04-16 23:32:21 +0530626 if name in {'_mock_methods', '_mock_unsafe'}:
Michael Foord345266a2012-03-14 12:24:34 -0700627 raise AttributeError(name)
628 elif self._mock_methods is not None:
629 if name not in self._mock_methods or name in _all_magics:
630 raise AttributeError("Mock object has no attribute %r" % name)
631 elif _is_magic(name):
632 raise AttributeError(name)
Kushal Das8c145342014-04-16 23:32:21 +0530633 if not self._mock_unsafe:
634 if name.startswith(('assert', 'assret')):
Zackery Spytzb9b08cd2019-05-08 11:32:24 -0600635 raise AttributeError("Attributes cannot start with 'assert' "
636 "or 'assret'")
Michael Foord345266a2012-03-14 12:24:34 -0700637
638 result = self._mock_children.get(name)
639 if result is _deleted:
640 raise AttributeError(name)
641 elif result is None:
642 wraps = None
643 if self._mock_wraps is not None:
644 # XXXX should we get the attribute without triggering code
645 # execution?
646 wraps = getattr(self._mock_wraps, name)
647
648 result = self._get_child_mock(
649 parent=self, name=name, wraps=wraps, _new_name=name,
650 _new_parent=self
651 )
652 self._mock_children[name] = result
653
654 elif isinstance(result, _SpecState):
655 result = create_autospec(
656 result.spec, result.spec_set, result.instance,
657 result.parent, result.name
658 )
659 self._mock_children[name] = result
660
661 return result
662
663
Mario Corchero552be9d2017-10-17 12:35:11 +0100664 def _extract_mock_name(self):
Michael Foord345266a2012-03-14 12:24:34 -0700665 _name_list = [self._mock_new_name]
666 _parent = self._mock_new_parent
667 last = self
668
669 dot = '.'
670 if _name_list == ['()']:
671 dot = ''
Chris Withersadbf1782019-05-01 23:04:04 +0100672
Michael Foord345266a2012-03-14 12:24:34 -0700673 while _parent is not None:
674 last = _parent
675
676 _name_list.append(_parent._mock_new_name + dot)
677 dot = '.'
678 if _parent._mock_new_name == '()':
679 dot = ''
680
681 _parent = _parent._mock_new_parent
682
Michael Foord345266a2012-03-14 12:24:34 -0700683 _name_list = list(reversed(_name_list))
684 _first = last._mock_name or 'mock'
685 if len(_name_list) > 1:
686 if _name_list[1] not in ('()', '().'):
687 _first += '.'
688 _name_list[0] = _first
Mario Corchero552be9d2017-10-17 12:35:11 +0100689 return ''.join(_name_list)
690
691 def __repr__(self):
692 name = self._extract_mock_name()
Michael Foord345266a2012-03-14 12:24:34 -0700693
694 name_string = ''
695 if name not in ('mock', 'mock.'):
696 name_string = ' name=%r' % name
697
698 spec_string = ''
699 if self._spec_class is not None:
700 spec_string = ' spec=%r'
701 if self._spec_set:
702 spec_string = ' spec_set=%r'
703 spec_string = spec_string % self._spec_class.__name__
704 return "<%s%s%s id='%s'>" % (
705 type(self).__name__,
706 name_string,
707 spec_string,
708 id(self)
709 )
710
711
712 def __dir__(self):
Michael Foordd7c65e22012-03-14 14:56:54 -0700713 """Filter the output of `dir(mock)` to only useful members."""
Michael Foord313f85f2012-03-25 18:16:07 +0100714 if not FILTER_DIR:
715 return object.__dir__(self)
716
Michael Foord345266a2012-03-14 12:24:34 -0700717 extras = self._mock_methods or []
718 from_type = dir(type(self))
719 from_dict = list(self.__dict__)
Mario Corchero0df635c2019-04-30 19:56:36 +0100720 from_child_mocks = [
721 m_name for m_name, m_value in self._mock_children.items()
722 if m_value is not _deleted]
Michael Foord345266a2012-03-14 12:24:34 -0700723
Michael Foord313f85f2012-03-25 18:16:07 +0100724 from_type = [e for e in from_type if not e.startswith('_')]
725 from_dict = [e for e in from_dict if not e.startswith('_') or
726 _is_magic(e)]
Mario Corchero0df635c2019-04-30 19:56:36 +0100727 return sorted(set(extras + from_type + from_dict + from_child_mocks))
Michael Foord345266a2012-03-14 12:24:34 -0700728
729
730 def __setattr__(self, name, value):
731 if name in _allowed_names:
732 # property setters go through here
733 return object.__setattr__(self, name, value)
734 elif (self._spec_set and self._mock_methods is not None and
735 name not in self._mock_methods and
736 name not in self.__dict__):
737 raise AttributeError("Mock object has no attribute '%s'" % name)
738 elif name in _unsupported_magics:
739 msg = 'Attempting to set unsupported magic method %r.' % name
740 raise AttributeError(msg)
741 elif name in _all_magics:
742 if self._mock_methods is not None and name not in self._mock_methods:
743 raise AttributeError("Mock object has no attribute '%s'" % name)
744
745 if not _is_instance_mock(value):
746 setattr(type(self), name, _get_method(name, value))
747 original = value
748 value = lambda *args, **kw: original(self, *args, **kw)
749 else:
750 # only set _new_name and not name so that mock_calls is tracked
751 # but not method calls
752 _check_and_set_parent(self, value, None, name)
753 setattr(type(self), name, value)
Michael Foord75963642012-06-09 17:31:59 +0100754 self._mock_children[name] = value
Michael Foord345266a2012-03-14 12:24:34 -0700755 elif name == '__class__':
756 self._spec_class = value
757 return
758 else:
759 if _check_and_set_parent(self, value, name, name):
760 self._mock_children[name] = value
Mario Corchero552be9d2017-10-17 12:35:11 +0100761
762 if self._mock_sealed and not hasattr(self, name):
763 mock_name = f'{self._extract_mock_name()}.{name}'
764 raise AttributeError(f'Cannot set {mock_name}')
765
Michael Foord345266a2012-03-14 12:24:34 -0700766 return object.__setattr__(self, name, value)
767
768
769 def __delattr__(self, name):
770 if name in _all_magics and name in type(self).__dict__:
771 delattr(type(self), name)
772 if name not in self.__dict__:
773 # for magic methods that are still MagicProxy objects and
774 # not set on the instance itself
775 return
776
Michael Foord345266a2012-03-14 12:24:34 -0700777 obj = self._mock_children.get(name, _missing)
Pablo Galindo222d3032019-01-21 08:57:46 +0000778 if name in self.__dict__:
Xtreak830b43d2019-04-14 00:42:33 +0530779 _safe_super(NonCallableMock, self).__delattr__(name)
Pablo Galindo222d3032019-01-21 08:57:46 +0000780 elif obj is _deleted:
Michael Foord345266a2012-03-14 12:24:34 -0700781 raise AttributeError(name)
782 if obj is not _missing:
783 del self._mock_children[name]
784 self._mock_children[name] = _deleted
785
786
Michael Foord345266a2012-03-14 12:24:34 -0700787 def _format_mock_call_signature(self, args, kwargs):
788 name = self._mock_name or 'mock'
789 return _format_call_signature(name, args, kwargs)
790
791
Xtreak0ae022c2019-05-29 12:32:26 +0530792 def _format_mock_failure_message(self, args, kwargs, action='call'):
793 message = 'expected %s not found.\nExpected: %s\nActual: %s'
Michael Foord345266a2012-03-14 12:24:34 -0700794 expected_string = self._format_mock_call_signature(args, kwargs)
795 call_args = self.call_args
Michael Foord345266a2012-03-14 12:24:34 -0700796 actual_string = self._format_mock_call_signature(*call_args)
Xtreak0ae022c2019-05-29 12:32:26 +0530797 return message % (action, expected_string, actual_string)
Michael Foord345266a2012-03-14 12:24:34 -0700798
799
Xtreakc9612782019-08-29 11:39:01 +0530800 def _get_call_signature_from_name(self, name):
801 """
802 * If call objects are asserted against a method/function like obj.meth1
803 then there could be no name for the call object to lookup. Hence just
804 return the spec_signature of the method/function being asserted against.
805 * If the name is not empty then remove () and split by '.' to get
806 list of names to iterate through the children until a potential
807 match is found. A child mock is created only during attribute access
808 so if we get a _SpecState then no attributes of the spec were accessed
809 and can be safely exited.
810 """
811 if not name:
812 return self._spec_signature
813
814 sig = None
815 names = name.replace('()', '').split('.')
816 children = self._mock_children
817
818 for name in names:
819 child = children.get(name)
820 if child is None or isinstance(child, _SpecState):
821 break
822 else:
Karthikeyan Singaravelan66b00a92020-01-24 18:44:29 +0530823 # If an autospecced object is attached using attach_mock the
824 # child would be a function with mock object as attribute from
825 # which signature has to be derived.
826 child = _extract_mock(child)
Xtreakc9612782019-08-29 11:39:01 +0530827 children = child._mock_children
828 sig = child._spec_signature
829
830 return sig
831
832
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100833 def _call_matcher(self, _call):
834 """
Martin Panter204bf0b2016-07-11 07:51:37 +0000835 Given a call (or simply an (args, kwargs) tuple), return a
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100836 comparison key suitable for matching with other calls.
837 This is a best effort method which relies on the spec's signature,
838 if available, or falls back on the arguments themselves.
839 """
Xtreakc9612782019-08-29 11:39:01 +0530840
841 if isinstance(_call, tuple) and len(_call) > 2:
842 sig = self._get_call_signature_from_name(_call[0])
843 else:
844 sig = self._spec_signature
845
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100846 if sig is not None:
847 if len(_call) == 2:
848 name = ''
849 args, kwargs = _call
850 else:
851 name, args, kwargs = _call
852 try:
Elizabeth Useltond6a9d172019-09-13 08:54:32 -0700853 bound_call = sig.bind(*args, **kwargs)
854 return call(name, bound_call.args, bound_call.kwargs)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100855 except TypeError as e:
856 return e.with_traceback(None)
857 else:
858 return _call
859
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300860 def assert_not_called(self):
Kushal Das8af9db32014-04-17 01:36:14 +0530861 """assert that the mock was never called.
862 """
Kushal Das8af9db32014-04-17 01:36:14 +0530863 if self.call_count != 0:
Petter Strandmark47d94242018-10-28 21:37:10 +0100864 msg = ("Expected '%s' to not have been called. Called %s times.%s"
865 % (self._mock_name or 'mock',
866 self.call_count,
867 self._calls_repr()))
Kushal Das8af9db32014-04-17 01:36:14 +0530868 raise AssertionError(msg)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100869
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300870 def assert_called(self):
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100871 """assert that the mock was called at least once
872 """
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100873 if self.call_count == 0:
874 msg = ("Expected '%s' to have been called." %
Abraham Toriz Cruz5f5f11f2019-09-17 06:16:08 -0500875 (self._mock_name or 'mock'))
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100876 raise AssertionError(msg)
877
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300878 def assert_called_once(self):
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100879 """assert that the mock was called only once.
880 """
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100881 if not self.call_count == 1:
Petter Strandmark47d94242018-10-28 21:37:10 +0100882 msg = ("Expected '%s' to have been called once. Called %s times.%s"
883 % (self._mock_name or 'mock',
884 self.call_count,
885 self._calls_repr()))
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100886 raise AssertionError(msg)
887
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300888 def assert_called_with(self, /, *args, **kwargs):
Rémi Lapeyref5896a02019-08-29 08:15:53 +0200889 """assert that the last call was made with the specified arguments.
Michael Foord345266a2012-03-14 12:24:34 -0700890
891 Raises an AssertionError if the args and keyword args passed in are
892 different to the last call to the mock."""
Michael Foord345266a2012-03-14 12:24:34 -0700893 if self.call_args is None:
894 expected = self._format_mock_call_signature(args, kwargs)
Susan Su2bdd5852019-02-13 18:22:29 -0800895 actual = 'not called.'
896 error_message = ('expected call not found.\nExpected: %s\nActual: %s'
897 % (expected, actual))
898 raise AssertionError(error_message)
Michael Foord345266a2012-03-14 12:24:34 -0700899
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100900 def _error_message():
Michael Foord345266a2012-03-14 12:24:34 -0700901 msg = self._format_mock_failure_message(args, kwargs)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100902 return msg
Elizabeth Useltond6a9d172019-09-13 08:54:32 -0700903 expected = self._call_matcher(_Call((args, kwargs), two=True))
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100904 actual = self._call_matcher(self.call_args)
Elizabeth Useltond6a9d172019-09-13 08:54:32 -0700905 if actual != expected:
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100906 cause = expected if isinstance(expected, Exception) else None
907 raise AssertionError(_error_message()) from cause
Michael Foord345266a2012-03-14 12:24:34 -0700908
909
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300910 def assert_called_once_with(self, /, *args, **kwargs):
Arne de Laat324c5d82017-02-23 15:57:25 +0100911 """assert that the mock was called exactly once and that that call was
912 with the specified arguments."""
Michael Foord345266a2012-03-14 12:24:34 -0700913 if not self.call_count == 1:
Petter Strandmark47d94242018-10-28 21:37:10 +0100914 msg = ("Expected '%s' to be called once. Called %s times.%s"
915 % (self._mock_name or 'mock',
916 self.call_count,
917 self._calls_repr()))
Michael Foord345266a2012-03-14 12:24:34 -0700918 raise AssertionError(msg)
919 return self.assert_called_with(*args, **kwargs)
920
921
922 def assert_has_calls(self, calls, any_order=False):
923 """assert the mock has been called with the specified calls.
924 The `mock_calls` list is checked for the calls.
925
926 If `any_order` is False (the default) then the calls must be
927 sequential. There can be extra calls before or after the
928 specified calls.
929
930 If `any_order` is True then the calls can be in any order, but
931 they must all appear in `mock_calls`."""
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100932 expected = [self._call_matcher(c) for c in calls]
Samuel Freilichb5a7a4f2019-09-24 15:08:31 -0400933 cause = next((e for e in expected if isinstance(e, Exception)), None)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100934 all_calls = _CallList(self._call_matcher(c) for c in self.mock_calls)
Michael Foord345266a2012-03-14 12:24:34 -0700935 if not any_order:
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100936 if expected not in all_calls:
Samuel Freilichb5a7a4f2019-09-24 15:08:31 -0400937 if cause is None:
938 problem = 'Calls not found.'
939 else:
940 problem = ('Error processing expected calls.\n'
941 'Errors: {}').format(
942 [e if isinstance(e, Exception) else None
943 for e in expected])
Michael Foord345266a2012-03-14 12:24:34 -0700944 raise AssertionError(
Samuel Freilichb5a7a4f2019-09-24 15:08:31 -0400945 f'{problem}\n'
Samuel Freilich2180f6b2019-09-24 18:04:29 -0400946 f'Expected: {_CallList(calls)}'
947 f'{self._calls_repr(prefix="Actual").rstrip(".")}'
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100948 ) from cause
Michael Foord345266a2012-03-14 12:24:34 -0700949 return
950
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100951 all_calls = list(all_calls)
Michael Foord345266a2012-03-14 12:24:34 -0700952
953 not_found = []
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100954 for kall in expected:
Michael Foord345266a2012-03-14 12:24:34 -0700955 try:
956 all_calls.remove(kall)
957 except ValueError:
958 not_found.append(kall)
959 if not_found:
960 raise AssertionError(
davidair2b32da22018-08-17 15:09:58 -0400961 '%r does not contain all of %r in its call list, '
962 'found %r instead' % (self._mock_name or 'mock',
963 tuple(not_found), all_calls)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100964 ) from cause
Michael Foord345266a2012-03-14 12:24:34 -0700965
966
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300967 def assert_any_call(self, /, *args, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -0700968 """assert the mock has been called with the specified arguments.
969
970 The assert passes if the mock has *ever* been called, unlike
971 `assert_called_with` and `assert_called_once_with` that only pass if
972 the call is the most recent one."""
Elizabeth Useltond6a9d172019-09-13 08:54:32 -0700973 expected = self._call_matcher(_Call((args, kwargs), two=True))
974 cause = expected if isinstance(expected, Exception) else None
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100975 actual = [self._call_matcher(c) for c in self.call_args_list]
Elizabeth Useltond6a9d172019-09-13 08:54:32 -0700976 if cause or expected not in _AnyComparer(actual):
Michael Foord345266a2012-03-14 12:24:34 -0700977 expected_string = self._format_mock_call_signature(args, kwargs)
978 raise AssertionError(
979 '%s call not found' % expected_string
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100980 ) from cause
Michael Foord345266a2012-03-14 12:24:34 -0700981
982
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300983 def _get_child_mock(self, /, **kw):
Michael Foord345266a2012-03-14 12:24:34 -0700984 """Create the child mocks for attributes and return value.
985 By default child mocks will be the same type as the parent.
986 Subclasses of Mock may want to override this to customize the way
987 child mocks are made.
988
989 For non-callable mocks the callable variant will be used (rather than
990 any custom subclass)."""
Lisa Roach77b3b772019-05-20 09:19:53 -0700991 _new_name = kw.get("_new_name")
992 if _new_name in self.__dict__['_spec_asyncs']:
993 return AsyncMock(**kw)
994
Michael Foord345266a2012-03-14 12:24:34 -0700995 _type = type(self)
Lisa Roach77b3b772019-05-20 09:19:53 -0700996 if issubclass(_type, MagicMock) and _new_name in _async_method_magics:
Lisa Roach9a7d9512019-09-28 18:42:44 -0700997 # Any asynchronous magic becomes an AsyncMock
Lisa Roach77b3b772019-05-20 09:19:53 -0700998 klass = AsyncMock
Lisa Roach8b03f942019-09-19 21:04:18 -0700999 elif issubclass(_type, AsyncMockMixin):
Lisa Roach3667e1e2019-09-29 21:56:47 -07001000 if (_new_name in _all_sync_magics or
1001 self._mock_methods and _new_name in self._mock_methods):
1002 # Any synchronous method on AsyncMock becomes a MagicMock
Lisa Roach9a7d9512019-09-28 18:42:44 -07001003 klass = MagicMock
1004 else:
1005 klass = AsyncMock
Lisa Roach8b03f942019-09-19 21:04:18 -07001006 elif not issubclass(_type, CallableMixin):
Michael Foord345266a2012-03-14 12:24:34 -07001007 if issubclass(_type, NonCallableMagicMock):
1008 klass = MagicMock
Lisa Roach9a7d9512019-09-28 18:42:44 -07001009 elif issubclass(_type, NonCallableMock):
Michael Foord345266a2012-03-14 12:24:34 -07001010 klass = Mock
1011 else:
1012 klass = _type.__mro__[1]
Mario Corchero552be9d2017-10-17 12:35:11 +01001013
1014 if self._mock_sealed:
1015 attribute = "." + kw["name"] if "name" in kw else "()"
1016 mock_name = self._extract_mock_name() + attribute
1017 raise AttributeError(mock_name)
1018
Michael Foord345266a2012-03-14 12:24:34 -07001019 return klass(**kw)
1020
1021
Petter Strandmark47d94242018-10-28 21:37:10 +01001022 def _calls_repr(self, prefix="Calls"):
1023 """Renders self.mock_calls as a string.
1024
1025 Example: "\nCalls: [call(1), call(2)]."
1026
1027 If self.mock_calls is empty, an empty string is returned. The
1028 output will be truncated if very long.
1029 """
1030 if not self.mock_calls:
1031 return ""
1032 return f"\n{prefix}: {safe_repr(self.mock_calls)}."
1033
1034
Michael Foord14fd9252019-09-13 18:40:56 +02001035_MOCK_SIG = inspect.signature(NonCallableMock.__init__)
1036
1037
Elizabeth Useltond6a9d172019-09-13 08:54:32 -07001038class _AnyComparer(list):
1039 """A list which checks if it contains a call which may have an
1040 argument of ANY, flipping the components of item and self from
1041 their traditional locations so that ANY is guaranteed to be on
1042 the left."""
1043 def __contains__(self, item):
1044 for _call in self:
Chris Withersdb5e86a2020-01-29 16:24:54 +00001045 assert len(item) == len(_call)
Elizabeth Useltond6a9d172019-09-13 08:54:32 -07001046 if all([
1047 expected == actual
1048 for expected, actual in zip(item, _call)
1049 ]):
1050 return True
1051 return False
1052
Michael Foord345266a2012-03-14 12:24:34 -07001053
1054def _try_iter(obj):
1055 if obj is None:
1056 return obj
1057 if _is_exception(obj):
1058 return obj
1059 if _callable(obj):
1060 return obj
1061 try:
1062 return iter(obj)
1063 except TypeError:
1064 # XXXX backwards compatibility
1065 # but this will blow up on first call - so maybe we should fail early?
1066 return obj
1067
1068
Michael Foord345266a2012-03-14 12:24:34 -07001069class CallableMixin(Base):
1070
1071 def __init__(self, spec=None, side_effect=None, return_value=DEFAULT,
1072 wraps=None, name=None, spec_set=None, parent=None,
1073 _spec_state=None, _new_name='', _new_parent=None, **kwargs):
1074 self.__dict__['_mock_return_value'] = return_value
Nick Coghlan0b43bcf2012-05-27 18:17:07 +10001075 _safe_super(CallableMixin, self).__init__(
Michael Foord345266a2012-03-14 12:24:34 -07001076 spec, wraps, name, spec_set, parent,
1077 _spec_state, _new_name, _new_parent, **kwargs
1078 )
1079
1080 self.side_effect = side_effect
1081
1082
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001083 def _mock_check_sig(self, /, *args, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001084 # stub method that can be replaced with one with a specific signature
1085 pass
1086
1087
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001088 def __call__(self, /, *args, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001089 # can't use self in-case a function / method we are mocking uses self
1090 # in the signature
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001091 self._mock_check_sig(*args, **kwargs)
Lisa Roachef048512019-09-23 20:49:40 -07001092 self._increment_mock_call(*args, **kwargs)
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001093 return self._mock_call(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -07001094
1095
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001096 def _mock_call(self, /, *args, **kwargs):
Lisa Roachef048512019-09-23 20:49:40 -07001097 return self._execute_mock_call(*args, **kwargs)
1098
1099 def _increment_mock_call(self, /, *args, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001100 self.called = True
1101 self.call_count += 1
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001102
Chris Withers8ca0fa92018-12-03 21:31:37 +00001103 # handle call_args
Lisa Roachef048512019-09-23 20:49:40 -07001104 # needs to be set here so assertions on call arguments pass before
1105 # execution in the case of awaited calls
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001106 _call = _Call((args, kwargs), two=True)
1107 self.call_args = _call
1108 self.call_args_list.append(_call)
Michael Foord345266a2012-03-14 12:24:34 -07001109
Chris Withers8ca0fa92018-12-03 21:31:37 +00001110 # initial stuff for method_calls:
Michael Foord345266a2012-03-14 12:24:34 -07001111 do_method_calls = self._mock_parent is not None
Chris Withers8ca0fa92018-12-03 21:31:37 +00001112 method_call_name = self._mock_name
1113
1114 # initial stuff for mock_calls:
1115 mock_call_name = self._mock_new_name
1116 is_a_call = mock_call_name == '()'
1117 self.mock_calls.append(_Call(('', args, kwargs)))
1118
1119 # follow up the chain of mocks:
1120 _new_parent = self._mock_new_parent
Michael Foord345266a2012-03-14 12:24:34 -07001121 while _new_parent is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001122
Chris Withers8ca0fa92018-12-03 21:31:37 +00001123 # handle method_calls:
Michael Foord345266a2012-03-14 12:24:34 -07001124 if do_method_calls:
Chris Withers8ca0fa92018-12-03 21:31:37 +00001125 _new_parent.method_calls.append(_Call((method_call_name, args, kwargs)))
Michael Foord345266a2012-03-14 12:24:34 -07001126 do_method_calls = _new_parent._mock_parent is not None
1127 if do_method_calls:
Chris Withers8ca0fa92018-12-03 21:31:37 +00001128 method_call_name = _new_parent._mock_name + '.' + method_call_name
Michael Foord345266a2012-03-14 12:24:34 -07001129
Chris Withers8ca0fa92018-12-03 21:31:37 +00001130 # handle mock_calls:
1131 this_mock_call = _Call((mock_call_name, args, kwargs))
Michael Foord345266a2012-03-14 12:24:34 -07001132 _new_parent.mock_calls.append(this_mock_call)
Chris Withers8ca0fa92018-12-03 21:31:37 +00001133
1134 if _new_parent._mock_new_name:
1135 if is_a_call:
1136 dot = ''
1137 else:
1138 dot = '.'
1139 is_a_call = _new_parent._mock_new_name == '()'
1140 mock_call_name = _new_parent._mock_new_name + dot + mock_call_name
1141
1142 # follow the parental chain:
Michael Foord345266a2012-03-14 12:24:34 -07001143 _new_parent = _new_parent._mock_new_parent
1144
Lisa Roachef048512019-09-23 20:49:40 -07001145 def _execute_mock_call(self, /, *args, **kwargs):
Jason Fried046442d2019-11-20 16:27:51 -08001146 # separate from _increment_mock_call so that awaited functions are
1147 # executed separately from their call, also AsyncMock overrides this method
Lisa Roachef048512019-09-23 20:49:40 -07001148
Michael Foord345266a2012-03-14 12:24:34 -07001149 effect = self.side_effect
1150 if effect is not None:
1151 if _is_exception(effect):
1152 raise effect
Mario Corcherof05df0a2018-12-08 11:25:02 +00001153 elif not _callable(effect):
Michael Foord2cd48732012-04-21 15:52:11 +01001154 result = next(effect)
1155 if _is_exception(result):
1156 raise result
Mario Corcherof05df0a2018-12-08 11:25:02 +00001157 else:
1158 result = effect(*args, **kwargs)
1159
1160 if result is not DEFAULT:
Michael Foord2cd48732012-04-21 15:52:11 +01001161 return result
Michael Foord345266a2012-03-14 12:24:34 -07001162
Mario Corcherof05df0a2018-12-08 11:25:02 +00001163 if self._mock_return_value is not DEFAULT:
1164 return self.return_value
Michael Foord345266a2012-03-14 12:24:34 -07001165
Mario Corcherof05df0a2018-12-08 11:25:02 +00001166 if self._mock_wraps is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001167 return self._mock_wraps(*args, **kwargs)
Mario Corcherof05df0a2018-12-08 11:25:02 +00001168
1169 return self.return_value
Michael Foord345266a2012-03-14 12:24:34 -07001170
1171
1172
1173class Mock(CallableMixin, NonCallableMock):
1174 """
1175 Create a new `Mock` object. `Mock` takes several optional arguments
1176 that specify the behaviour of the Mock object:
1177
1178 * `spec`: This can be either a list of strings or an existing object (a
1179 class or instance) that acts as the specification for the mock object. If
1180 you pass in an object then a list of strings is formed by calling dir on
1181 the object (excluding unsupported magic attributes and methods). Accessing
1182 any attribute not in this list will raise an `AttributeError`.
1183
1184 If `spec` is an object (rather than a list of strings) then
1185 `mock.__class__` returns the class of the spec object. This allows mocks
1186 to pass `isinstance` tests.
1187
1188 * `spec_set`: A stricter variant of `spec`. If used, attempting to *set*
1189 or get an attribute on the mock that isn't on the object passed as
1190 `spec_set` will raise an `AttributeError`.
1191
1192 * `side_effect`: A function to be called whenever the Mock is called. See
1193 the `side_effect` attribute. Useful for raising exceptions or
1194 dynamically changing return values. The function is called with the same
1195 arguments as the mock, and unless it returns `DEFAULT`, the return
1196 value of this function is used as the return value.
1197
Michael Foord2cd48732012-04-21 15:52:11 +01001198 If `side_effect` is an iterable then each call to the mock will return
1199 the next value from the iterable. If any of the members of the iterable
1200 are exceptions they will be raised instead of returned.
Michael Foord345266a2012-03-14 12:24:34 -07001201
Michael Foord345266a2012-03-14 12:24:34 -07001202 * `return_value`: The value returned when the mock is called. By default
1203 this is a new Mock (created on first access). See the
1204 `return_value` attribute.
1205
Michael Foord0682a0c2012-04-13 20:51:20 +01001206 * `wraps`: Item for the mock object to wrap. If `wraps` is not None then
1207 calling the Mock will pass the call through to the wrapped object
1208 (returning the real result). Attribute access on the mock will return a
1209 Mock object that wraps the corresponding attribute of the wrapped object
1210 (so attempting to access an attribute that doesn't exist will raise an
1211 `AttributeError`).
Michael Foord345266a2012-03-14 12:24:34 -07001212
1213 If the mock has an explicit `return_value` set then calls are not passed
1214 to the wrapped object and the `return_value` is returned instead.
1215
1216 * `name`: If the mock has a name then it will be used in the repr of the
1217 mock. This can be useful for debugging. The name is propagated to child
1218 mocks.
1219
1220 Mocks can also be called with arbitrary keyword arguments. These will be
1221 used to set attributes on the mock after it is created.
1222 """
1223
1224
Michael Foord345266a2012-03-14 12:24:34 -07001225def _dot_lookup(thing, comp, import_path):
1226 try:
1227 return getattr(thing, comp)
1228 except AttributeError:
1229 __import__(import_path)
1230 return getattr(thing, comp)
1231
1232
1233def _importer(target):
1234 components = target.split('.')
1235 import_path = components.pop(0)
1236 thing = __import__(import_path)
1237
1238 for comp in components:
1239 import_path += ".%s" % comp
1240 thing = _dot_lookup(thing, comp, import_path)
1241 return thing
1242
1243
Michael Foord345266a2012-03-14 12:24:34 -07001244class _patch(object):
1245
1246 attribute_name = None
Michael Foordebc1a302014-04-15 17:21:08 -04001247 _active_patches = []
Michael Foord345266a2012-03-14 12:24:34 -07001248
1249 def __init__(
1250 self, getter, attribute, new, spec, create,
1251 spec_set, autospec, new_callable, kwargs
1252 ):
1253 if new_callable is not None:
1254 if new is not DEFAULT:
1255 raise ValueError(
1256 "Cannot use 'new' and 'new_callable' together"
1257 )
Michael Foord50a8c0e2012-03-25 18:57:58 +01001258 if autospec is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001259 raise ValueError(
1260 "Cannot use 'autospec' and 'new_callable' together"
1261 )
1262
1263 self.getter = getter
1264 self.attribute = attribute
1265 self.new = new
1266 self.new_callable = new_callable
1267 self.spec = spec
1268 self.create = create
1269 self.has_local = False
1270 self.spec_set = spec_set
1271 self.autospec = autospec
1272 self.kwargs = kwargs
1273 self.additional_patchers = []
1274
1275
1276 def copy(self):
1277 patcher = _patch(
1278 self.getter, self.attribute, self.new, self.spec,
1279 self.create, self.spec_set,
1280 self.autospec, self.new_callable, self.kwargs
1281 )
1282 patcher.attribute_name = self.attribute_name
1283 patcher.additional_patchers = [
1284 p.copy() for p in self.additional_patchers
1285 ]
1286 return patcher
1287
1288
1289 def __call__(self, func):
1290 if isinstance(func, type):
1291 return self.decorate_class(func)
Xtreak436c2b02019-05-28 12:37:39 +05301292 if inspect.iscoroutinefunction(func):
1293 return self.decorate_async_callable(func)
Michael Foord345266a2012-03-14 12:24:34 -07001294 return self.decorate_callable(func)
1295
1296
1297 def decorate_class(self, klass):
1298 for attr in dir(klass):
1299 if not attr.startswith(patch.TEST_PREFIX):
1300 continue
1301
1302 attr_value = getattr(klass, attr)
1303 if not hasattr(attr_value, "__call__"):
1304 continue
1305
1306 patcher = self.copy()
1307 setattr(klass, attr, patcher(attr_value))
1308 return klass
1309
1310
Xtreak436c2b02019-05-28 12:37:39 +05301311 @contextlib.contextmanager
1312 def decoration_helper(self, patched, args, keywargs):
1313 extra_args = []
Serhiy Storchaka4b222c92020-04-11 10:59:24 +03001314 with contextlib.ExitStack() as exit_stack:
Xtreak436c2b02019-05-28 12:37:39 +05301315 for patching in patched.patchings:
Serhiy Storchaka4b222c92020-04-11 10:59:24 +03001316 arg = exit_stack.enter_context(patching)
Xtreak436c2b02019-05-28 12:37:39 +05301317 if patching.attribute_name is not None:
1318 keywargs.update(arg)
1319 elif patching.new is DEFAULT:
1320 extra_args.append(arg)
1321
1322 args += tuple(extra_args)
1323 yield (args, keywargs)
Xtreak436c2b02019-05-28 12:37:39 +05301324
1325
Michael Foord345266a2012-03-14 12:24:34 -07001326 def decorate_callable(self, func):
Xtreak436c2b02019-05-28 12:37:39 +05301327 # NB. Keep the method in sync with decorate_async_callable()
Michael Foord345266a2012-03-14 12:24:34 -07001328 if hasattr(func, 'patchings'):
1329 func.patchings.append(self)
1330 return func
1331
1332 @wraps(func)
1333 def patched(*args, **keywargs):
Xtreak436c2b02019-05-28 12:37:39 +05301334 with self.decoration_helper(patched,
1335 args,
1336 keywargs) as (newargs, newkeywargs):
1337 return func(*newargs, **newkeywargs)
Michael Foord345266a2012-03-14 12:24:34 -07001338
Xtreak436c2b02019-05-28 12:37:39 +05301339 patched.patchings = [self]
1340 return patched
Michael Foord345266a2012-03-14 12:24:34 -07001341
Xtreak436c2b02019-05-28 12:37:39 +05301342
1343 def decorate_async_callable(self, func):
1344 # NB. Keep the method in sync with decorate_callable()
1345 if hasattr(func, 'patchings'):
1346 func.patchings.append(self)
1347 return func
1348
1349 @wraps(func)
1350 async def patched(*args, **keywargs):
1351 with self.decoration_helper(patched,
1352 args,
1353 keywargs) as (newargs, newkeywargs):
1354 return await func(*newargs, **newkeywargs)
Michael Foord345266a2012-03-14 12:24:34 -07001355
1356 patched.patchings = [self]
Michael Foord345266a2012-03-14 12:24:34 -07001357 return patched
1358
1359
1360 def get_original(self):
1361 target = self.getter()
1362 name = self.attribute
1363
1364 original = DEFAULT
1365 local = False
1366
1367 try:
1368 original = target.__dict__[name]
1369 except (AttributeError, KeyError):
1370 original = getattr(target, name, DEFAULT)
1371 else:
1372 local = True
1373
Michael Foordfddcfa22014-04-14 16:25:20 -04001374 if name in _builtins and isinstance(target, ModuleType):
1375 self.create = True
1376
Michael Foord345266a2012-03-14 12:24:34 -07001377 if not self.create and original is DEFAULT:
1378 raise AttributeError(
1379 "%s does not have the attribute %r" % (target, name)
1380 )
1381 return original, local
1382
1383
1384 def __enter__(self):
1385 """Perform the patch."""
1386 new, spec, spec_set = self.new, self.spec, self.spec_set
1387 autospec, kwargs = self.autospec, self.kwargs
1388 new_callable = self.new_callable
1389 self.target = self.getter()
1390
Michael Foord50a8c0e2012-03-25 18:57:58 +01001391 # normalise False to None
1392 if spec is False:
1393 spec = None
1394 if spec_set is False:
1395 spec_set = None
1396 if autospec is False:
1397 autospec = None
1398
1399 if spec is not None and autospec is not None:
1400 raise TypeError("Can't specify spec and autospec")
1401 if ((spec is not None or autospec is not None) and
1402 spec_set not in (True, None)):
1403 raise TypeError("Can't provide explicit spec_set *and* spec or autospec")
1404
Michael Foord345266a2012-03-14 12:24:34 -07001405 original, local = self.get_original()
1406
Michael Foord50a8c0e2012-03-25 18:57:58 +01001407 if new is DEFAULT and autospec is None:
Michael Foord345266a2012-03-14 12:24:34 -07001408 inherit = False
Michael Foord50a8c0e2012-03-25 18:57:58 +01001409 if spec is True:
Michael Foord345266a2012-03-14 12:24:34 -07001410 # set spec to the object we are replacing
1411 spec = original
Michael Foord50a8c0e2012-03-25 18:57:58 +01001412 if spec_set is True:
1413 spec_set = original
1414 spec = None
1415 elif spec is not None:
1416 if spec_set is True:
1417 spec_set = spec
1418 spec = None
1419 elif spec_set is True:
1420 spec_set = original
Michael Foord345266a2012-03-14 12:24:34 -07001421
Michael Foord50a8c0e2012-03-25 18:57:58 +01001422 if spec is not None or spec_set is not None:
1423 if original is DEFAULT:
1424 raise TypeError("Can't use 'spec' with create=True")
Michael Foord345266a2012-03-14 12:24:34 -07001425 if isinstance(original, type):
1426 # If we're patching out a class and there is a spec
1427 inherit = True
Lisa Roach77b3b772019-05-20 09:19:53 -07001428 if spec is None and _is_async_obj(original):
1429 Klass = AsyncMock
1430 else:
1431 Klass = MagicMock
Michael Foord345266a2012-03-14 12:24:34 -07001432 _kwargs = {}
1433 if new_callable is not None:
1434 Klass = new_callable
Michael Foord50a8c0e2012-03-25 18:57:58 +01001435 elif spec is not None or spec_set is not None:
Michael Foorde58a5622012-03-25 19:53:18 +01001436 this_spec = spec
1437 if spec_set is not None:
1438 this_spec = spec_set
1439 if _is_list(this_spec):
1440 not_callable = '__call__' not in this_spec
1441 else:
1442 not_callable = not callable(this_spec)
Lisa Roach77b3b772019-05-20 09:19:53 -07001443 if _is_async_obj(this_spec):
1444 Klass = AsyncMock
1445 elif not_callable:
Michael Foord345266a2012-03-14 12:24:34 -07001446 Klass = NonCallableMagicMock
1447
1448 if spec is not None:
1449 _kwargs['spec'] = spec
1450 if spec_set is not None:
1451 _kwargs['spec_set'] = spec_set
1452
1453 # add a name to mocks
1454 if (isinstance(Klass, type) and
1455 issubclass(Klass, NonCallableMock) and self.attribute):
1456 _kwargs['name'] = self.attribute
1457
1458 _kwargs.update(kwargs)
1459 new = Klass(**_kwargs)
1460
1461 if inherit and _is_instance_mock(new):
1462 # we can only tell if the instance should be callable if the
1463 # spec is not a list
Michael Foord50a8c0e2012-03-25 18:57:58 +01001464 this_spec = spec
1465 if spec_set is not None:
1466 this_spec = spec_set
1467 if (not _is_list(this_spec) and not
1468 _instance_callable(this_spec)):
Michael Foord345266a2012-03-14 12:24:34 -07001469 Klass = NonCallableMagicMock
1470
1471 _kwargs.pop('name')
1472 new.return_value = Klass(_new_parent=new, _new_name='()',
1473 **_kwargs)
Michael Foord50a8c0e2012-03-25 18:57:58 +01001474 elif autospec is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001475 # spec is ignored, new *must* be default, spec_set is treated
1476 # as a boolean. Should we check spec is not None and that spec_set
1477 # is a bool?
1478 if new is not DEFAULT:
1479 raise TypeError(
1480 "autospec creates the mock for you. Can't specify "
1481 "autospec and new."
1482 )
Michael Foord50a8c0e2012-03-25 18:57:58 +01001483 if original is DEFAULT:
Michael Foord99254732012-03-25 19:07:33 +01001484 raise TypeError("Can't use 'autospec' with create=True")
Michael Foord345266a2012-03-14 12:24:34 -07001485 spec_set = bool(spec_set)
1486 if autospec is True:
1487 autospec = original
1488
1489 new = create_autospec(autospec, spec_set=spec_set,
1490 _name=self.attribute, **kwargs)
1491 elif kwargs:
1492 # can't set keyword args when we aren't creating the mock
1493 # XXXX If new is a Mock we could call new.configure_mock(**kwargs)
1494 raise TypeError("Can't pass kwargs to a mock we aren't creating")
1495
1496 new_attr = new
1497
1498 self.temp_original = original
1499 self.is_local = local
Serhiy Storchaka4b222c92020-04-11 10:59:24 +03001500 self._exit_stack = contextlib.ExitStack()
1501 try:
1502 setattr(self.target, self.attribute, new_attr)
1503 if self.attribute_name is not None:
1504 extra_args = {}
1505 if self.new is DEFAULT:
1506 extra_args[self.attribute_name] = new
1507 for patching in self.additional_patchers:
1508 arg = self._exit_stack.enter_context(patching)
1509 if patching.new is DEFAULT:
1510 extra_args.update(arg)
1511 return extra_args
Michael Foord345266a2012-03-14 12:24:34 -07001512
Serhiy Storchaka4b222c92020-04-11 10:59:24 +03001513 return new
1514 except:
1515 if not self.__exit__(*sys.exc_info()):
1516 raise
Michael Foord345266a2012-03-14 12:24:34 -07001517
Michael Foord50a8c0e2012-03-25 18:57:58 +01001518 def __exit__(self, *exc_info):
Michael Foord345266a2012-03-14 12:24:34 -07001519 """Undo the patch."""
Michael Foord345266a2012-03-14 12:24:34 -07001520 if self.is_local and self.temp_original is not DEFAULT:
1521 setattr(self.target, self.attribute, self.temp_original)
1522 else:
1523 delattr(self.target, self.attribute)
Senthil Kumaran81bc9272016-01-08 23:43:29 -08001524 if not self.create and (not hasattr(self.target, self.attribute) or
1525 self.attribute in ('__doc__', '__module__',
1526 '__defaults__', '__annotations__',
1527 '__kwdefaults__')):
Michael Foord345266a2012-03-14 12:24:34 -07001528 # needed for proxy objects like django settings
1529 setattr(self.target, self.attribute, self.temp_original)
1530
1531 del self.temp_original
1532 del self.is_local
1533 del self.target
Serhiy Storchaka4b222c92020-04-11 10:59:24 +03001534 exit_stack = self._exit_stack
1535 del self._exit_stack
1536 return exit_stack.__exit__(*exc_info)
Michael Foord345266a2012-03-14 12:24:34 -07001537
Michael Foordf7c41582012-06-10 20:36:32 +01001538
1539 def start(self):
1540 """Activate a patch, returning any created mock."""
1541 result = self.__enter__()
Michael Foordebc1a302014-04-15 17:21:08 -04001542 self._active_patches.append(self)
Michael Foordf7c41582012-06-10 20:36:32 +01001543 return result
1544
1545
1546 def stop(self):
1547 """Stop an active patch."""
Michael Foordebc1a302014-04-15 17:21:08 -04001548 try:
1549 self._active_patches.remove(self)
1550 except ValueError:
1551 # If the patch hasn't been started this will fail
Serhiy Storchaka4b222c92020-04-11 10:59:24 +03001552 return None
Michael Foordebc1a302014-04-15 17:21:08 -04001553
Serhiy Storchaka4b222c92020-04-11 10:59:24 +03001554 return self.__exit__(None, None, None)
Michael Foord345266a2012-03-14 12:24:34 -07001555
1556
1557
1558def _get_target(target):
1559 try:
1560 target, attribute = target.rsplit('.', 1)
1561 except (TypeError, ValueError):
1562 raise TypeError("Need a valid target to patch. You supplied: %r" %
1563 (target,))
1564 getter = lambda: _importer(target)
1565 return getter, attribute
1566
1567
1568def _patch_object(
1569 target, attribute, new=DEFAULT, spec=None,
Michael Foord50a8c0e2012-03-25 18:57:58 +01001570 create=False, spec_set=None, autospec=None,
Michael Foord345266a2012-03-14 12:24:34 -07001571 new_callable=None, **kwargs
1572 ):
1573 """
Michael Foord345266a2012-03-14 12:24:34 -07001574 patch the named member (`attribute`) on an object (`target`) with a mock
1575 object.
1576
1577 `patch.object` can be used as a decorator, class decorator or a context
1578 manager. Arguments `new`, `spec`, `create`, `spec_set`,
1579 `autospec` and `new_callable` have the same meaning as for `patch`. Like
1580 `patch`, `patch.object` takes arbitrary keyword arguments for configuring
1581 the mock object it creates.
1582
1583 When used as a class decorator `patch.object` honours `patch.TEST_PREFIX`
1584 for choosing which methods to wrap.
1585 """
Elena Oatcd90a522019-12-08 12:14:38 -08001586 if type(target) is str:
1587 raise TypeError(
1588 f"{target!r} must be the actual object to be patched, not a str"
1589 )
Michael Foord345266a2012-03-14 12:24:34 -07001590 getter = lambda: target
1591 return _patch(
1592 getter, attribute, new, spec, create,
1593 spec_set, autospec, new_callable, kwargs
1594 )
1595
1596
Michael Foord50a8c0e2012-03-25 18:57:58 +01001597def _patch_multiple(target, spec=None, create=False, spec_set=None,
1598 autospec=None, new_callable=None, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001599 """Perform multiple patches in a single call. It takes the object to be
1600 patched (either as an object or a string to fetch the object by importing)
1601 and keyword arguments for the patches::
1602
1603 with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):
1604 ...
1605
1606 Use `DEFAULT` as the value if you want `patch.multiple` to create
1607 mocks for you. In this case the created mocks are passed into a decorated
1608 function by keyword, and a dictionary is returned when `patch.multiple` is
1609 used as a context manager.
1610
1611 `patch.multiple` can be used as a decorator, class decorator or a context
1612 manager. The arguments `spec`, `spec_set`, `create`,
1613 `autospec` and `new_callable` have the same meaning as for `patch`. These
1614 arguments will be applied to *all* patches done by `patch.multiple`.
1615
1616 When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX`
1617 for choosing which methods to wrap.
1618 """
1619 if type(target) is str:
1620 getter = lambda: _importer(target)
1621 else:
1622 getter = lambda: target
1623
1624 if not kwargs:
1625 raise ValueError(
1626 'Must supply at least one keyword argument with patch.multiple'
1627 )
1628 # need to wrap in a list for python 3, where items is a view
1629 items = list(kwargs.items())
1630 attribute, new = items[0]
1631 patcher = _patch(
1632 getter, attribute, new, spec, create, spec_set,
1633 autospec, new_callable, {}
1634 )
1635 patcher.attribute_name = attribute
1636 for attribute, new in items[1:]:
1637 this_patcher = _patch(
1638 getter, attribute, new, spec, create, spec_set,
1639 autospec, new_callable, {}
1640 )
1641 this_patcher.attribute_name = attribute
1642 patcher.additional_patchers.append(this_patcher)
1643 return patcher
1644
1645
1646def patch(
1647 target, new=DEFAULT, spec=None, create=False,
Michael Foord50a8c0e2012-03-25 18:57:58 +01001648 spec_set=None, autospec=None, new_callable=None, **kwargs
Michael Foord345266a2012-03-14 12:24:34 -07001649 ):
1650 """
1651 `patch` acts as a function decorator, class decorator or a context
1652 manager. Inside the body of the function or with statement, the `target`
Michael Foord54b3db82012-03-28 15:08:08 +01001653 is patched with a `new` object. When the function/with statement exits
1654 the patch is undone.
Michael Foord345266a2012-03-14 12:24:34 -07001655
Mario Corcherof5e7f392019-09-09 15:18:06 +01001656 If `new` is omitted, then the target is replaced with an
1657 `AsyncMock if the patched object is an async function or a
1658 `MagicMock` otherwise. If `patch` is used as a decorator and `new` is
Michael Foord54b3db82012-03-28 15:08:08 +01001659 omitted, the created mock is passed in as an extra argument to the
1660 decorated function. If `patch` is used as a context manager the created
1661 mock is returned by the context manager.
Michael Foord345266a2012-03-14 12:24:34 -07001662
Michael Foord54b3db82012-03-28 15:08:08 +01001663 `target` should be a string in the form `'package.module.ClassName'`. The
1664 `target` is imported and the specified object replaced with the `new`
1665 object, so the `target` must be importable from the environment you are
1666 calling `patch` from. The target is imported when the decorated function
1667 is executed, not at decoration time.
Michael Foord345266a2012-03-14 12:24:34 -07001668
1669 The `spec` and `spec_set` keyword arguments are passed to the `MagicMock`
1670 if patch is creating one for you.
1671
1672 In addition you can pass `spec=True` or `spec_set=True`, which causes
1673 patch to pass in the object being mocked as the spec/spec_set object.
1674
1675 `new_callable` allows you to specify a different class, or callable object,
Mario Corcherof5e7f392019-09-09 15:18:06 +01001676 that will be called to create the `new` object. By default `AsyncMock` is
1677 used for async functions and `MagicMock` for the rest.
Michael Foord345266a2012-03-14 12:24:34 -07001678
1679 A more powerful form of `spec` is `autospec`. If you set `autospec=True`
Robert Collins92b3e0652015-07-17 21:58:36 +12001680 then the mock will be created with a spec from the object being replaced.
Michael Foord345266a2012-03-14 12:24:34 -07001681 All attributes of the mock will also have the spec of the corresponding
1682 attribute of the object being replaced. Methods and functions being
1683 mocked will have their arguments checked and will raise a `TypeError` if
1684 they are called with the wrong signature. For mocks replacing a class,
1685 their return value (the 'instance') will have the same spec as the class.
1686
1687 Instead of `autospec=True` you can pass `autospec=some_object` to use an
1688 arbitrary object as the spec instead of the one being replaced.
1689
1690 By default `patch` will fail to replace attributes that don't exist. If
1691 you pass in `create=True`, and the attribute doesn't exist, patch will
1692 create the attribute for you when the patched function is called, and
1693 delete it again afterwards. This is useful for writing tests against
Terry Jan Reedy0f847642013-03-11 18:34:00 -04001694 attributes that your production code creates at runtime. It is off by
Michael Foord345266a2012-03-14 12:24:34 -07001695 default because it can be dangerous. With it switched on you can write
1696 passing tests against APIs that don't actually exist!
1697
1698 Patch can be used as a `TestCase` class decorator. It works by
1699 decorating each test method in the class. This reduces the boilerplate
1700 code when your test methods share a common patchings set. `patch` finds
1701 tests by looking for method names that start with `patch.TEST_PREFIX`.
1702 By default this is `test`, which matches the way `unittest` finds tests.
1703 You can specify an alternative prefix by setting `patch.TEST_PREFIX`.
1704
1705 Patch can be used as a context manager, with the with statement. Here the
1706 patching applies to the indented block after the with statement. If you
1707 use "as" then the patched object will be bound to the name after the
1708 "as"; very useful if `patch` is creating a mock object for you.
1709
1710 `patch` takes arbitrary keyword arguments. These will be passed to
Paulo Henrique Silva40c08092020-01-25 07:53:54 -03001711 `AsyncMock` if the patched object is asynchronous, to `MagicMock`
1712 otherwise or to `new_callable` if specified.
Michael Foord345266a2012-03-14 12:24:34 -07001713
1714 `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are
1715 available for alternate use-cases.
1716 """
1717 getter, attribute = _get_target(target)
1718 return _patch(
1719 getter, attribute, new, spec, create,
1720 spec_set, autospec, new_callable, kwargs
1721 )
1722
1723
1724class _patch_dict(object):
1725 """
1726 Patch a dictionary, or dictionary like object, and restore the dictionary
1727 to its original state after the test.
1728
1729 `in_dict` can be a dictionary or a mapping like container. If it is a
1730 mapping then it must at least support getting, setting and deleting items
1731 plus iterating over keys.
1732
1733 `in_dict` can also be a string specifying the name of the dictionary, which
1734 will then be fetched by importing it.
1735
1736 `values` can be a dictionary of values to set in the dictionary. `values`
1737 can also be an iterable of `(key, value)` pairs.
1738
1739 If `clear` is True then the dictionary will be cleared before the new
1740 values are set.
1741
1742 `patch.dict` can also be called with arbitrary keyword arguments to set
1743 values in the dictionary::
1744
1745 with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()):
1746 ...
1747
1748 `patch.dict` can be used as a context manager, decorator or class
1749 decorator. When used as a class decorator `patch.dict` honours
1750 `patch.TEST_PREFIX` for choosing which methods to wrap.
1751 """
1752
1753 def __init__(self, in_dict, values=(), clear=False, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001754 self.in_dict = in_dict
1755 # support any argument supported by dict(...) constructor
1756 self.values = dict(values)
1757 self.values.update(kwargs)
1758 self.clear = clear
1759 self._original = None
1760
1761
1762 def __call__(self, f):
1763 if isinstance(f, type):
1764 return self.decorate_class(f)
1765 @wraps(f)
1766 def _inner(*args, **kw):
1767 self._patch_dict()
1768 try:
1769 return f(*args, **kw)
1770 finally:
1771 self._unpatch_dict()
1772
1773 return _inner
1774
1775
1776 def decorate_class(self, klass):
1777 for attr in dir(klass):
1778 attr_value = getattr(klass, attr)
1779 if (attr.startswith(patch.TEST_PREFIX) and
1780 hasattr(attr_value, "__call__")):
1781 decorator = _patch_dict(self.in_dict, self.values, self.clear)
1782 decorated = decorator(attr_value)
1783 setattr(klass, attr, decorated)
1784 return klass
1785
1786
1787 def __enter__(self):
1788 """Patch the dict."""
1789 self._patch_dict()
Mario Corchero04530812019-05-28 13:53:31 +01001790 return self.in_dict
Michael Foord345266a2012-03-14 12:24:34 -07001791
1792
1793 def _patch_dict(self):
1794 values = self.values
Xtreaka875ea52019-02-25 00:24:49 +05301795 if isinstance(self.in_dict, str):
1796 self.in_dict = _importer(self.in_dict)
Michael Foord345266a2012-03-14 12:24:34 -07001797 in_dict = self.in_dict
1798 clear = self.clear
1799
1800 try:
1801 original = in_dict.copy()
1802 except AttributeError:
1803 # dict like object with no copy method
1804 # must support iteration over keys
1805 original = {}
1806 for key in in_dict:
1807 original[key] = in_dict[key]
1808 self._original = original
1809
1810 if clear:
1811 _clear_dict(in_dict)
1812
1813 try:
1814 in_dict.update(values)
1815 except AttributeError:
1816 # dict like object with no update method
1817 for key in values:
1818 in_dict[key] = values[key]
1819
1820
1821 def _unpatch_dict(self):
1822 in_dict = self.in_dict
1823 original = self._original
1824
1825 _clear_dict(in_dict)
1826
1827 try:
1828 in_dict.update(original)
1829 except AttributeError:
1830 for key in original:
1831 in_dict[key] = original[key]
1832
1833
1834 def __exit__(self, *args):
1835 """Unpatch the dict."""
Chris Withersdb5e86a2020-01-29 16:24:54 +00001836 if self._original is not None:
1837 self._unpatch_dict()
Michael Foord345266a2012-03-14 12:24:34 -07001838 return False
1839
Mario Corcheroe131c972020-01-24 08:38:33 +00001840
1841 def start(self):
1842 """Activate a patch, returning any created mock."""
1843 result = self.__enter__()
1844 _patch._active_patches.append(self)
1845 return result
1846
1847
1848 def stop(self):
1849 """Stop an active patch."""
1850 try:
1851 _patch._active_patches.remove(self)
1852 except ValueError:
1853 # If the patch hasn't been started this will fail
Serhiy Storchaka4b222c92020-04-11 10:59:24 +03001854 return None
Mario Corcheroe131c972020-01-24 08:38:33 +00001855
Serhiy Storchaka4b222c92020-04-11 10:59:24 +03001856 return self.__exit__(None, None, None)
Michael Foord345266a2012-03-14 12:24:34 -07001857
1858
1859def _clear_dict(in_dict):
1860 try:
1861 in_dict.clear()
1862 except AttributeError:
1863 keys = list(in_dict)
1864 for key in keys:
1865 del in_dict[key]
1866
1867
Michael Foordf7c41582012-06-10 20:36:32 +01001868def _patch_stopall():
Michael Foordebc1a302014-04-15 17:21:08 -04001869 """Stop all active patches. LIFO to unroll nested patches."""
1870 for patch in reversed(_patch._active_patches):
Michael Foordf7c41582012-06-10 20:36:32 +01001871 patch.stop()
1872
1873
Michael Foord345266a2012-03-14 12:24:34 -07001874patch.object = _patch_object
1875patch.dict = _patch_dict
1876patch.multiple = _patch_multiple
Michael Foordf7c41582012-06-10 20:36:32 +01001877patch.stopall = _patch_stopall
Michael Foord345266a2012-03-14 12:24:34 -07001878patch.TEST_PREFIX = 'test'
1879
1880magic_methods = (
1881 "lt le gt ge eq ne "
1882 "getitem setitem delitem "
1883 "len contains iter "
1884 "hash str sizeof "
1885 "enter exit "
Berker Peksaga785dec2015-03-15 01:51:56 +02001886 # we added divmod and rdivmod here instead of numerics
1887 # because there is no idivmod
1888 "divmod rdivmod neg pos abs invert "
Michael Foord345266a2012-03-14 12:24:34 -07001889 "complex int float index "
John Reese6c4fab02018-05-22 13:01:10 -07001890 "round trunc floor ceil "
Michael Foord345266a2012-03-14 12:24:34 -07001891 "bool next "
Max Bélanger6c83d9f2018-10-25 14:48:58 -07001892 "fspath "
Lisa Roach9a7d9512019-09-28 18:42:44 -07001893 "aiter "
Michael Foord345266a2012-03-14 12:24:34 -07001894)
1895
Michael Foordd2623d72014-04-14 11:23:48 -04001896numerics = (
Berker Peksag9bd8af72015-03-12 20:42:48 +02001897 "add sub mul matmul div floordiv mod lshift rshift and xor or pow truediv"
Michael Foordd2623d72014-04-14 11:23:48 -04001898)
Michael Foord345266a2012-03-14 12:24:34 -07001899inplace = ' '.join('i%s' % n for n in numerics.split())
1900right = ' '.join('r%s' % n for n in numerics.split())
1901
1902# not including __prepare__, __instancecheck__, __subclasscheck__
1903# (as they are metaclass methods)
1904# __del__ is not supported at all as it causes problems if it exists
1905
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001906_non_defaults = {
1907 '__get__', '__set__', '__delete__', '__reversed__', '__missing__',
1908 '__reduce__', '__reduce_ex__', '__getinitargs__', '__getnewargs__',
1909 '__getstate__', '__setstate__', '__getformat__', '__setformat__',
1910 '__repr__', '__dir__', '__subclasses__', '__format__',
Lisa Roach8b03f942019-09-19 21:04:18 -07001911 '__getnewargs_ex__',
Victor Stinnereb1a9952014-12-11 22:25:49 +01001912}
Michael Foord345266a2012-03-14 12:24:34 -07001913
1914
1915def _get_method(name, func):
1916 "Turns a callable object (like a mock) into a real function"
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001917 def method(self, /, *args, **kw):
Michael Foord345266a2012-03-14 12:24:34 -07001918 return func(self, *args, **kw)
1919 method.__name__ = name
1920 return method
1921
1922
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001923_magics = {
Michael Foord345266a2012-03-14 12:24:34 -07001924 '__%s__' % method for method in
1925 ' '.join([magic_methods, numerics, inplace, right]).split()
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001926}
Michael Foord345266a2012-03-14 12:24:34 -07001927
Lisa Roach77b3b772019-05-20 09:19:53 -07001928# Magic methods used for async `with` statements
1929_async_method_magics = {"__aenter__", "__aexit__", "__anext__"}
Lisa Roach8b03f942019-09-19 21:04:18 -07001930# Magic methods that are only used with async calls but are synchronous functions themselves
1931_sync_async_magics = {"__aiter__"}
1932_async_magics = _async_method_magics | _sync_async_magics
Lisa Roach77b3b772019-05-20 09:19:53 -07001933
Lisa Roach8b03f942019-09-19 21:04:18 -07001934_all_sync_magics = _magics | _non_defaults
1935_all_magics = _all_sync_magics | _async_magics
Michael Foord345266a2012-03-14 12:24:34 -07001936
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001937_unsupported_magics = {
Michael Foord345266a2012-03-14 12:24:34 -07001938 '__getattr__', '__setattr__',
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001939 '__init__', '__new__', '__prepare__',
Michael Foord345266a2012-03-14 12:24:34 -07001940 '__instancecheck__', '__subclasscheck__',
1941 '__del__'
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001942}
Michael Foord345266a2012-03-14 12:24:34 -07001943
1944_calculate_return_value = {
1945 '__hash__': lambda self: object.__hash__(self),
1946 '__str__': lambda self: object.__str__(self),
1947 '__sizeof__': lambda self: object.__sizeof__(self),
Max Bélanger6c83d9f2018-10-25 14:48:58 -07001948 '__fspath__': lambda self: f"{type(self).__name__}/{self._extract_mock_name()}/{id(self)}",
Michael Foord345266a2012-03-14 12:24:34 -07001949}
1950
1951_return_values = {
Michael Foord313f85f2012-03-25 18:16:07 +01001952 '__lt__': NotImplemented,
1953 '__gt__': NotImplemented,
1954 '__le__': NotImplemented,
1955 '__ge__': NotImplemented,
Michael Foord345266a2012-03-14 12:24:34 -07001956 '__int__': 1,
1957 '__contains__': False,
1958 '__len__': 0,
1959 '__exit__': False,
1960 '__complex__': 1j,
1961 '__float__': 1.0,
1962 '__bool__': True,
1963 '__index__': 1,
Lisa Roach77b3b772019-05-20 09:19:53 -07001964 '__aexit__': False,
Michael Foord345266a2012-03-14 12:24:34 -07001965}
1966
1967
1968def _get_eq(self):
1969 def __eq__(other):
1970 ret_val = self.__eq__._mock_return_value
1971 if ret_val is not DEFAULT:
1972 return ret_val
Serhiy Storchaka362f0582017-01-21 23:12:58 +02001973 if self is other:
1974 return True
1975 return NotImplemented
Michael Foord345266a2012-03-14 12:24:34 -07001976 return __eq__
1977
1978def _get_ne(self):
1979 def __ne__(other):
1980 if self.__ne__._mock_return_value is not DEFAULT:
1981 return DEFAULT
Serhiy Storchaka362f0582017-01-21 23:12:58 +02001982 if self is other:
1983 return False
1984 return NotImplemented
Michael Foord345266a2012-03-14 12:24:34 -07001985 return __ne__
1986
1987def _get_iter(self):
1988 def __iter__():
1989 ret_val = self.__iter__._mock_return_value
1990 if ret_val is DEFAULT:
1991 return iter([])
1992 # if ret_val was already an iterator, then calling iter on it should
1993 # return the iterator unchanged
1994 return iter(ret_val)
1995 return __iter__
1996
Lisa Roach77b3b772019-05-20 09:19:53 -07001997def _get_async_iter(self):
1998 def __aiter__():
1999 ret_val = self.__aiter__._mock_return_value
2000 if ret_val is DEFAULT:
2001 return _AsyncIterator(iter([]))
2002 return _AsyncIterator(iter(ret_val))
2003 return __aiter__
2004
Michael Foord345266a2012-03-14 12:24:34 -07002005_side_effect_methods = {
2006 '__eq__': _get_eq,
2007 '__ne__': _get_ne,
2008 '__iter__': _get_iter,
Lisa Roach77b3b772019-05-20 09:19:53 -07002009 '__aiter__': _get_async_iter
Michael Foord345266a2012-03-14 12:24:34 -07002010}
2011
2012
2013
2014def _set_return_value(mock, method, name):
Karthikeyan Singaravelan72b10042020-01-27 12:18:15 +05302015 # If _mock_wraps is present then attach it so that wrapped object
2016 # is used for return value is used when called.
2017 if mock._mock_wraps is not None:
2018 method._mock_wraps = getattr(mock._mock_wraps, name)
2019 return
2020
Michael Foord345266a2012-03-14 12:24:34 -07002021 fixed = _return_values.get(name, DEFAULT)
2022 if fixed is not DEFAULT:
2023 method.return_value = fixed
2024 return
2025
marcoramirezmxa9187c32019-09-16 11:34:46 -05002026 return_calculator = _calculate_return_value.get(name)
2027 if return_calculator is not None:
2028 return_value = return_calculator(mock)
Michael Foord345266a2012-03-14 12:24:34 -07002029 method.return_value = return_value
2030 return
2031
2032 side_effector = _side_effect_methods.get(name)
2033 if side_effector is not None:
2034 method.side_effect = side_effector(mock)
2035
2036
2037
Lisa Roach9a7d9512019-09-28 18:42:44 -07002038class MagicMixin(Base):
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002039 def __init__(self, /, *args, **kw):
Łukasz Langaa468db92015-04-13 23:12:42 -07002040 self._mock_set_magics() # make magic work for kwargs in init
Nick Coghlan0b43bcf2012-05-27 18:17:07 +10002041 _safe_super(MagicMixin, self).__init__(*args, **kw)
Łukasz Langaa468db92015-04-13 23:12:42 -07002042 self._mock_set_magics() # fix magic broken by upper level init
Michael Foord345266a2012-03-14 12:24:34 -07002043
2044
2045 def _mock_set_magics(self):
Lisa Roach9a7d9512019-09-28 18:42:44 -07002046 orig_magics = _magics | _async_method_magics
2047 these_magics = orig_magics
Michael Foord345266a2012-03-14 12:24:34 -07002048
Łukasz Langaa468db92015-04-13 23:12:42 -07002049 if getattr(self, "_mock_methods", None) is not None:
Lisa Roach9a7d9512019-09-28 18:42:44 -07002050 these_magics = orig_magics.intersection(self._mock_methods)
Michael Foord345266a2012-03-14 12:24:34 -07002051
2052 remove_magics = set()
Lisa Roach9a7d9512019-09-28 18:42:44 -07002053 remove_magics = orig_magics - these_magics
Michael Foord345266a2012-03-14 12:24:34 -07002054
2055 for entry in remove_magics:
2056 if entry in type(self).__dict__:
2057 # remove unneeded magic methods
2058 delattr(self, entry)
2059
2060 # don't overwrite existing attributes if called a second time
2061 these_magics = these_magics - set(type(self).__dict__)
2062
2063 _type = type(self)
2064 for entry in these_magics:
2065 setattr(_type, entry, MagicProxy(entry, self))
2066
2067
2068
2069class NonCallableMagicMock(MagicMixin, NonCallableMock):
2070 """A version of `MagicMock` that isn't callable."""
2071 def mock_add_spec(self, spec, spec_set=False):
2072 """Add a spec to a mock. `spec` can either be an object or a
2073 list of strings. Only attributes on the `spec` can be fetched as
2074 attributes from the mock.
2075
2076 If `spec_set` is True then only attributes on the spec can be set."""
2077 self._mock_add_spec(spec, spec_set)
2078 self._mock_set_magics()
2079
2080
Lisa Roach9a7d9512019-09-28 18:42:44 -07002081class AsyncMagicMixin(MagicMixin):
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002082 def __init__(self, /, *args, **kw):
Lisa Roach9a7d9512019-09-28 18:42:44 -07002083 self._mock_set_magics() # make magic work for kwargs in init
Lisa Roach77b3b772019-05-20 09:19:53 -07002084 _safe_super(AsyncMagicMixin, self).__init__(*args, **kw)
Lisa Roach9a7d9512019-09-28 18:42:44 -07002085 self._mock_set_magics() # fix magic broken by upper level init
Michael Foord345266a2012-03-14 12:24:34 -07002086
Lisa Roach9a7d9512019-09-28 18:42:44 -07002087class MagicMock(MagicMixin, Mock):
Michael Foord345266a2012-03-14 12:24:34 -07002088 """
2089 MagicMock is a subclass of Mock with default implementations
2090 of most of the magic methods. You can use MagicMock without having to
2091 configure the magic methods yourself.
2092
2093 If you use the `spec` or `spec_set` arguments then *only* magic
2094 methods that exist in the spec will be created.
2095
2096 Attributes and the return value of a `MagicMock` will also be `MagicMocks`.
2097 """
2098 def mock_add_spec(self, spec, spec_set=False):
2099 """Add a spec to a mock. `spec` can either be an object or a
2100 list of strings. Only attributes on the `spec` can be fetched as
2101 attributes from the mock.
2102
2103 If `spec_set` is True then only attributes on the spec can be set."""
2104 self._mock_add_spec(spec, spec_set)
2105 self._mock_set_magics()
2106
2107
2108
Lisa Roach9a7d9512019-09-28 18:42:44 -07002109class MagicProxy(Base):
Michael Foord345266a2012-03-14 12:24:34 -07002110 def __init__(self, name, parent):
2111 self.name = name
2112 self.parent = parent
2113
Michael Foord345266a2012-03-14 12:24:34 -07002114 def create_mock(self):
2115 entry = self.name
2116 parent = self.parent
2117 m = parent._get_child_mock(name=entry, _new_name=entry,
2118 _new_parent=parent)
2119 setattr(parent, entry, m)
2120 _set_return_value(parent, m, entry)
2121 return m
2122
2123 def __get__(self, obj, _type=None):
2124 return self.create_mock()
2125
2126
Lisa Roach77b3b772019-05-20 09:19:53 -07002127class AsyncMockMixin(Base):
Lisa Roach77b3b772019-05-20 09:19:53 -07002128 await_count = _delegating_property('await_count')
2129 await_args = _delegating_property('await_args')
2130 await_args_list = _delegating_property('await_args_list')
2131
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002132 def __init__(self, /, *args, **kwargs):
Lisa Roach77b3b772019-05-20 09:19:53 -07002133 super().__init__(*args, **kwargs)
Chris Withersc7dd3c72020-01-27 14:11:19 +00002134 # iscoroutinefunction() checks _is_coroutine property to say if an
Lisa Roach77b3b772019-05-20 09:19:53 -07002135 # object is a coroutine. Without this check it looks to see if it is a
2136 # function/method, which in this case it is not (since it is an
2137 # AsyncMock).
2138 # It is set through __dict__ because when spec_set is True, this
2139 # attribute is likely undefined.
2140 self.__dict__['_is_coroutine'] = asyncio.coroutines._is_coroutine
Lisa Roach77b3b772019-05-20 09:19:53 -07002141 self.__dict__['_mock_await_count'] = 0
2142 self.__dict__['_mock_await_args'] = None
2143 self.__dict__['_mock_await_args_list'] = _CallList()
2144 code_mock = NonCallableMock(spec_set=CodeType)
2145 code_mock.co_flags = inspect.CO_COROUTINE
2146 self.__dict__['__code__'] = code_mock
2147
Jason Fried046442d2019-11-20 16:27:51 -08002148 async def _execute_mock_call(self, /, *args, **kwargs):
Chris Withersdb5e86a2020-01-29 16:24:54 +00002149 # This is nearly just like super(), except for special handling
Jason Fried046442d2019-11-20 16:27:51 -08002150 # of coroutines
Lisa Roach77b3b772019-05-20 09:19:53 -07002151
Karthikeyan Singaravelane553f202020-03-11 20:36:12 +05302152 _call = _Call((args, kwargs), two=True)
Jason Fried046442d2019-11-20 16:27:51 -08002153 self.await_count += 1
2154 self.await_args = _call
2155 self.await_args_list.append(_call)
Lisa Roach77b3b772019-05-20 09:19:53 -07002156
Jason Fried046442d2019-11-20 16:27:51 -08002157 effect = self.side_effect
2158 if effect is not None:
2159 if _is_exception(effect):
2160 raise effect
2161 elif not _callable(effect):
2162 try:
2163 result = next(effect)
2164 except StopIteration:
2165 # It is impossible to propogate a StopIteration
2166 # through coroutines because of PEP 479
2167 raise StopAsyncIteration
2168 if _is_exception(result):
2169 raise result
Chris Withersc7dd3c72020-01-27 14:11:19 +00002170 elif iscoroutinefunction(effect):
Jason Fried046442d2019-11-20 16:27:51 -08002171 result = await effect(*args, **kwargs)
2172 else:
2173 result = effect(*args, **kwargs)
Lisa Roach77b3b772019-05-20 09:19:53 -07002174
Jason Fried046442d2019-11-20 16:27:51 -08002175 if result is not DEFAULT:
2176 return result
2177
2178 if self._mock_return_value is not DEFAULT:
2179 return self.return_value
2180
2181 if self._mock_wraps is not None:
Chris Withersc7dd3c72020-01-27 14:11:19 +00002182 if iscoroutinefunction(self._mock_wraps):
Jason Fried046442d2019-11-20 16:27:51 -08002183 return await self._mock_wraps(*args, **kwargs)
2184 return self._mock_wraps(*args, **kwargs)
2185
2186 return self.return_value
Lisa Roach77b3b772019-05-20 09:19:53 -07002187
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002188 def assert_awaited(self):
Lisa Roach77b3b772019-05-20 09:19:53 -07002189 """
2190 Assert that the mock was awaited at least once.
2191 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002192 if self.await_count == 0:
2193 msg = f"Expected {self._mock_name or 'mock'} to have been awaited."
2194 raise AssertionError(msg)
2195
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002196 def assert_awaited_once(self):
Lisa Roach77b3b772019-05-20 09:19:53 -07002197 """
2198 Assert that the mock was awaited exactly once.
2199 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002200 if not self.await_count == 1:
2201 msg = (f"Expected {self._mock_name or 'mock'} to have been awaited once."
2202 f" Awaited {self.await_count} times.")
2203 raise AssertionError(msg)
2204
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002205 def assert_awaited_with(self, /, *args, **kwargs):
Lisa Roach77b3b772019-05-20 09:19:53 -07002206 """
2207 Assert that the last await was with the specified arguments.
2208 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002209 if self.await_args is None:
2210 expected = self._format_mock_call_signature(args, kwargs)
2211 raise AssertionError(f'Expected await: {expected}\nNot awaited')
2212
2213 def _error_message():
Xtreak0ae022c2019-05-29 12:32:26 +05302214 msg = self._format_mock_failure_message(args, kwargs, action='await')
Lisa Roach77b3b772019-05-20 09:19:53 -07002215 return msg
2216
Elizabeth Useltond6a9d172019-09-13 08:54:32 -07002217 expected = self._call_matcher(_Call((args, kwargs), two=True))
Lisa Roach77b3b772019-05-20 09:19:53 -07002218 actual = self._call_matcher(self.await_args)
Elizabeth Useltond6a9d172019-09-13 08:54:32 -07002219 if actual != expected:
Lisa Roach77b3b772019-05-20 09:19:53 -07002220 cause = expected if isinstance(expected, Exception) else None
2221 raise AssertionError(_error_message()) from cause
2222
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002223 def assert_awaited_once_with(self, /, *args, **kwargs):
Lisa Roach77b3b772019-05-20 09:19:53 -07002224 """
2225 Assert that the mock was awaited exactly once and with the specified
2226 arguments.
2227 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002228 if not self.await_count == 1:
2229 msg = (f"Expected {self._mock_name or 'mock'} to have been awaited once."
2230 f" Awaited {self.await_count} times.")
2231 raise AssertionError(msg)
2232 return self.assert_awaited_with(*args, **kwargs)
2233
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002234 def assert_any_await(self, /, *args, **kwargs):
Lisa Roach77b3b772019-05-20 09:19:53 -07002235 """
2236 Assert the mock has ever been awaited with the specified arguments.
2237 """
Elizabeth Useltond6a9d172019-09-13 08:54:32 -07002238 expected = self._call_matcher(_Call((args, kwargs), two=True))
2239 cause = expected if isinstance(expected, Exception) else None
Lisa Roach77b3b772019-05-20 09:19:53 -07002240 actual = [self._call_matcher(c) for c in self.await_args_list]
Elizabeth Useltond6a9d172019-09-13 08:54:32 -07002241 if cause or expected not in _AnyComparer(actual):
Lisa Roach77b3b772019-05-20 09:19:53 -07002242 expected_string = self._format_mock_call_signature(args, kwargs)
2243 raise AssertionError(
2244 '%s await not found' % expected_string
2245 ) from cause
2246
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002247 def assert_has_awaits(self, calls, any_order=False):
Lisa Roach77b3b772019-05-20 09:19:53 -07002248 """
2249 Assert the mock has been awaited with the specified calls.
2250 The :attr:`await_args_list` list is checked for the awaits.
2251
2252 If `any_order` is False (the default) then the awaits must be
2253 sequential. There can be extra calls before or after the
2254 specified awaits.
2255
2256 If `any_order` is True then the awaits can be in any order, but
2257 they must all appear in :attr:`await_args_list`.
2258 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002259 expected = [self._call_matcher(c) for c in calls]
Samuel Freilichb5a7a4f2019-09-24 15:08:31 -04002260 cause = next((e for e in expected if isinstance(e, Exception)), None)
Lisa Roach77b3b772019-05-20 09:19:53 -07002261 all_awaits = _CallList(self._call_matcher(c) for c in self.await_args_list)
2262 if not any_order:
2263 if expected not in all_awaits:
Samuel Freilichb5a7a4f2019-09-24 15:08:31 -04002264 if cause is None:
2265 problem = 'Awaits not found.'
2266 else:
2267 problem = ('Error processing expected awaits.\n'
2268 'Errors: {}').format(
2269 [e if isinstance(e, Exception) else None
2270 for e in expected])
Lisa Roach77b3b772019-05-20 09:19:53 -07002271 raise AssertionError(
Samuel Freilichb5a7a4f2019-09-24 15:08:31 -04002272 f'{problem}\n'
2273 f'Expected: {_CallList(calls)}\n'
Lisa Roach77b3b772019-05-20 09:19:53 -07002274 f'Actual: {self.await_args_list}'
2275 ) from cause
2276 return
2277
2278 all_awaits = list(all_awaits)
2279
2280 not_found = []
2281 for kall in expected:
2282 try:
2283 all_awaits.remove(kall)
2284 except ValueError:
2285 not_found.append(kall)
2286 if not_found:
2287 raise AssertionError(
2288 '%r not all found in await list' % (tuple(not_found),)
2289 ) from cause
2290
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002291 def assert_not_awaited(self):
Lisa Roach77b3b772019-05-20 09:19:53 -07002292 """
2293 Assert that the mock was never awaited.
2294 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002295 if self.await_count != 0:
Xtreakff6b2e62019-05-27 18:26:23 +05302296 msg = (f"Expected {self._mock_name or 'mock'} to not have been awaited."
Lisa Roach77b3b772019-05-20 09:19:53 -07002297 f" Awaited {self.await_count} times.")
2298 raise AssertionError(msg)
2299
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002300 def reset_mock(self, /, *args, **kwargs):
Lisa Roach77b3b772019-05-20 09:19:53 -07002301 """
2302 See :func:`.Mock.reset_mock()`
2303 """
2304 super().reset_mock(*args, **kwargs)
2305 self.await_count = 0
2306 self.await_args = None
2307 self.await_args_list = _CallList()
2308
2309
2310class AsyncMock(AsyncMockMixin, AsyncMagicMixin, Mock):
2311 """
2312 Enhance :class:`Mock` with features allowing to mock
2313 an async function.
2314
2315 The :class:`AsyncMock` object will behave so the object is
2316 recognized as an async function, and the result of a call is an awaitable:
2317
2318 >>> mock = AsyncMock()
Chris Withersc7dd3c72020-01-27 14:11:19 +00002319 >>> iscoroutinefunction(mock)
Lisa Roach77b3b772019-05-20 09:19:53 -07002320 True
2321 >>> inspect.isawaitable(mock())
2322 True
2323
2324
2325 The result of ``mock()`` is an async function which will have the outcome
2326 of ``side_effect`` or ``return_value``:
2327
2328 - if ``side_effect`` is a function, the async function will return the
2329 result of that function,
2330 - if ``side_effect`` is an exception, the async function will raise the
2331 exception,
2332 - if ``side_effect`` is an iterable, the async function will return the
2333 next value of the iterable, however, if the sequence of result is
2334 exhausted, ``StopIteration`` is raised immediately,
2335 - if ``side_effect`` is not defined, the async function will return the
2336 value defined by ``return_value``, hence, by default, the async function
2337 returns a new :class:`AsyncMock` object.
2338
2339 If the outcome of ``side_effect`` or ``return_value`` is an async function,
2340 the mock async function obtained when the mock object is called will be this
2341 async function itself (and not an async function returning an async
2342 function).
2343
2344 The test author can also specify a wrapped object with ``wraps``. In this
2345 case, the :class:`Mock` object behavior is the same as with an
2346 :class:`.Mock` object: the wrapped object may have methods
2347 defined as async function functions.
2348
Xtreake7cb23b2019-05-21 14:17:17 +05302349 Based on Martin Richard's asynctest project.
Lisa Roach77b3b772019-05-20 09:19:53 -07002350 """
2351
Michael Foord345266a2012-03-14 12:24:34 -07002352
2353class _ANY(object):
2354 "A helper object that compares equal to everything."
2355
2356 def __eq__(self, other):
2357 return True
2358
2359 def __ne__(self, other):
2360 return False
2361
2362 def __repr__(self):
2363 return '<ANY>'
2364
2365ANY = _ANY()
2366
2367
2368
2369def _format_call_signature(name, args, kwargs):
2370 message = '%s(%%s)' % name
2371 formatted_args = ''
2372 args_string = ', '.join([repr(arg) for arg in args])
2373 kwargs_string = ', '.join([
Xtreak9d607062019-09-09 16:25:22 +05302374 '%s=%r' % (key, value) for key, value in kwargs.items()
Michael Foord345266a2012-03-14 12:24:34 -07002375 ])
2376 if args_string:
2377 formatted_args = args_string
2378 if kwargs_string:
2379 if formatted_args:
2380 formatted_args += ', '
2381 formatted_args += kwargs_string
2382
2383 return message % formatted_args
2384
2385
2386
2387class _Call(tuple):
2388 """
2389 A tuple for holding the results of a call to a mock, either in the form
2390 `(args, kwargs)` or `(name, args, kwargs)`.
2391
2392 If args or kwargs are empty then a call tuple will compare equal to
2393 a tuple without those values. This makes comparisons less verbose::
2394
2395 _Call(('name', (), {})) == ('name',)
2396 _Call(('name', (1,), {})) == ('name', (1,))
2397 _Call(((), {'a': 'b'})) == ({'a': 'b'},)
2398
2399 The `_Call` object provides a useful shortcut for comparing with call::
2400
2401 _Call(((1, 2), {'a': 3})) == call(1, 2, a=3)
2402 _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3)
2403
2404 If the _Call has no name then it will match any name.
2405 """
Victor Stinner84b6fb02017-01-06 18:15:51 +01002406 def __new__(cls, value=(), name='', parent=None, two=False,
Michael Foord345266a2012-03-14 12:24:34 -07002407 from_kall=True):
Michael Foord345266a2012-03-14 12:24:34 -07002408 args = ()
2409 kwargs = {}
2410 _len = len(value)
2411 if _len == 3:
2412 name, args, kwargs = value
2413 elif _len == 2:
2414 first, second = value
2415 if isinstance(first, str):
2416 name = first
2417 if isinstance(second, tuple):
2418 args = second
2419 else:
2420 kwargs = second
2421 else:
2422 args, kwargs = first, second
2423 elif _len == 1:
2424 value, = value
2425 if isinstance(value, str):
2426 name = value
2427 elif isinstance(value, tuple):
2428 args = value
2429 else:
2430 kwargs = value
2431
2432 if two:
2433 return tuple.__new__(cls, (args, kwargs))
2434
2435 return tuple.__new__(cls, (name, args, kwargs))
2436
2437
2438 def __init__(self, value=(), name=None, parent=None, two=False,
2439 from_kall=True):
Andrew Dunaie63e6172018-12-04 11:08:45 +02002440 self._mock_name = name
2441 self._mock_parent = parent
2442 self._mock_from_kall = from_kall
Michael Foord345266a2012-03-14 12:24:34 -07002443
2444
2445 def __eq__(self, other):
Michael Foord345266a2012-03-14 12:24:34 -07002446 try:
2447 len_other = len(other)
2448 except TypeError:
Serhiy Storchaka662db122019-08-08 08:42:54 +03002449 return NotImplemented
Michael Foord345266a2012-03-14 12:24:34 -07002450
2451 self_name = ''
2452 if len(self) == 2:
2453 self_args, self_kwargs = self
2454 else:
2455 self_name, self_args, self_kwargs = self
2456
Andrew Dunaie63e6172018-12-04 11:08:45 +02002457 if (getattr(self, '_mock_parent', None) and getattr(other, '_mock_parent', None)
2458 and self._mock_parent != other._mock_parent):
Chris Withers8ca0fa92018-12-03 21:31:37 +00002459 return False
2460
Michael Foord345266a2012-03-14 12:24:34 -07002461 other_name = ''
2462 if len_other == 0:
2463 other_args, other_kwargs = (), {}
2464 elif len_other == 3:
2465 other_name, other_args, other_kwargs = other
2466 elif len_other == 1:
2467 value, = other
2468 if isinstance(value, tuple):
2469 other_args = value
2470 other_kwargs = {}
2471 elif isinstance(value, str):
2472 other_name = value
2473 other_args, other_kwargs = (), {}
2474 else:
2475 other_args = ()
2476 other_kwargs = value
Berker Peksag3fc536f2015-09-09 23:35:25 +03002477 elif len_other == 2:
Michael Foord345266a2012-03-14 12:24:34 -07002478 # could be (name, args) or (name, kwargs) or (args, kwargs)
2479 first, second = other
2480 if isinstance(first, str):
2481 other_name = first
2482 if isinstance(second, tuple):
2483 other_args, other_kwargs = second, {}
2484 else:
2485 other_args, other_kwargs = (), second
2486 else:
2487 other_args, other_kwargs = first, second
Berker Peksag3fc536f2015-09-09 23:35:25 +03002488 else:
2489 return False
Michael Foord345266a2012-03-14 12:24:34 -07002490
2491 if self_name and other_name != self_name:
2492 return False
2493
2494 # this order is important for ANY to work!
2495 return (other_args, other_kwargs) == (self_args, self_kwargs)
2496
2497
Berker Peksagce913872016-03-28 00:30:02 +03002498 __ne__ = object.__ne__
2499
2500
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002501 def __call__(self, /, *args, **kwargs):
Andrew Dunaie63e6172018-12-04 11:08:45 +02002502 if self._mock_name is None:
Michael Foord345266a2012-03-14 12:24:34 -07002503 return _Call(('', args, kwargs), name='()')
2504
Andrew Dunaie63e6172018-12-04 11:08:45 +02002505 name = self._mock_name + '()'
2506 return _Call((self._mock_name, args, kwargs), name=name, parent=self)
Michael Foord345266a2012-03-14 12:24:34 -07002507
2508
2509 def __getattr__(self, attr):
Andrew Dunaie63e6172018-12-04 11:08:45 +02002510 if self._mock_name is None:
Michael Foord345266a2012-03-14 12:24:34 -07002511 return _Call(name=attr, from_kall=False)
Andrew Dunaie63e6172018-12-04 11:08:45 +02002512 name = '%s.%s' % (self._mock_name, attr)
Michael Foord345266a2012-03-14 12:24:34 -07002513 return _Call(name=name, parent=self, from_kall=False)
2514
2515
blhsing72c35992019-09-11 07:28:06 -07002516 def __getattribute__(self, attr):
2517 if attr in tuple.__dict__:
2518 raise AttributeError
2519 return tuple.__getattribute__(self, attr)
2520
2521
Kumar Akshayb0df45e2019-03-22 13:40:40 +05302522 def _get_call_arguments(self):
2523 if len(self) == 2:
2524 args, kwargs = self
2525 else:
2526 name, args, kwargs = self
2527
2528 return args, kwargs
2529
2530 @property
2531 def args(self):
2532 return self._get_call_arguments()[0]
2533
2534 @property
2535 def kwargs(self):
2536 return self._get_call_arguments()[1]
2537
Michael Foord345266a2012-03-14 12:24:34 -07002538 def __repr__(self):
Andrew Dunaie63e6172018-12-04 11:08:45 +02002539 if not self._mock_from_kall:
2540 name = self._mock_name or 'call'
Michael Foord345266a2012-03-14 12:24:34 -07002541 if name.startswith('()'):
2542 name = 'call%s' % name
2543 return name
2544
2545 if len(self) == 2:
2546 name = 'call'
2547 args, kwargs = self
2548 else:
2549 name, args, kwargs = self
2550 if not name:
2551 name = 'call'
2552 elif not name.startswith('()'):
2553 name = 'call.%s' % name
2554 else:
2555 name = 'call%s' % name
2556 return _format_call_signature(name, args, kwargs)
2557
2558
2559 def call_list(self):
2560 """For a call object that represents multiple calls, `call_list`
2561 returns a list of all the intermediate calls as well as the
2562 final call."""
2563 vals = []
2564 thing = self
2565 while thing is not None:
Andrew Dunaie63e6172018-12-04 11:08:45 +02002566 if thing._mock_from_kall:
Michael Foord345266a2012-03-14 12:24:34 -07002567 vals.append(thing)
Andrew Dunaie63e6172018-12-04 11:08:45 +02002568 thing = thing._mock_parent
Michael Foord345266a2012-03-14 12:24:34 -07002569 return _CallList(reversed(vals))
2570
2571
2572call = _Call(from_kall=False)
2573
2574
Michael Foord345266a2012-03-14 12:24:34 -07002575def create_autospec(spec, spec_set=False, instance=False, _parent=None,
2576 _name=None, **kwargs):
2577 """Create a mock object using another object as a spec. Attributes on the
2578 mock will use the corresponding attribute on the `spec` object as their
2579 spec.
2580
2581 Functions or methods being mocked will have their arguments checked
2582 to check that they are called with the correct signature.
2583
2584 If `spec_set` is True then attempting to set attributes that don't exist
2585 on the spec object will raise an `AttributeError`.
2586
2587 If a class is used as a spec then the return value of the mock (the
2588 instance of the class) will have the same spec. You can use a class as the
2589 spec for an instance object by passing `instance=True`. The returned mock
2590 will only be callable if instances of the mock are callable.
2591
2592 `create_autospec` also takes arbitrary keyword arguments that are passed to
2593 the constructor of the created mock."""
2594 if _is_list(spec):
2595 # can't pass a list instance to the mock constructor as it will be
2596 # interpreted as a list of strings
2597 spec = type(spec)
2598
2599 is_type = isinstance(spec, type)
Xtreakff6b2e62019-05-27 18:26:23 +05302600 is_async_func = _is_async_func(spec)
Michael Foord345266a2012-03-14 12:24:34 -07002601 _kwargs = {'spec': spec}
2602 if spec_set:
2603 _kwargs = {'spec_set': spec}
2604 elif spec is None:
2605 # None we mock with a normal mock without a spec
2606 _kwargs = {}
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002607 if _kwargs and instance:
2608 _kwargs['_spec_as_instance'] = True
Michael Foord345266a2012-03-14 12:24:34 -07002609
2610 _kwargs.update(kwargs)
2611
2612 Klass = MagicMock
Gregory P. Smithd4583d72016-08-15 23:23:40 -07002613 if inspect.isdatadescriptor(spec):
Michael Foord345266a2012-03-14 12:24:34 -07002614 # descriptors don't have a spec
2615 # because we don't know what type they return
2616 _kwargs = {}
Lisa Roach77b3b772019-05-20 09:19:53 -07002617 elif is_async_func:
2618 if instance:
2619 raise RuntimeError("Instance can not be True when create_autospec "
2620 "is mocking an async function")
2621 Klass = AsyncMock
Michael Foord345266a2012-03-14 12:24:34 -07002622 elif not _callable(spec):
2623 Klass = NonCallableMagicMock
2624 elif is_type and instance and not _instance_callable(spec):
2625 Klass = NonCallableMagicMock
2626
Kushal Das484f8a82014-04-16 01:05:50 +05302627 _name = _kwargs.pop('name', _name)
2628
Michael Foord345266a2012-03-14 12:24:34 -07002629 _new_name = _name
2630 if _parent is None:
2631 # for a top level object no _new_name should be set
2632 _new_name = ''
2633
2634 mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name,
2635 name=_name, **_kwargs)
2636
2637 if isinstance(spec, FunctionTypes):
2638 # should only happen at the top level because we don't
2639 # recurse for functions
2640 mock = _set_signature(mock, spec)
Lisa Roach77b3b772019-05-20 09:19:53 -07002641 if is_async_func:
Xtreakff6b2e62019-05-27 18:26:23 +05302642 _setup_async_mock(mock)
Michael Foord345266a2012-03-14 12:24:34 -07002643 else:
2644 _check_signature(spec, mock, is_type, instance)
2645
2646 if _parent is not None and not instance:
2647 _parent._mock_children[_name] = mock
2648
2649 if is_type and not instance and 'return_value' not in kwargs:
Michael Foord345266a2012-03-14 12:24:34 -07002650 mock.return_value = create_autospec(spec, spec_set, instance=True,
2651 _name='()', _parent=mock)
2652
2653 for entry in dir(spec):
2654 if _is_magic(entry):
2655 # MagicMock already does the useful magic methods for us
2656 continue
2657
Michael Foord345266a2012-03-14 12:24:34 -07002658 # XXXX do we need a better way of getting attributes without
2659 # triggering code execution (?) Probably not - we need the actual
2660 # object to mock it so we would rather trigger a property than mock
2661 # the property descriptor. Likewise we want to mock out dynamically
2662 # provided attributes.
Michael Foord656319e2012-04-13 17:39:16 +01002663 # XXXX what about attributes that raise exceptions other than
2664 # AttributeError on being fetched?
Michael Foord345266a2012-03-14 12:24:34 -07002665 # we could be resilient against it, or catch and propagate the
2666 # exception when the attribute is fetched from the mock
Michael Foord656319e2012-04-13 17:39:16 +01002667 try:
2668 original = getattr(spec, entry)
2669 except AttributeError:
2670 continue
Michael Foord345266a2012-03-14 12:24:34 -07002671
2672 kwargs = {'spec': original}
2673 if spec_set:
2674 kwargs = {'spec_set': original}
2675
2676 if not isinstance(original, FunctionTypes):
2677 new = _SpecState(original, spec_set, mock, entry, instance)
2678 mock._mock_children[entry] = new
2679 else:
2680 parent = mock
2681 if isinstance(spec, FunctionTypes):
2682 parent = mock.mock
2683
Michael Foord345266a2012-03-14 12:24:34 -07002684 skipfirst = _must_skip(spec, entry, is_type)
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002685 kwargs['_eat_self'] = skipfirst
Chris Withersc7dd3c72020-01-27 14:11:19 +00002686 if iscoroutinefunction(original):
Lisa Roach77b3b772019-05-20 09:19:53 -07002687 child_klass = AsyncMock
2688 else:
2689 child_klass = MagicMock
2690 new = child_klass(parent=parent, name=entry, _new_name=entry,
2691 _new_parent=parent,
2692 **kwargs)
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002693 mock._mock_children[entry] = new
Michael Foord345266a2012-03-14 12:24:34 -07002694 _check_signature(original, new, skipfirst=skipfirst)
2695
2696 # so functions created with _set_signature become instance attributes,
2697 # *plus* their underlying mock exists in _mock_children of the parent
2698 # mock. Adding to _mock_children may be unnecessary where we are also
2699 # setting as an instance attribute?
2700 if isinstance(new, FunctionTypes):
2701 setattr(mock, entry, new)
2702
2703 return mock
2704
2705
2706def _must_skip(spec, entry, is_type):
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002707 """
2708 Return whether we should skip the first argument on spec's `entry`
2709 attribute.
2710 """
Michael Foord345266a2012-03-14 12:24:34 -07002711 if not isinstance(spec, type):
2712 if entry in getattr(spec, '__dict__', {}):
2713 # instance attribute - shouldn't skip
2714 return False
Michael Foord345266a2012-03-14 12:24:34 -07002715 spec = spec.__class__
Michael Foord345266a2012-03-14 12:24:34 -07002716
2717 for klass in spec.__mro__:
2718 result = klass.__dict__.get(entry, DEFAULT)
2719 if result is DEFAULT:
2720 continue
2721 if isinstance(result, (staticmethod, classmethod)):
2722 return False
Carl Friedrich Bolz-Tereicka3276772020-01-29 16:43:37 +01002723 elif isinstance(result, FunctionTypes):
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002724 # Normal method => skip if looked up on type
2725 # (if looked up on instance, self is already skipped)
2726 return is_type
2727 else:
2728 return False
Michael Foord345266a2012-03-14 12:24:34 -07002729
Chris Withersadbf1782019-05-01 23:04:04 +01002730 # function is a dynamically provided attribute
Michael Foord345266a2012-03-14 12:24:34 -07002731 return is_type
2732
2733
Michael Foord345266a2012-03-14 12:24:34 -07002734class _SpecState(object):
2735
2736 def __init__(self, spec, spec_set=False, parent=None,
2737 name=None, ids=None, instance=False):
2738 self.spec = spec
2739 self.ids = ids
2740 self.spec_set = spec_set
2741 self.parent = parent
2742 self.instance = instance
2743 self.name = name
2744
2745
2746FunctionTypes = (
2747 # python function
2748 type(create_autospec),
2749 # instance method
2750 type(ANY.__eq__),
Michael Foord345266a2012-03-14 12:24:34 -07002751)
2752
Michael Foord345266a2012-03-14 12:24:34 -07002753
Michael Foorda74561a2012-03-25 19:03:13 +01002754file_spec = None
Michael Foord345266a2012-03-14 12:24:34 -07002755
Michael Foord04cbe0c2013-03-19 17:22:51 -07002756
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002757def _to_stream(read_data):
2758 if isinstance(read_data, bytes):
2759 return io.BytesIO(read_data)
Michael Foord04cbe0c2013-03-19 17:22:51 -07002760 else:
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002761 return io.StringIO(read_data)
Michael Foord0dccf652012-03-25 19:11:50 +01002762
Robert Collins5329aaa2015-07-17 20:08:45 +12002763
Michael Foord0dccf652012-03-25 19:11:50 +01002764def mock_open(mock=None, read_data=''):
Michael Foord99254732012-03-25 19:07:33 +01002765 """
2766 A helper function to create a mock to replace the use of `open`. It works
2767 for `open` called directly or used as a context manager.
2768
2769 The `mock` argument is the mock object to configure. If `None` (the
2770 default) then a `MagicMock` will be created for you, with the API limited
2771 to methods or attributes available on standard file handles.
2772
Xtreak71f82a22018-12-20 21:30:21 +05302773 `read_data` is a string for the `read`, `readline` and `readlines` of the
Michael Foord04cbe0c2013-03-19 17:22:51 -07002774 file handle to return. This is an empty string by default.
Michael Foord99254732012-03-25 19:07:33 +01002775 """
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002776 _read_data = _to_stream(read_data)
2777 _state = [_read_data, None]
2778
Robert Collinsca647ef2015-07-24 03:48:20 +12002779 def _readlines_side_effect(*args, **kwargs):
2780 if handle.readlines.return_value is not None:
2781 return handle.readlines.return_value
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002782 return _state[0].readlines(*args, **kwargs)
Robert Collinsca647ef2015-07-24 03:48:20 +12002783
2784 def _read_side_effect(*args, **kwargs):
2785 if handle.read.return_value is not None:
2786 return handle.read.return_value
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002787 return _state[0].read(*args, **kwargs)
Robert Collinsca647ef2015-07-24 03:48:20 +12002788
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002789 def _readline_side_effect(*args, **kwargs):
Tony Flury20870232018-09-12 23:21:16 +01002790 yield from _iter_side_effect()
2791 while True:
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002792 yield _state[0].readline(*args, **kwargs)
Tony Flury20870232018-09-12 23:21:16 +01002793
2794 def _iter_side_effect():
Robert Collinsca647ef2015-07-24 03:48:20 +12002795 if handle.readline.return_value is not None:
2796 while True:
2797 yield handle.readline.return_value
2798 for line in _state[0]:
2799 yield line
Robert Collinsca647ef2015-07-24 03:48:20 +12002800
Damien Nadé394119a2019-05-23 12:03:25 +02002801 def _next_side_effect():
2802 if handle.readline.return_value is not None:
2803 return handle.readline.return_value
2804 return next(_state[0])
2805
Michael Foorda74561a2012-03-25 19:03:13 +01002806 global file_spec
2807 if file_spec is None:
2808 import _io
2809 file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO))))
2810
Michael Foord345266a2012-03-14 12:24:34 -07002811 if mock is None:
Michael Foord0dccf652012-03-25 19:11:50 +01002812 mock = MagicMock(name='open', spec=open)
Michael Foord345266a2012-03-14 12:24:34 -07002813
Robert Collinsca647ef2015-07-24 03:48:20 +12002814 handle = MagicMock(spec=file_spec)
2815 handle.__enter__.return_value = handle
Michael Foord04cbe0c2013-03-19 17:22:51 -07002816
Robert Collinsca647ef2015-07-24 03:48:20 +12002817 handle.write.return_value = None
2818 handle.read.return_value = None
2819 handle.readline.return_value = None
2820 handle.readlines.return_value = None
Michael Foord04cbe0c2013-03-19 17:22:51 -07002821
Robert Collinsca647ef2015-07-24 03:48:20 +12002822 handle.read.side_effect = _read_side_effect
2823 _state[1] = _readline_side_effect()
2824 handle.readline.side_effect = _state[1]
2825 handle.readlines.side_effect = _readlines_side_effect
Tony Flury20870232018-09-12 23:21:16 +01002826 handle.__iter__.side_effect = _iter_side_effect
Damien Nadé394119a2019-05-23 12:03:25 +02002827 handle.__next__.side_effect = _next_side_effect
Michael Foord345266a2012-03-14 12:24:34 -07002828
Robert Collinsca647ef2015-07-24 03:48:20 +12002829 def reset_data(*args, **kwargs):
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002830 _state[0] = _to_stream(read_data)
Robert Collinsca647ef2015-07-24 03:48:20 +12002831 if handle.readline.side_effect == _state[1]:
2832 # Only reset the side effect if the user hasn't overridden it.
2833 _state[1] = _readline_side_effect()
2834 handle.readline.side_effect = _state[1]
2835 return DEFAULT
Robert Collins5329aaa2015-07-17 20:08:45 +12002836
Robert Collinsca647ef2015-07-24 03:48:20 +12002837 mock.side_effect = reset_data
2838 mock.return_value = handle
Michael Foord345266a2012-03-14 12:24:34 -07002839 return mock
2840
2841
2842class PropertyMock(Mock):
Michael Foord99254732012-03-25 19:07:33 +01002843 """
2844 A mock intended to be used as a property, or other descriptor, on a class.
2845 `PropertyMock` provides `__get__` and `__set__` methods so you can specify
2846 a return value when it is fetched.
2847
2848 Fetching a `PropertyMock` instance from an object calls the mock, with
2849 no args. Setting it calls the mock with the value being set.
2850 """
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002851 def _get_child_mock(self, /, **kwargs):
Michael Foordc2870622012-04-13 16:57:22 +01002852 return MagicMock(**kwargs)
2853
Raymond Hettinger0dac68f2019-08-29 01:27:42 -07002854 def __get__(self, obj, obj_type=None):
Michael Foord345266a2012-03-14 12:24:34 -07002855 return self()
2856 def __set__(self, obj, val):
2857 self(val)
Mario Corchero552be9d2017-10-17 12:35:11 +01002858
2859
2860def seal(mock):
Mario Corchero96200eb2018-10-19 22:57:37 +01002861 """Disable the automatic generation of child mocks.
Mario Corchero552be9d2017-10-17 12:35:11 +01002862
2863 Given an input Mock, seals it to ensure no further mocks will be generated
2864 when accessing an attribute that was not already defined.
2865
Mario Corchero96200eb2018-10-19 22:57:37 +01002866 The operation recursively seals the mock passed in, meaning that
2867 the mock itself, any mocks generated by accessing one of its attributes,
2868 and all assigned mocks without a name or spec will be sealed.
Mario Corchero552be9d2017-10-17 12:35:11 +01002869 """
2870 mock._mock_sealed = True
2871 for attr in dir(mock):
2872 try:
2873 m = getattr(mock, attr)
2874 except AttributeError:
2875 continue
2876 if not isinstance(m, NonCallableMock):
2877 continue
2878 if m._mock_new_parent is mock:
2879 seal(m)
Lisa Roach77b3b772019-05-20 09:19:53 -07002880
2881
Lisa Roach77b3b772019-05-20 09:19:53 -07002882class _AsyncIterator:
2883 """
2884 Wraps an iterator in an asynchronous iterator.
2885 """
2886 def __init__(self, iterator):
2887 self.iterator = iterator
2888 code_mock = NonCallableMock(spec_set=CodeType)
2889 code_mock.co_flags = inspect.CO_ITERABLE_COROUTINE
2890 self.__dict__['__code__'] = code_mock
2891
Lisa Roach77b3b772019-05-20 09:19:53 -07002892 async def __anext__(self):
2893 try:
2894 return next(self.iterator)
2895 except StopIteration:
2896 pass
2897 raise StopAsyncIteration