blob: 0c7545bd2b7f4704fb6168e86410892946ec5adb [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
26__version__ = '1.0'
27
Lisa Roach77b3b772019-05-20 09:19:53 -070028import asyncio
Xtreak436c2b02019-05-28 12:37:39 +053029import contextlib
Rémi Lapeyre11a88322019-05-07 12:48:36 +020030import io
Michael Foord345266a2012-03-14 12:24:34 -070031import inspect
32import pprint
33import sys
Michael Foordfddcfa22014-04-14 16:25:20 -040034import builtins
Lisa Roach77b3b772019-05-20 09:19:53 -070035from types import CodeType, ModuleType, MethodType
Petter Strandmark47d94242018-10-28 21:37:10 +010036from unittest.util import safe_repr
Antoine Pitrou5c64df72013-02-03 00:23:58 +010037from functools import wraps, partial
Michael Foord345266a2012-03-14 12:24:34 -070038
39
Michael Foordfddcfa22014-04-14 16:25:20 -040040_builtins = {name for name in dir(builtins) if not name.startswith('_')}
41
Michael Foord345266a2012-03-14 12:24:34 -070042FILTER_DIR = True
43
Nick Coghlan0b43bcf2012-05-27 18:17:07 +100044# Workaround for issue #12370
45# Without this, the __class__ properties wouldn't be set correctly
46_safe_super = super
Michael Foord345266a2012-03-14 12:24:34 -070047
Lisa Roach77b3b772019-05-20 09:19:53 -070048def _is_async_obj(obj):
Miss Islington (bot)c3008dd2019-09-10 06:16:00 -070049 if _is_instance_mock(obj) and not isinstance(obj, AsyncMock):
Lisa Roach77b3b772019-05-20 09:19:53 -070050 return False
Miss Islington (bot)c3008dd2019-09-10 06:16:00 -070051 return asyncio.iscoroutinefunction(obj) or inspect.isawaitable(obj)
Lisa Roach77b3b772019-05-20 09:19:53 -070052
53
Xtreakff6b2e62019-05-27 18:26:23 +053054def _is_async_func(func):
55 if getattr(func, '__code__', None):
56 return asyncio.iscoroutinefunction(func)
57 else:
58 return False
59
60
Michael Foord345266a2012-03-14 12:24:34 -070061def _is_instance_mock(obj):
62 # can't use isinstance on Mock objects because they override __class__
63 # The base class for all mocks is NonCallableMock
64 return issubclass(type(obj), NonCallableMock)
65
66
67def _is_exception(obj):
68 return (
Chris Withers49e27f02019-05-01 08:48:44 +010069 isinstance(obj, BaseException) or
70 isinstance(obj, type) and issubclass(obj, BaseException)
Michael Foord345266a2012-03-14 12:24:34 -070071 )
72
73
Miss Islington (bot)22fd6792019-07-22 00:59:00 -070074def _extract_mock(obj):
75 # Autospecced functions will return a FunctionType with "mock" attribute
76 # which is the actual mock object that needs to be used.
77 if isinstance(obj, FunctionTypes) and hasattr(obj, 'mock'):
78 return obj.mock
79 else:
80 return obj
81
82
Antoine Pitrou5c64df72013-02-03 00:23:58 +010083def _get_signature_object(func, as_instance, eat_self):
84 """
85 Given an arbitrary, possibly callable object, try to create a suitable
86 signature object.
87 Return a (reduced func, signature) tuple, or None.
88 """
89 if isinstance(func, type) and not as_instance:
90 # If it's a type and should be modelled as a type, use __init__.
Chris Withersadbf1782019-05-01 23:04:04 +010091 func = func.__init__
Antoine Pitrou5c64df72013-02-03 00:23:58 +010092 # Skip the `self` argument in __init__
93 eat_self = True
Michael Foord345266a2012-03-14 12:24:34 -070094 elif not isinstance(func, FunctionTypes):
Antoine Pitrou5c64df72013-02-03 00:23:58 +010095 # If we really want to model an instance of the passed type,
96 # __call__ should be looked up, not __init__.
Michael Foord345266a2012-03-14 12:24:34 -070097 try:
98 func = func.__call__
99 except AttributeError:
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100100 return None
101 if eat_self:
102 sig_func = partial(func, None)
103 else:
104 sig_func = func
Michael Foord345266a2012-03-14 12:24:34 -0700105 try:
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100106 return func, inspect.signature(sig_func)
107 except ValueError:
108 # Certain callable types are not supported by inspect.signature()
109 return None
Michael Foord345266a2012-03-14 12:24:34 -0700110
111
112def _check_signature(func, mock, skipfirst, instance=False):
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100113 sig = _get_signature_object(func, instance, skipfirst)
114 if sig is None:
Michael Foord345266a2012-03-14 12:24:34 -0700115 return
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100116 func, sig = sig
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300117 def checksig(self, /, *args, **kwargs):
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100118 sig.bind(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700119 _copy_func_details(func, checksig)
120 type(mock)._mock_check_sig = checksig
Xtreakf7fa62e2018-12-12 13:24:54 +0530121 type(mock).__signature__ = sig
Michael Foord345266a2012-03-14 12:24:34 -0700122
123
124def _copy_func_details(func, funcopy):
Michael Foord345266a2012-03-14 12:24:34 -0700125 # we explicitly don't copy func.__dict__ into this copy as it would
126 # expose original attributes that should be mocked
Berker Peksag161a4dd2016-12-15 05:21:44 +0300127 for attribute in (
128 '__name__', '__doc__', '__text_signature__',
129 '__module__', '__defaults__', '__kwdefaults__',
130 ):
131 try:
132 setattr(funcopy, attribute, getattr(func, attribute))
133 except AttributeError:
134 pass
Michael Foord345266a2012-03-14 12:24:34 -0700135
136
137def _callable(obj):
138 if isinstance(obj, type):
139 return True
Xtreak9b218562019-04-22 08:00:23 +0530140 if isinstance(obj, (staticmethod, classmethod, MethodType)):
141 return _callable(obj.__func__)
Michael Foord345266a2012-03-14 12:24:34 -0700142 if getattr(obj, '__call__', None) is not None:
143 return True
144 return False
145
146
147def _is_list(obj):
148 # checks for list or tuples
149 # XXXX badly named!
150 return type(obj) in (list, tuple)
151
152
153def _instance_callable(obj):
154 """Given an object, return True if the object is callable.
155 For classes, return True if instances would be callable."""
156 if not isinstance(obj, type):
157 # already an instance
158 return getattr(obj, '__call__', None) is not None
159
Michael Foorda74b3aa2012-03-14 14:40:22 -0700160 # *could* be broken by a class overriding __mro__ or __dict__ via
161 # a metaclass
162 for base in (obj,) + obj.__mro__:
163 if base.__dict__.get('__call__') is not None:
Michael Foord345266a2012-03-14 12:24:34 -0700164 return True
165 return False
166
167
168def _set_signature(mock, original, instance=False):
169 # creates a function with signature (*args, **kwargs) that delegates to a
170 # mock. It still does signature checking by calling a lambda with the same
171 # signature as the original.
Michael Foord345266a2012-03-14 12:24:34 -0700172
173 skipfirst = isinstance(original, type)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100174 result = _get_signature_object(original, instance, skipfirst)
Michael Foord345266a2012-03-14 12:24:34 -0700175 if result is None:
Aaron Gallagher856cbcc2017-07-19 17:01:14 -0700176 return mock
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100177 func, sig = result
178 def checksig(*args, **kwargs):
179 sig.bind(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700180 _copy_func_details(func, checksig)
181
182 name = original.__name__
183 if not name.isidentifier():
184 name = 'funcopy'
Michael Foord313f85f2012-03-25 18:16:07 +0100185 context = {'_checksig_': checksig, 'mock': mock}
Michael Foord345266a2012-03-14 12:24:34 -0700186 src = """def %s(*args, **kwargs):
Michael Foord313f85f2012-03-25 18:16:07 +0100187 _checksig_(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700188 return mock(*args, **kwargs)""" % name
189 exec (src, context)
190 funcopy = context[name]
Xtreakf7fa62e2018-12-12 13:24:54 +0530191 _setup_func(funcopy, mock, sig)
Michael Foord345266a2012-03-14 12:24:34 -0700192 return funcopy
193
194
Xtreakf7fa62e2018-12-12 13:24:54 +0530195def _setup_func(funcopy, mock, sig):
Michael Foord345266a2012-03-14 12:24:34 -0700196 funcopy.mock = mock
197
Michael Foord345266a2012-03-14 12:24:34 -0700198 def assert_called_with(*args, **kwargs):
199 return mock.assert_called_with(*args, **kwargs)
Gregory P. Smithac5084b2016-10-06 14:31:23 -0700200 def assert_called(*args, **kwargs):
201 return mock.assert_called(*args, **kwargs)
202 def assert_not_called(*args, **kwargs):
203 return mock.assert_not_called(*args, **kwargs)
204 def assert_called_once(*args, **kwargs):
205 return mock.assert_called_once(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700206 def assert_called_once_with(*args, **kwargs):
207 return mock.assert_called_once_with(*args, **kwargs)
208 def assert_has_calls(*args, **kwargs):
209 return mock.assert_has_calls(*args, **kwargs)
210 def assert_any_call(*args, **kwargs):
211 return mock.assert_any_call(*args, **kwargs)
212 def reset_mock():
213 funcopy.method_calls = _CallList()
214 funcopy.mock_calls = _CallList()
215 mock.reset_mock()
216 ret = funcopy.return_value
217 if _is_instance_mock(ret) and not ret is mock:
218 ret.reset_mock()
219
220 funcopy.called = False
221 funcopy.call_count = 0
222 funcopy.call_args = None
223 funcopy.call_args_list = _CallList()
224 funcopy.method_calls = _CallList()
225 funcopy.mock_calls = _CallList()
226
227 funcopy.return_value = mock.return_value
228 funcopy.side_effect = mock.side_effect
229 funcopy._mock_children = mock._mock_children
230
231 funcopy.assert_called_with = assert_called_with
232 funcopy.assert_called_once_with = assert_called_once_with
233 funcopy.assert_has_calls = assert_has_calls
234 funcopy.assert_any_call = assert_any_call
235 funcopy.reset_mock = reset_mock
Gregory P. Smithac5084b2016-10-06 14:31:23 -0700236 funcopy.assert_called = assert_called
237 funcopy.assert_not_called = assert_not_called
238 funcopy.assert_called_once = assert_called_once
Xtreakf7fa62e2018-12-12 13:24:54 +0530239 funcopy.__signature__ = sig
Michael Foord345266a2012-03-14 12:24:34 -0700240
241 mock._mock_delegate = funcopy
242
243
Xtreakff6b2e62019-05-27 18:26:23 +0530244def _setup_async_mock(mock):
245 mock._is_coroutine = asyncio.coroutines._is_coroutine
246 mock.await_count = 0
247 mock.await_args = None
248 mock.await_args_list = _CallList()
249 mock.awaited = _AwaitEvent(mock)
250
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):
Miss Islington (bot)22fd6792019-07-22 00:59:00 -0700357 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,)
405 if not issubclass(cls, AsyncMock):
406 # Check if spec is an async object or function
407 sig = inspect.signature(NonCallableMock.__init__)
408 bound_args = sig.bind_partial(cls, *args, **kw).arguments
409 spec_arg = [
410 arg for arg in bound_args.keys()
411 if arg.startswith('spec')
412 ]
413 if spec_arg:
414 # what if spec_set is different than spec?
415 if _is_async_obj(bound_args[spec_arg[0]]):
416 bases = (AsyncMockMixin, cls,)
417 new = type(cls.__name__, bases, {'__doc__': cls.__doc__})
Michael Foord345266a2012-03-14 12:24:34 -0700418 instance = object.__new__(new)
419 return instance
420
421
422 def __init__(
423 self, spec=None, wraps=None, name=None, spec_set=None,
424 parent=None, _spec_state=None, _new_name='', _new_parent=None,
Kushal Das8c145342014-04-16 23:32:21 +0530425 _spec_as_instance=False, _eat_self=None, unsafe=False, **kwargs
Michael Foord345266a2012-03-14 12:24:34 -0700426 ):
427 if _new_parent is None:
428 _new_parent = parent
429
430 __dict__ = self.__dict__
431 __dict__['_mock_parent'] = parent
432 __dict__['_mock_name'] = name
433 __dict__['_mock_new_name'] = _new_name
434 __dict__['_mock_new_parent'] = _new_parent
Mario Corchero552be9d2017-10-17 12:35:11 +0100435 __dict__['_mock_sealed'] = False
Michael Foord345266a2012-03-14 12:24:34 -0700436
437 if spec_set is not None:
438 spec = spec_set
439 spec_set = True
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100440 if _eat_self is None:
441 _eat_self = parent is not None
Michael Foord345266a2012-03-14 12:24:34 -0700442
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100443 self._mock_add_spec(spec, spec_set, _spec_as_instance, _eat_self)
Michael Foord345266a2012-03-14 12:24:34 -0700444
445 __dict__['_mock_children'] = {}
446 __dict__['_mock_wraps'] = wraps
447 __dict__['_mock_delegate'] = None
448
449 __dict__['_mock_called'] = False
450 __dict__['_mock_call_args'] = None
451 __dict__['_mock_call_count'] = 0
452 __dict__['_mock_call_args_list'] = _CallList()
453 __dict__['_mock_mock_calls'] = _CallList()
454
455 __dict__['method_calls'] = _CallList()
Kushal Das8c145342014-04-16 23:32:21 +0530456 __dict__['_mock_unsafe'] = unsafe
Michael Foord345266a2012-03-14 12:24:34 -0700457
458 if kwargs:
459 self.configure_mock(**kwargs)
460
Nick Coghlan0b43bcf2012-05-27 18:17:07 +1000461 _safe_super(NonCallableMock, self).__init__(
Michael Foord345266a2012-03-14 12:24:34 -0700462 spec, wraps, name, spec_set, parent,
463 _spec_state
464 )
465
466
467 def attach_mock(self, mock, attribute):
468 """
469 Attach a mock as an attribute of this one, replacing its name and
470 parent. Calls to the attached mock will be recorded in the
471 `method_calls` and `mock_calls` attributes of this one."""
Miss Islington (bot)22fd6792019-07-22 00:59:00 -0700472 inner_mock = _extract_mock(mock)
473
474 inner_mock._mock_parent = None
475 inner_mock._mock_new_parent = None
476 inner_mock._mock_name = ''
477 inner_mock._mock_new_name = None
Michael Foord345266a2012-03-14 12:24:34 -0700478
479 setattr(self, attribute, mock)
480
481
482 def mock_add_spec(self, spec, spec_set=False):
483 """Add a spec to a mock. `spec` can either be an object or a
484 list of strings. Only attributes on the `spec` can be fetched as
485 attributes from the mock.
486
487 If `spec_set` is True then only attributes on the spec can be set."""
488 self._mock_add_spec(spec, spec_set)
489
490
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100491 def _mock_add_spec(self, spec, spec_set, _spec_as_instance=False,
492 _eat_self=False):
Michael Foord345266a2012-03-14 12:24:34 -0700493 _spec_class = None
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100494 _spec_signature = None
Lisa Roach77b3b772019-05-20 09:19:53 -0700495 _spec_asyncs = []
496
497 for attr in dir(spec):
498 if asyncio.iscoroutinefunction(getattr(spec, attr, None)):
499 _spec_asyncs.append(attr)
Michael Foord345266a2012-03-14 12:24:34 -0700500
501 if spec is not None and not _is_list(spec):
502 if isinstance(spec, type):
503 _spec_class = spec
504 else:
Chris Withersadbf1782019-05-01 23:04:04 +0100505 _spec_class = type(spec)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100506 res = _get_signature_object(spec,
507 _spec_as_instance, _eat_self)
508 _spec_signature = res and res[1]
Michael Foord345266a2012-03-14 12:24:34 -0700509
510 spec = dir(spec)
511
512 __dict__ = self.__dict__
513 __dict__['_spec_class'] = _spec_class
514 __dict__['_spec_set'] = spec_set
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100515 __dict__['_spec_signature'] = _spec_signature
Michael Foord345266a2012-03-14 12:24:34 -0700516 __dict__['_mock_methods'] = spec
Lisa Roach77b3b772019-05-20 09:19:53 -0700517 __dict__['_spec_asyncs'] = _spec_asyncs
Michael Foord345266a2012-03-14 12:24:34 -0700518
519 def __get_return_value(self):
520 ret = self._mock_return_value
521 if self._mock_delegate is not None:
522 ret = self._mock_delegate.return_value
523
524 if ret is DEFAULT:
525 ret = self._get_child_mock(
526 _new_parent=self, _new_name='()'
527 )
528 self.return_value = ret
529 return ret
530
531
532 def __set_return_value(self, value):
533 if self._mock_delegate is not None:
534 self._mock_delegate.return_value = value
535 else:
536 self._mock_return_value = value
537 _check_and_set_parent(self, value, None, '()')
538
539 __return_value_doc = "The value to be returned when the mock is called."
540 return_value = property(__get_return_value, __set_return_value,
541 __return_value_doc)
542
543
544 @property
545 def __class__(self):
546 if self._spec_class is None:
547 return type(self)
548 return self._spec_class
549
550 called = _delegating_property('called')
551 call_count = _delegating_property('call_count')
552 call_args = _delegating_property('call_args')
553 call_args_list = _delegating_property('call_args_list')
554 mock_calls = _delegating_property('mock_calls')
555
556
557 def __get_side_effect(self):
558 delegated = self._mock_delegate
559 if delegated is None:
560 return self._mock_side_effect
Michael Foord01bafdc2014-04-14 16:09:42 -0400561 sf = delegated.side_effect
Robert Collinsf58f88c2015-07-14 13:51:40 +1200562 if (sf is not None and not callable(sf)
563 and not isinstance(sf, _MockIter) and not _is_exception(sf)):
Michael Foord01bafdc2014-04-14 16:09:42 -0400564 sf = _MockIter(sf)
565 delegated.side_effect = sf
566 return sf
Michael Foord345266a2012-03-14 12:24:34 -0700567
568 def __set_side_effect(self, value):
569 value = _try_iter(value)
570 delegated = self._mock_delegate
571 if delegated is None:
572 self._mock_side_effect = value
573 else:
574 delegated.side_effect = value
575
576 side_effect = property(__get_side_effect, __set_side_effect)
577
578
Kushal Das9cd39a12016-06-02 10:20:16 -0700579 def reset_mock(self, visited=None,*, return_value=False, side_effect=False):
Michael Foord345266a2012-03-14 12:24:34 -0700580 "Restore the mock object to its initial state."
Robert Collinsb37f43f2015-07-15 11:42:28 +1200581 if visited is None:
582 visited = []
583 if id(self) in visited:
584 return
585 visited.append(id(self))
586
Michael Foord345266a2012-03-14 12:24:34 -0700587 self.called = False
588 self.call_args = None
589 self.call_count = 0
590 self.mock_calls = _CallList()
591 self.call_args_list = _CallList()
592 self.method_calls = _CallList()
593
Kushal Das9cd39a12016-06-02 10:20:16 -0700594 if return_value:
595 self._mock_return_value = DEFAULT
596 if side_effect:
597 self._mock_side_effect = None
598
Michael Foord345266a2012-03-14 12:24:34 -0700599 for child in self._mock_children.values():
Xtreakedeca922018-12-01 15:33:54 +0530600 if isinstance(child, _SpecState) or child is _deleted:
Michael Foord75963642012-06-09 17:31:59 +0100601 continue
Robert Collinsb37f43f2015-07-15 11:42:28 +1200602 child.reset_mock(visited)
Michael Foord345266a2012-03-14 12:24:34 -0700603
604 ret = self._mock_return_value
605 if _is_instance_mock(ret) and ret is not self:
Robert Collinsb37f43f2015-07-15 11:42:28 +1200606 ret.reset_mock(visited)
Michael Foord345266a2012-03-14 12:24:34 -0700607
608
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300609 def configure_mock(self, /, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -0700610 """Set attributes on the mock through keyword arguments.
611
612 Attributes plus return values and side effects can be set on child
613 mocks using standard dot notation and unpacking a dictionary in the
614 method call:
615
616 >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
617 >>> mock.configure_mock(**attrs)"""
618 for arg, val in sorted(kwargs.items(),
619 # we sort on the number of dots so that
620 # attributes are set before we set attributes on
621 # attributes
622 key=lambda entry: entry[0].count('.')):
623 args = arg.split('.')
624 final = args.pop()
625 obj = self
626 for entry in args:
627 obj = getattr(obj, entry)
628 setattr(obj, final, val)
629
630
631 def __getattr__(self, name):
Kushal Das8c145342014-04-16 23:32:21 +0530632 if name in {'_mock_methods', '_mock_unsafe'}:
Michael Foord345266a2012-03-14 12:24:34 -0700633 raise AttributeError(name)
634 elif self._mock_methods is not None:
635 if name not in self._mock_methods or name in _all_magics:
636 raise AttributeError("Mock object has no attribute %r" % name)
637 elif _is_magic(name):
638 raise AttributeError(name)
Kushal Das8c145342014-04-16 23:32:21 +0530639 if not self._mock_unsafe:
640 if name.startswith(('assert', 'assret')):
Zackery Spytzb9b08cd2019-05-08 11:32:24 -0600641 raise AttributeError("Attributes cannot start with 'assert' "
642 "or 'assret'")
Michael Foord345266a2012-03-14 12:24:34 -0700643
644 result = self._mock_children.get(name)
645 if result is _deleted:
646 raise AttributeError(name)
647 elif result is None:
648 wraps = None
649 if self._mock_wraps is not None:
650 # XXXX should we get the attribute without triggering code
651 # execution?
652 wraps = getattr(self._mock_wraps, name)
653
654 result = self._get_child_mock(
655 parent=self, name=name, wraps=wraps, _new_name=name,
656 _new_parent=self
657 )
658 self._mock_children[name] = result
659
660 elif isinstance(result, _SpecState):
661 result = create_autospec(
662 result.spec, result.spec_set, result.instance,
663 result.parent, result.name
664 )
665 self._mock_children[name] = result
666
667 return result
668
669
Mario Corchero552be9d2017-10-17 12:35:11 +0100670 def _extract_mock_name(self):
Michael Foord345266a2012-03-14 12:24:34 -0700671 _name_list = [self._mock_new_name]
672 _parent = self._mock_new_parent
673 last = self
674
675 dot = '.'
676 if _name_list == ['()']:
677 dot = ''
Chris Withersadbf1782019-05-01 23:04:04 +0100678
Michael Foord345266a2012-03-14 12:24:34 -0700679 while _parent is not None:
680 last = _parent
681
682 _name_list.append(_parent._mock_new_name + dot)
683 dot = '.'
684 if _parent._mock_new_name == '()':
685 dot = ''
686
687 _parent = _parent._mock_new_parent
688
Michael Foord345266a2012-03-14 12:24:34 -0700689 _name_list = list(reversed(_name_list))
690 _first = last._mock_name or 'mock'
691 if len(_name_list) > 1:
692 if _name_list[1] not in ('()', '().'):
693 _first += '.'
694 _name_list[0] = _first
Mario Corchero552be9d2017-10-17 12:35:11 +0100695 return ''.join(_name_list)
696
697 def __repr__(self):
698 name = self._extract_mock_name()
Michael Foord345266a2012-03-14 12:24:34 -0700699
700 name_string = ''
701 if name not in ('mock', 'mock.'):
702 name_string = ' name=%r' % name
703
704 spec_string = ''
705 if self._spec_class is not None:
706 spec_string = ' spec=%r'
707 if self._spec_set:
708 spec_string = ' spec_set=%r'
709 spec_string = spec_string % self._spec_class.__name__
710 return "<%s%s%s id='%s'>" % (
711 type(self).__name__,
712 name_string,
713 spec_string,
714 id(self)
715 )
716
717
718 def __dir__(self):
Michael Foordd7c65e22012-03-14 14:56:54 -0700719 """Filter the output of `dir(mock)` to only useful members."""
Michael Foord313f85f2012-03-25 18:16:07 +0100720 if not FILTER_DIR:
721 return object.__dir__(self)
722
Michael Foord345266a2012-03-14 12:24:34 -0700723 extras = self._mock_methods or []
724 from_type = dir(type(self))
725 from_dict = list(self.__dict__)
Mario Corchero0df635c2019-04-30 19:56:36 +0100726 from_child_mocks = [
727 m_name for m_name, m_value in self._mock_children.items()
728 if m_value is not _deleted]
Michael Foord345266a2012-03-14 12:24:34 -0700729
Michael Foord313f85f2012-03-25 18:16:07 +0100730 from_type = [e for e in from_type if not e.startswith('_')]
731 from_dict = [e for e in from_dict if not e.startswith('_') or
732 _is_magic(e)]
Mario Corchero0df635c2019-04-30 19:56:36 +0100733 return sorted(set(extras + from_type + from_dict + from_child_mocks))
Michael Foord345266a2012-03-14 12:24:34 -0700734
735
736 def __setattr__(self, name, value):
737 if name in _allowed_names:
738 # property setters go through here
739 return object.__setattr__(self, name, value)
740 elif (self._spec_set and self._mock_methods is not None and
741 name not in self._mock_methods and
742 name not in self.__dict__):
743 raise AttributeError("Mock object has no attribute '%s'" % name)
744 elif name in _unsupported_magics:
745 msg = 'Attempting to set unsupported magic method %r.' % name
746 raise AttributeError(msg)
747 elif name in _all_magics:
748 if self._mock_methods is not None and name not in self._mock_methods:
749 raise AttributeError("Mock object has no attribute '%s'" % name)
750
751 if not _is_instance_mock(value):
752 setattr(type(self), name, _get_method(name, value))
753 original = value
754 value = lambda *args, **kw: original(self, *args, **kw)
755 else:
756 # only set _new_name and not name so that mock_calls is tracked
757 # but not method calls
758 _check_and_set_parent(self, value, None, name)
759 setattr(type(self), name, value)
Michael Foord75963642012-06-09 17:31:59 +0100760 self._mock_children[name] = value
Michael Foord345266a2012-03-14 12:24:34 -0700761 elif name == '__class__':
762 self._spec_class = value
763 return
764 else:
765 if _check_and_set_parent(self, value, name, name):
766 self._mock_children[name] = value
Mario Corchero552be9d2017-10-17 12:35:11 +0100767
768 if self._mock_sealed and not hasattr(self, name):
769 mock_name = f'{self._extract_mock_name()}.{name}'
770 raise AttributeError(f'Cannot set {mock_name}')
771
Michael Foord345266a2012-03-14 12:24:34 -0700772 return object.__setattr__(self, name, value)
773
774
775 def __delattr__(self, name):
776 if name in _all_magics and name in type(self).__dict__:
777 delattr(type(self), name)
778 if name not in self.__dict__:
779 # for magic methods that are still MagicProxy objects and
780 # not set on the instance itself
781 return
782
Michael Foord345266a2012-03-14 12:24:34 -0700783 obj = self._mock_children.get(name, _missing)
Pablo Galindo222d3032019-01-21 08:57:46 +0000784 if name in self.__dict__:
Xtreak830b43d2019-04-14 00:42:33 +0530785 _safe_super(NonCallableMock, self).__delattr__(name)
Pablo Galindo222d3032019-01-21 08:57:46 +0000786 elif obj is _deleted:
Michael Foord345266a2012-03-14 12:24:34 -0700787 raise AttributeError(name)
788 if obj is not _missing:
789 del self._mock_children[name]
790 self._mock_children[name] = _deleted
791
792
Michael Foord345266a2012-03-14 12:24:34 -0700793 def _format_mock_call_signature(self, args, kwargs):
794 name = self._mock_name or 'mock'
795 return _format_call_signature(name, args, kwargs)
796
797
Xtreak0ae022c2019-05-29 12:32:26 +0530798 def _format_mock_failure_message(self, args, kwargs, action='call'):
799 message = 'expected %s not found.\nExpected: %s\nActual: %s'
Michael Foord345266a2012-03-14 12:24:34 -0700800 expected_string = self._format_mock_call_signature(args, kwargs)
801 call_args = self.call_args
Michael Foord345266a2012-03-14 12:24:34 -0700802 actual_string = self._format_mock_call_signature(*call_args)
Xtreak0ae022c2019-05-29 12:32:26 +0530803 return message % (action, expected_string, actual_string)
Michael Foord345266a2012-03-14 12:24:34 -0700804
805
Miss Islington (bot)38d311d2019-08-28 23:58:27 -0700806 def _get_call_signature_from_name(self, name):
807 """
808 * If call objects are asserted against a method/function like obj.meth1
809 then there could be no name for the call object to lookup. Hence just
810 return the spec_signature of the method/function being asserted against.
811 * If the name is not empty then remove () and split by '.' to get
812 list of names to iterate through the children until a potential
813 match is found. A child mock is created only during attribute access
814 so if we get a _SpecState then no attributes of the spec were accessed
815 and can be safely exited.
816 """
817 if not name:
818 return self._spec_signature
819
820 sig = None
821 names = name.replace('()', '').split('.')
822 children = self._mock_children
823
824 for name in names:
825 child = children.get(name)
826 if child is None or isinstance(child, _SpecState):
827 break
828 else:
829 children = child._mock_children
830 sig = child._spec_signature
831
832 return sig
833
834
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100835 def _call_matcher(self, _call):
836 """
Martin Panter204bf0b2016-07-11 07:51:37 +0000837 Given a call (or simply an (args, kwargs) tuple), return a
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100838 comparison key suitable for matching with other calls.
839 This is a best effort method which relies on the spec's signature,
840 if available, or falls back on the arguments themselves.
841 """
Miss Islington (bot)38d311d2019-08-28 23:58:27 -0700842
843 if isinstance(_call, tuple) and len(_call) > 2:
844 sig = self._get_call_signature_from_name(_call[0])
845 else:
846 sig = self._spec_signature
847
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100848 if sig is not None:
849 if len(_call) == 2:
850 name = ''
851 args, kwargs = _call
852 else:
853 name, args, kwargs = _call
854 try:
855 return name, sig.bind(*args, **kwargs)
856 except TypeError as e:
857 return e.with_traceback(None)
858 else:
859 return _call
860
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300861 def assert_not_called(self):
Kushal Das8af9db32014-04-17 01:36:14 +0530862 """assert that the mock was never called.
863 """
Kushal Das8af9db32014-04-17 01:36:14 +0530864 if self.call_count != 0:
Petter Strandmark47d94242018-10-28 21:37:10 +0100865 msg = ("Expected '%s' to not have been called. Called %s times.%s"
866 % (self._mock_name or 'mock',
867 self.call_count,
868 self._calls_repr()))
Kushal Das8af9db32014-04-17 01:36:14 +0530869 raise AssertionError(msg)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100870
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300871 def assert_called(self):
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100872 """assert that the mock was called at least once
873 """
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100874 if self.call_count == 0:
875 msg = ("Expected '%s' to have been called." %
Miss Islington (bot)f668d2b2019-09-17 04:35:56 -0700876 (self._mock_name or 'mock'))
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100877 raise AssertionError(msg)
878
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300879 def assert_called_once(self):
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100880 """assert that the mock was called only once.
881 """
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100882 if not self.call_count == 1:
Petter Strandmark47d94242018-10-28 21:37:10 +0100883 msg = ("Expected '%s' to have been called once. Called %s times.%s"
884 % (self._mock_name or 'mock',
885 self.call_count,
886 self._calls_repr()))
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100887 raise AssertionError(msg)
888
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300889 def assert_called_with(self, /, *args, **kwargs):
Miss Islington (bot)612d3932019-08-28 23:39:47 -0700890 """assert that the last call was made with the specified arguments.
Michael Foord345266a2012-03-14 12:24:34 -0700891
892 Raises an AssertionError if the args and keyword args passed in are
893 different to the last call to the mock."""
Michael Foord345266a2012-03-14 12:24:34 -0700894 if self.call_args is None:
895 expected = self._format_mock_call_signature(args, kwargs)
Susan Su2bdd5852019-02-13 18:22:29 -0800896 actual = 'not called.'
897 error_message = ('expected call not found.\nExpected: %s\nActual: %s'
898 % (expected, actual))
899 raise AssertionError(error_message)
Michael Foord345266a2012-03-14 12:24:34 -0700900
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100901 def _error_message():
Michael Foord345266a2012-03-14 12:24:34 -0700902 msg = self._format_mock_failure_message(args, kwargs)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100903 return msg
904 expected = self._call_matcher((args, kwargs))
905 actual = self._call_matcher(self.call_args)
906 if expected != actual:
907 cause = expected if isinstance(expected, Exception) else None
908 raise AssertionError(_error_message()) from cause
Michael Foord345266a2012-03-14 12:24:34 -0700909
910
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300911 def assert_called_once_with(self, /, *args, **kwargs):
Arne de Laat324c5d82017-02-23 15:57:25 +0100912 """assert that the mock was called exactly once and that that call was
913 with the specified arguments."""
Michael Foord345266a2012-03-14 12:24:34 -0700914 if not self.call_count == 1:
Petter Strandmark47d94242018-10-28 21:37:10 +0100915 msg = ("Expected '%s' to be called once. Called %s times.%s"
916 % (self._mock_name or 'mock',
917 self.call_count,
918 self._calls_repr()))
Michael Foord345266a2012-03-14 12:24:34 -0700919 raise AssertionError(msg)
920 return self.assert_called_with(*args, **kwargs)
921
922
923 def assert_has_calls(self, calls, any_order=False):
924 """assert the mock has been called with the specified calls.
925 The `mock_calls` list is checked for the calls.
926
927 If `any_order` is False (the default) then the calls must be
928 sequential. There can be extra calls before or after the
929 specified calls.
930
931 If `any_order` is True then the calls can be in any order, but
932 they must all appear in `mock_calls`."""
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100933 expected = [self._call_matcher(c) for c in calls]
934 cause = expected if isinstance(expected, Exception) else None
935 all_calls = _CallList(self._call_matcher(c) for c in self.mock_calls)
Michael Foord345266a2012-03-14 12:24:34 -0700936 if not any_order:
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100937 if expected not in all_calls:
Michael Foord345266a2012-03-14 12:24:34 -0700938 raise AssertionError(
Petter Strandmark47d94242018-10-28 21:37:10 +0100939 'Calls not found.\nExpected: %r%s'
940 % (_CallList(calls), self._calls_repr(prefix="Actual"))
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100941 ) from cause
Michael Foord345266a2012-03-14 12:24:34 -0700942 return
943
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100944 all_calls = list(all_calls)
Michael Foord345266a2012-03-14 12:24:34 -0700945
946 not_found = []
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100947 for kall in expected:
Michael Foord345266a2012-03-14 12:24:34 -0700948 try:
949 all_calls.remove(kall)
950 except ValueError:
951 not_found.append(kall)
952 if not_found:
953 raise AssertionError(
davidair2b32da22018-08-17 15:09:58 -0400954 '%r does not contain all of %r in its call list, '
955 'found %r instead' % (self._mock_name or 'mock',
956 tuple(not_found), all_calls)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100957 ) from cause
Michael Foord345266a2012-03-14 12:24:34 -0700958
959
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300960 def assert_any_call(self, /, *args, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -0700961 """assert the mock has been called with the specified arguments.
962
963 The assert passes if the mock has *ever* been called, unlike
964 `assert_called_with` and `assert_called_once_with` that only pass if
965 the call is the most recent one."""
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100966 expected = self._call_matcher((args, kwargs))
967 actual = [self._call_matcher(c) for c in self.call_args_list]
968 if expected not in actual:
969 cause = expected if isinstance(expected, Exception) else None
Michael Foord345266a2012-03-14 12:24:34 -0700970 expected_string = self._format_mock_call_signature(args, kwargs)
971 raise AssertionError(
972 '%s call not found' % expected_string
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100973 ) from cause
Michael Foord345266a2012-03-14 12:24:34 -0700974
975
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300976 def _get_child_mock(self, /, **kw):
Michael Foord345266a2012-03-14 12:24:34 -0700977 """Create the child mocks for attributes and return value.
978 By default child mocks will be the same type as the parent.
979 Subclasses of Mock may want to override this to customize the way
980 child mocks are made.
981
982 For non-callable mocks the callable variant will be used (rather than
983 any custom subclass)."""
Lisa Roach77b3b772019-05-20 09:19:53 -0700984 _new_name = kw.get("_new_name")
985 if _new_name in self.__dict__['_spec_asyncs']:
986 return AsyncMock(**kw)
987
Michael Foord345266a2012-03-14 12:24:34 -0700988 _type = type(self)
Lisa Roach77b3b772019-05-20 09:19:53 -0700989 if issubclass(_type, MagicMock) and _new_name in _async_method_magics:
990 klass = AsyncMock
Lisa Roach865bb682019-09-20 23:00:04 -0700991 elif _new_name in _sync_async_magics:
992 # Special case these ones b/c users will assume they are async,
993 # but they are actually sync (ie. __aiter__)
Lisa Roach77b3b772019-05-20 09:19:53 -0700994 klass = MagicMock
Lisa Roach865bb682019-09-20 23:00:04 -0700995 elif issubclass(_type, AsyncMockMixin):
996 klass = AsyncMock
997 elif not issubclass(_type, CallableMixin):
Michael Foord345266a2012-03-14 12:24:34 -0700998 if issubclass(_type, NonCallableMagicMock):
999 klass = MagicMock
1000 elif issubclass(_type, NonCallableMock) :
1001 klass = Mock
1002 else:
1003 klass = _type.__mro__[1]
Mario Corchero552be9d2017-10-17 12:35:11 +01001004
1005 if self._mock_sealed:
1006 attribute = "." + kw["name"] if "name" in kw else "()"
1007 mock_name = self._extract_mock_name() + attribute
1008 raise AttributeError(mock_name)
1009
Michael Foord345266a2012-03-14 12:24:34 -07001010 return klass(**kw)
1011
1012
Petter Strandmark47d94242018-10-28 21:37:10 +01001013 def _calls_repr(self, prefix="Calls"):
1014 """Renders self.mock_calls as a string.
1015
1016 Example: "\nCalls: [call(1), call(2)]."
1017
1018 If self.mock_calls is empty, an empty string is returned. The
1019 output will be truncated if very long.
1020 """
1021 if not self.mock_calls:
1022 return ""
1023 return f"\n{prefix}: {safe_repr(self.mock_calls)}."
1024
1025
Michael Foord345266a2012-03-14 12:24:34 -07001026
1027def _try_iter(obj):
1028 if obj is None:
1029 return obj
1030 if _is_exception(obj):
1031 return obj
1032 if _callable(obj):
1033 return obj
1034 try:
1035 return iter(obj)
1036 except TypeError:
1037 # XXXX backwards compatibility
1038 # but this will blow up on first call - so maybe we should fail early?
1039 return obj
1040
1041
Michael Foord345266a2012-03-14 12:24:34 -07001042class CallableMixin(Base):
1043
1044 def __init__(self, spec=None, side_effect=None, return_value=DEFAULT,
1045 wraps=None, name=None, spec_set=None, parent=None,
1046 _spec_state=None, _new_name='', _new_parent=None, **kwargs):
1047 self.__dict__['_mock_return_value'] = return_value
Nick Coghlan0b43bcf2012-05-27 18:17:07 +10001048 _safe_super(CallableMixin, self).__init__(
Michael Foord345266a2012-03-14 12:24:34 -07001049 spec, wraps, name, spec_set, parent,
1050 _spec_state, _new_name, _new_parent, **kwargs
1051 )
1052
1053 self.side_effect = side_effect
1054
1055
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001056 def _mock_check_sig(self, /, *args, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001057 # stub method that can be replaced with one with a specific signature
1058 pass
1059
1060
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001061 def __call__(self, /, *args, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001062 # can't use self in-case a function / method we are mocking uses self
1063 # in the signature
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001064 self._mock_check_sig(*args, **kwargs)
1065 return self._mock_call(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -07001066
1067
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001068 def _mock_call(self, /, *args, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001069 self.called = True
1070 self.call_count += 1
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001071
Chris Withers8ca0fa92018-12-03 21:31:37 +00001072 # handle call_args
Antoine Pitrou5c64df72013-02-03 00:23:58 +01001073 _call = _Call((args, kwargs), two=True)
1074 self.call_args = _call
1075 self.call_args_list.append(_call)
Michael Foord345266a2012-03-14 12:24:34 -07001076
Chris Withers8ca0fa92018-12-03 21:31:37 +00001077 # initial stuff for method_calls:
Michael Foord345266a2012-03-14 12:24:34 -07001078 do_method_calls = self._mock_parent is not None
Chris Withers8ca0fa92018-12-03 21:31:37 +00001079 method_call_name = self._mock_name
1080
1081 # initial stuff for mock_calls:
1082 mock_call_name = self._mock_new_name
1083 is_a_call = mock_call_name == '()'
1084 self.mock_calls.append(_Call(('', args, kwargs)))
1085
1086 # follow up the chain of mocks:
1087 _new_parent = self._mock_new_parent
Michael Foord345266a2012-03-14 12:24:34 -07001088 while _new_parent is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001089
Chris Withers8ca0fa92018-12-03 21:31:37 +00001090 # handle method_calls:
Michael Foord345266a2012-03-14 12:24:34 -07001091 if do_method_calls:
Chris Withers8ca0fa92018-12-03 21:31:37 +00001092 _new_parent.method_calls.append(_Call((method_call_name, args, kwargs)))
Michael Foord345266a2012-03-14 12:24:34 -07001093 do_method_calls = _new_parent._mock_parent is not None
1094 if do_method_calls:
Chris Withers8ca0fa92018-12-03 21:31:37 +00001095 method_call_name = _new_parent._mock_name + '.' + method_call_name
Michael Foord345266a2012-03-14 12:24:34 -07001096
Chris Withers8ca0fa92018-12-03 21:31:37 +00001097 # handle mock_calls:
1098 this_mock_call = _Call((mock_call_name, args, kwargs))
Michael Foord345266a2012-03-14 12:24:34 -07001099 _new_parent.mock_calls.append(this_mock_call)
Chris Withers8ca0fa92018-12-03 21:31:37 +00001100
1101 if _new_parent._mock_new_name:
1102 if is_a_call:
1103 dot = ''
1104 else:
1105 dot = '.'
1106 is_a_call = _new_parent._mock_new_name == '()'
1107 mock_call_name = _new_parent._mock_new_name + dot + mock_call_name
1108
1109 # follow the parental chain:
Michael Foord345266a2012-03-14 12:24:34 -07001110 _new_parent = _new_parent._mock_new_parent
1111
Michael Foord345266a2012-03-14 12:24:34 -07001112 effect = self.side_effect
1113 if effect is not None:
1114 if _is_exception(effect):
1115 raise effect
Mario Corcherof05df0a2018-12-08 11:25:02 +00001116 elif not _callable(effect):
Michael Foord2cd48732012-04-21 15:52:11 +01001117 result = next(effect)
1118 if _is_exception(result):
1119 raise result
Mario Corcherof05df0a2018-12-08 11:25:02 +00001120 else:
1121 result = effect(*args, **kwargs)
1122
1123 if result is not DEFAULT:
Michael Foord2cd48732012-04-21 15:52:11 +01001124 return result
Michael Foord345266a2012-03-14 12:24:34 -07001125
Mario Corcherof05df0a2018-12-08 11:25:02 +00001126 if self._mock_return_value is not DEFAULT:
1127 return self.return_value
Michael Foord345266a2012-03-14 12:24:34 -07001128
Mario Corcherof05df0a2018-12-08 11:25:02 +00001129 if self._mock_wraps is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001130 return self._mock_wraps(*args, **kwargs)
Mario Corcherof05df0a2018-12-08 11:25:02 +00001131
1132 return self.return_value
Michael Foord345266a2012-03-14 12:24:34 -07001133
1134
1135
1136class Mock(CallableMixin, NonCallableMock):
1137 """
1138 Create a new `Mock` object. `Mock` takes several optional arguments
1139 that specify the behaviour of the Mock object:
1140
1141 * `spec`: This can be either a list of strings or an existing object (a
1142 class or instance) that acts as the specification for the mock object. If
1143 you pass in an object then a list of strings is formed by calling dir on
1144 the object (excluding unsupported magic attributes and methods). Accessing
1145 any attribute not in this list will raise an `AttributeError`.
1146
1147 If `spec` is an object (rather than a list of strings) then
1148 `mock.__class__` returns the class of the spec object. This allows mocks
1149 to pass `isinstance` tests.
1150
1151 * `spec_set`: A stricter variant of `spec`. If used, attempting to *set*
1152 or get an attribute on the mock that isn't on the object passed as
1153 `spec_set` will raise an `AttributeError`.
1154
1155 * `side_effect`: A function to be called whenever the Mock is called. See
1156 the `side_effect` attribute. Useful for raising exceptions or
1157 dynamically changing return values. The function is called with the same
1158 arguments as the mock, and unless it returns `DEFAULT`, the return
1159 value of this function is used as the return value.
1160
Michael Foord2cd48732012-04-21 15:52:11 +01001161 If `side_effect` is an iterable then each call to the mock will return
1162 the next value from the iterable. If any of the members of the iterable
1163 are exceptions they will be raised instead of returned.
Michael Foord345266a2012-03-14 12:24:34 -07001164
Michael Foord345266a2012-03-14 12:24:34 -07001165 * `return_value`: The value returned when the mock is called. By default
1166 this is a new Mock (created on first access). See the
1167 `return_value` attribute.
1168
Michael Foord0682a0c2012-04-13 20:51:20 +01001169 * `wraps`: Item for the mock object to wrap. If `wraps` is not None then
1170 calling the Mock will pass the call through to the wrapped object
1171 (returning the real result). Attribute access on the mock will return a
1172 Mock object that wraps the corresponding attribute of the wrapped object
1173 (so attempting to access an attribute that doesn't exist will raise an
1174 `AttributeError`).
Michael Foord345266a2012-03-14 12:24:34 -07001175
1176 If the mock has an explicit `return_value` set then calls are not passed
1177 to the wrapped object and the `return_value` is returned instead.
1178
1179 * `name`: If the mock has a name then it will be used in the repr of the
1180 mock. This can be useful for debugging. The name is propagated to child
1181 mocks.
1182
1183 Mocks can also be called with arbitrary keyword arguments. These will be
1184 used to set attributes on the mock after it is created.
1185 """
1186
1187
Michael Foord345266a2012-03-14 12:24:34 -07001188def _dot_lookup(thing, comp, import_path):
1189 try:
1190 return getattr(thing, comp)
1191 except AttributeError:
1192 __import__(import_path)
1193 return getattr(thing, comp)
1194
1195
1196def _importer(target):
1197 components = target.split('.')
1198 import_path = components.pop(0)
1199 thing = __import__(import_path)
1200
1201 for comp in components:
1202 import_path += ".%s" % comp
1203 thing = _dot_lookup(thing, comp, import_path)
1204 return thing
1205
1206
1207def _is_started(patcher):
1208 # XXXX horrible
1209 return hasattr(patcher, 'is_local')
1210
1211
1212class _patch(object):
1213
1214 attribute_name = None
Michael Foordebc1a302014-04-15 17:21:08 -04001215 _active_patches = []
Michael Foord345266a2012-03-14 12:24:34 -07001216
1217 def __init__(
1218 self, getter, attribute, new, spec, create,
1219 spec_set, autospec, new_callable, kwargs
1220 ):
1221 if new_callable is not None:
1222 if new is not DEFAULT:
1223 raise ValueError(
1224 "Cannot use 'new' and 'new_callable' together"
1225 )
Michael Foord50a8c0e2012-03-25 18:57:58 +01001226 if autospec is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001227 raise ValueError(
1228 "Cannot use 'autospec' and 'new_callable' together"
1229 )
1230
1231 self.getter = getter
1232 self.attribute = attribute
1233 self.new = new
1234 self.new_callable = new_callable
1235 self.spec = spec
1236 self.create = create
1237 self.has_local = False
1238 self.spec_set = spec_set
1239 self.autospec = autospec
1240 self.kwargs = kwargs
1241 self.additional_patchers = []
1242
1243
1244 def copy(self):
1245 patcher = _patch(
1246 self.getter, self.attribute, self.new, self.spec,
1247 self.create, self.spec_set,
1248 self.autospec, self.new_callable, self.kwargs
1249 )
1250 patcher.attribute_name = self.attribute_name
1251 patcher.additional_patchers = [
1252 p.copy() for p in self.additional_patchers
1253 ]
1254 return patcher
1255
1256
1257 def __call__(self, func):
1258 if isinstance(func, type):
1259 return self.decorate_class(func)
Xtreak436c2b02019-05-28 12:37:39 +05301260 if inspect.iscoroutinefunction(func):
1261 return self.decorate_async_callable(func)
Michael Foord345266a2012-03-14 12:24:34 -07001262 return self.decorate_callable(func)
1263
1264
1265 def decorate_class(self, klass):
1266 for attr in dir(klass):
1267 if not attr.startswith(patch.TEST_PREFIX):
1268 continue
1269
1270 attr_value = getattr(klass, attr)
1271 if not hasattr(attr_value, "__call__"):
1272 continue
1273
1274 patcher = self.copy()
1275 setattr(klass, attr, patcher(attr_value))
1276 return klass
1277
1278
Xtreak436c2b02019-05-28 12:37:39 +05301279 @contextlib.contextmanager
1280 def decoration_helper(self, patched, args, keywargs):
1281 extra_args = []
1282 entered_patchers = []
1283 patching = None
1284
1285 exc_info = tuple()
1286 try:
1287 for patching in patched.patchings:
1288 arg = patching.__enter__()
1289 entered_patchers.append(patching)
1290 if patching.attribute_name is not None:
1291 keywargs.update(arg)
1292 elif patching.new is DEFAULT:
1293 extra_args.append(arg)
1294
1295 args += tuple(extra_args)
1296 yield (args, keywargs)
1297 except:
1298 if (patching not in entered_patchers and
1299 _is_started(patching)):
1300 # the patcher may have been started, but an exception
1301 # raised whilst entering one of its additional_patchers
1302 entered_patchers.append(patching)
1303 # Pass the exception to __exit__
1304 exc_info = sys.exc_info()
1305 # re-raise the exception
1306 raise
1307 finally:
1308 for patching in reversed(entered_patchers):
1309 patching.__exit__(*exc_info)
1310
1311
Michael Foord345266a2012-03-14 12:24:34 -07001312 def decorate_callable(self, func):
Xtreak436c2b02019-05-28 12:37:39 +05301313 # NB. Keep the method in sync with decorate_async_callable()
Michael Foord345266a2012-03-14 12:24:34 -07001314 if hasattr(func, 'patchings'):
1315 func.patchings.append(self)
1316 return func
1317
1318 @wraps(func)
1319 def patched(*args, **keywargs):
Xtreak436c2b02019-05-28 12:37:39 +05301320 with self.decoration_helper(patched,
1321 args,
1322 keywargs) as (newargs, newkeywargs):
1323 return func(*newargs, **newkeywargs)
Michael Foord345266a2012-03-14 12:24:34 -07001324
Xtreak436c2b02019-05-28 12:37:39 +05301325 patched.patchings = [self]
1326 return patched
Michael Foord345266a2012-03-14 12:24:34 -07001327
Xtreak436c2b02019-05-28 12:37:39 +05301328
1329 def decorate_async_callable(self, func):
1330 # NB. Keep the method in sync with decorate_callable()
1331 if hasattr(func, 'patchings'):
1332 func.patchings.append(self)
1333 return func
1334
1335 @wraps(func)
1336 async def patched(*args, **keywargs):
1337 with self.decoration_helper(patched,
1338 args,
1339 keywargs) as (newargs, newkeywargs):
1340 return await func(*newargs, **newkeywargs)
Michael Foord345266a2012-03-14 12:24:34 -07001341
1342 patched.patchings = [self]
Michael Foord345266a2012-03-14 12:24:34 -07001343 return patched
1344
1345
1346 def get_original(self):
1347 target = self.getter()
1348 name = self.attribute
1349
1350 original = DEFAULT
1351 local = False
1352
1353 try:
1354 original = target.__dict__[name]
1355 except (AttributeError, KeyError):
1356 original = getattr(target, name, DEFAULT)
1357 else:
1358 local = True
1359
Michael Foordfddcfa22014-04-14 16:25:20 -04001360 if name in _builtins and isinstance(target, ModuleType):
1361 self.create = True
1362
Michael Foord345266a2012-03-14 12:24:34 -07001363 if not self.create and original is DEFAULT:
1364 raise AttributeError(
1365 "%s does not have the attribute %r" % (target, name)
1366 )
1367 return original, local
1368
1369
1370 def __enter__(self):
1371 """Perform the patch."""
1372 new, spec, spec_set = self.new, self.spec, self.spec_set
1373 autospec, kwargs = self.autospec, self.kwargs
1374 new_callable = self.new_callable
1375 self.target = self.getter()
1376
Michael Foord50a8c0e2012-03-25 18:57:58 +01001377 # normalise False to None
1378 if spec is False:
1379 spec = None
1380 if spec_set is False:
1381 spec_set = None
1382 if autospec is False:
1383 autospec = None
1384
1385 if spec is not None and autospec is not None:
1386 raise TypeError("Can't specify spec and autospec")
1387 if ((spec is not None or autospec is not None) and
1388 spec_set not in (True, None)):
1389 raise TypeError("Can't provide explicit spec_set *and* spec or autospec")
1390
Michael Foord345266a2012-03-14 12:24:34 -07001391 original, local = self.get_original()
1392
Michael Foord50a8c0e2012-03-25 18:57:58 +01001393 if new is DEFAULT and autospec is None:
Michael Foord345266a2012-03-14 12:24:34 -07001394 inherit = False
Michael Foord50a8c0e2012-03-25 18:57:58 +01001395 if spec is True:
Michael Foord345266a2012-03-14 12:24:34 -07001396 # set spec to the object we are replacing
1397 spec = original
Michael Foord50a8c0e2012-03-25 18:57:58 +01001398 if spec_set is True:
1399 spec_set = original
1400 spec = None
1401 elif spec is not None:
1402 if spec_set is True:
1403 spec_set = spec
1404 spec = None
1405 elif spec_set is True:
1406 spec_set = original
Michael Foord345266a2012-03-14 12:24:34 -07001407
Michael Foord50a8c0e2012-03-25 18:57:58 +01001408 if spec is not None or spec_set is not None:
1409 if original is DEFAULT:
1410 raise TypeError("Can't use 'spec' with create=True")
Michael Foord345266a2012-03-14 12:24:34 -07001411 if isinstance(original, type):
1412 # If we're patching out a class and there is a spec
1413 inherit = True
Lisa Roach77b3b772019-05-20 09:19:53 -07001414 if spec is None and _is_async_obj(original):
1415 Klass = AsyncMock
1416 else:
1417 Klass = MagicMock
Michael Foord345266a2012-03-14 12:24:34 -07001418 _kwargs = {}
1419 if new_callable is not None:
1420 Klass = new_callable
Michael Foord50a8c0e2012-03-25 18:57:58 +01001421 elif spec is not None or spec_set is not None:
Michael Foorde58a5622012-03-25 19:53:18 +01001422 this_spec = spec
1423 if spec_set is not None:
1424 this_spec = spec_set
1425 if _is_list(this_spec):
1426 not_callable = '__call__' not in this_spec
1427 else:
1428 not_callable = not callable(this_spec)
Lisa Roach77b3b772019-05-20 09:19:53 -07001429 if _is_async_obj(this_spec):
1430 Klass = AsyncMock
1431 elif not_callable:
Michael Foord345266a2012-03-14 12:24:34 -07001432 Klass = NonCallableMagicMock
1433
1434 if spec is not None:
1435 _kwargs['spec'] = spec
1436 if spec_set is not None:
1437 _kwargs['spec_set'] = spec_set
1438
1439 # add a name to mocks
1440 if (isinstance(Klass, type) and
1441 issubclass(Klass, NonCallableMock) and self.attribute):
1442 _kwargs['name'] = self.attribute
1443
1444 _kwargs.update(kwargs)
1445 new = Klass(**_kwargs)
1446
1447 if inherit and _is_instance_mock(new):
1448 # we can only tell if the instance should be callable if the
1449 # spec is not a list
Michael Foord50a8c0e2012-03-25 18:57:58 +01001450 this_spec = spec
1451 if spec_set is not None:
1452 this_spec = spec_set
1453 if (not _is_list(this_spec) and not
1454 _instance_callable(this_spec)):
Michael Foord345266a2012-03-14 12:24:34 -07001455 Klass = NonCallableMagicMock
1456
1457 _kwargs.pop('name')
1458 new.return_value = Klass(_new_parent=new, _new_name='()',
1459 **_kwargs)
Michael Foord50a8c0e2012-03-25 18:57:58 +01001460 elif autospec is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001461 # spec is ignored, new *must* be default, spec_set is treated
1462 # as a boolean. Should we check spec is not None and that spec_set
1463 # is a bool?
1464 if new is not DEFAULT:
1465 raise TypeError(
1466 "autospec creates the mock for you. Can't specify "
1467 "autospec and new."
1468 )
Michael Foord50a8c0e2012-03-25 18:57:58 +01001469 if original is DEFAULT:
Michael Foord99254732012-03-25 19:07:33 +01001470 raise TypeError("Can't use 'autospec' with create=True")
Michael Foord345266a2012-03-14 12:24:34 -07001471 spec_set = bool(spec_set)
1472 if autospec is True:
1473 autospec = original
1474
1475 new = create_autospec(autospec, spec_set=spec_set,
1476 _name=self.attribute, **kwargs)
1477 elif kwargs:
1478 # can't set keyword args when we aren't creating the mock
1479 # XXXX If new is a Mock we could call new.configure_mock(**kwargs)
1480 raise TypeError("Can't pass kwargs to a mock we aren't creating")
1481
1482 new_attr = new
1483
1484 self.temp_original = original
1485 self.is_local = local
1486 setattr(self.target, self.attribute, new_attr)
1487 if self.attribute_name is not None:
1488 extra_args = {}
1489 if self.new is DEFAULT:
1490 extra_args[self.attribute_name] = new
1491 for patching in self.additional_patchers:
1492 arg = patching.__enter__()
1493 if patching.new is DEFAULT:
1494 extra_args.update(arg)
1495 return extra_args
1496
1497 return new
1498
1499
Michael Foord50a8c0e2012-03-25 18:57:58 +01001500 def __exit__(self, *exc_info):
Michael Foord345266a2012-03-14 12:24:34 -07001501 """Undo the patch."""
1502 if not _is_started(self):
Xtreak02b84cb2019-03-29 02:38:43 +05301503 return
Michael Foord345266a2012-03-14 12:24:34 -07001504
1505 if self.is_local and self.temp_original is not DEFAULT:
1506 setattr(self.target, self.attribute, self.temp_original)
1507 else:
1508 delattr(self.target, self.attribute)
Senthil Kumaran81bc9272016-01-08 23:43:29 -08001509 if not self.create and (not hasattr(self.target, self.attribute) or
1510 self.attribute in ('__doc__', '__module__',
1511 '__defaults__', '__annotations__',
1512 '__kwdefaults__')):
Michael Foord345266a2012-03-14 12:24:34 -07001513 # needed for proxy objects like django settings
1514 setattr(self.target, self.attribute, self.temp_original)
1515
1516 del self.temp_original
1517 del self.is_local
1518 del self.target
1519 for patcher in reversed(self.additional_patchers):
1520 if _is_started(patcher):
Michael Foord50a8c0e2012-03-25 18:57:58 +01001521 patcher.__exit__(*exc_info)
Michael Foord345266a2012-03-14 12:24:34 -07001522
Michael Foordf7c41582012-06-10 20:36:32 +01001523
1524 def start(self):
1525 """Activate a patch, returning any created mock."""
1526 result = self.__enter__()
Michael Foordebc1a302014-04-15 17:21:08 -04001527 self._active_patches.append(self)
Michael Foordf7c41582012-06-10 20:36:32 +01001528 return result
1529
1530
1531 def stop(self):
1532 """Stop an active patch."""
Michael Foordebc1a302014-04-15 17:21:08 -04001533 try:
1534 self._active_patches.remove(self)
1535 except ValueError:
1536 # If the patch hasn't been started this will fail
1537 pass
1538
Michael Foordf7c41582012-06-10 20:36:32 +01001539 return self.__exit__()
Michael Foord345266a2012-03-14 12:24:34 -07001540
1541
1542
1543def _get_target(target):
1544 try:
1545 target, attribute = target.rsplit('.', 1)
1546 except (TypeError, ValueError):
1547 raise TypeError("Need a valid target to patch. You supplied: %r" %
1548 (target,))
1549 getter = lambda: _importer(target)
1550 return getter, attribute
1551
1552
1553def _patch_object(
1554 target, attribute, new=DEFAULT, spec=None,
Michael Foord50a8c0e2012-03-25 18:57:58 +01001555 create=False, spec_set=None, autospec=None,
Michael Foord345266a2012-03-14 12:24:34 -07001556 new_callable=None, **kwargs
1557 ):
1558 """
Michael Foord345266a2012-03-14 12:24:34 -07001559 patch the named member (`attribute`) on an object (`target`) with a mock
1560 object.
1561
1562 `patch.object` can be used as a decorator, class decorator or a context
1563 manager. Arguments `new`, `spec`, `create`, `spec_set`,
1564 `autospec` and `new_callable` have the same meaning as for `patch`. Like
1565 `patch`, `patch.object` takes arbitrary keyword arguments for configuring
1566 the mock object it creates.
1567
1568 When used as a class decorator `patch.object` honours `patch.TEST_PREFIX`
1569 for choosing which methods to wrap.
1570 """
1571 getter = lambda: target
1572 return _patch(
1573 getter, attribute, new, spec, create,
1574 spec_set, autospec, new_callable, kwargs
1575 )
1576
1577
Michael Foord50a8c0e2012-03-25 18:57:58 +01001578def _patch_multiple(target, spec=None, create=False, spec_set=None,
1579 autospec=None, new_callable=None, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001580 """Perform multiple patches in a single call. It takes the object to be
1581 patched (either as an object or a string to fetch the object by importing)
1582 and keyword arguments for the patches::
1583
1584 with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):
1585 ...
1586
1587 Use `DEFAULT` as the value if you want `patch.multiple` to create
1588 mocks for you. In this case the created mocks are passed into a decorated
1589 function by keyword, and a dictionary is returned when `patch.multiple` is
1590 used as a context manager.
1591
1592 `patch.multiple` can be used as a decorator, class decorator or a context
1593 manager. The arguments `spec`, `spec_set`, `create`,
1594 `autospec` and `new_callable` have the same meaning as for `patch`. These
1595 arguments will be applied to *all* patches done by `patch.multiple`.
1596
1597 When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX`
1598 for choosing which methods to wrap.
1599 """
1600 if type(target) is str:
1601 getter = lambda: _importer(target)
1602 else:
1603 getter = lambda: target
1604
1605 if not kwargs:
1606 raise ValueError(
1607 'Must supply at least one keyword argument with patch.multiple'
1608 )
1609 # need to wrap in a list for python 3, where items is a view
1610 items = list(kwargs.items())
1611 attribute, new = items[0]
1612 patcher = _patch(
1613 getter, attribute, new, spec, create, spec_set,
1614 autospec, new_callable, {}
1615 )
1616 patcher.attribute_name = attribute
1617 for attribute, new in items[1:]:
1618 this_patcher = _patch(
1619 getter, attribute, new, spec, create, spec_set,
1620 autospec, new_callable, {}
1621 )
1622 this_patcher.attribute_name = attribute
1623 patcher.additional_patchers.append(this_patcher)
1624 return patcher
1625
1626
1627def patch(
1628 target, new=DEFAULT, spec=None, create=False,
Michael Foord50a8c0e2012-03-25 18:57:58 +01001629 spec_set=None, autospec=None, new_callable=None, **kwargs
Michael Foord345266a2012-03-14 12:24:34 -07001630 ):
1631 """
1632 `patch` acts as a function decorator, class decorator or a context
1633 manager. Inside the body of the function or with statement, the `target`
Michael Foord54b3db82012-03-28 15:08:08 +01001634 is patched with a `new` object. When the function/with statement exits
1635 the patch is undone.
Michael Foord345266a2012-03-14 12:24:34 -07001636
Miss Islington (bot)eaa1b092019-09-10 06:15:19 -07001637 If `new` is omitted, then the target is replaced with an
1638 `AsyncMock if the patched object is an async function or a
1639 `MagicMock` otherwise. If `patch` is used as a decorator and `new` is
Michael Foord54b3db82012-03-28 15:08:08 +01001640 omitted, the created mock is passed in as an extra argument to the
1641 decorated function. If `patch` is used as a context manager the created
1642 mock is returned by the context manager.
Michael Foord345266a2012-03-14 12:24:34 -07001643
Michael Foord54b3db82012-03-28 15:08:08 +01001644 `target` should be a string in the form `'package.module.ClassName'`. The
1645 `target` is imported and the specified object replaced with the `new`
1646 object, so the `target` must be importable from the environment you are
1647 calling `patch` from. The target is imported when the decorated function
1648 is executed, not at decoration time.
Michael Foord345266a2012-03-14 12:24:34 -07001649
1650 The `spec` and `spec_set` keyword arguments are passed to the `MagicMock`
1651 if patch is creating one for you.
1652
1653 In addition you can pass `spec=True` or `spec_set=True`, which causes
1654 patch to pass in the object being mocked as the spec/spec_set object.
1655
1656 `new_callable` allows you to specify a different class, or callable object,
Miss Islington (bot)eaa1b092019-09-10 06:15:19 -07001657 that will be called to create the `new` object. By default `AsyncMock` is
1658 used for async functions and `MagicMock` for the rest.
Michael Foord345266a2012-03-14 12:24:34 -07001659
1660 A more powerful form of `spec` is `autospec`. If you set `autospec=True`
Robert Collins92b3e0652015-07-17 21:58:36 +12001661 then the mock will be created with a spec from the object being replaced.
Michael Foord345266a2012-03-14 12:24:34 -07001662 All attributes of the mock will also have the spec of the corresponding
1663 attribute of the object being replaced. Methods and functions being
1664 mocked will have their arguments checked and will raise a `TypeError` if
1665 they are called with the wrong signature. For mocks replacing a class,
1666 their return value (the 'instance') will have the same spec as the class.
1667
1668 Instead of `autospec=True` you can pass `autospec=some_object` to use an
1669 arbitrary object as the spec instead of the one being replaced.
1670
1671 By default `patch` will fail to replace attributes that don't exist. If
1672 you pass in `create=True`, and the attribute doesn't exist, patch will
1673 create the attribute for you when the patched function is called, and
1674 delete it again afterwards. This is useful for writing tests against
Terry Jan Reedy0f847642013-03-11 18:34:00 -04001675 attributes that your production code creates at runtime. It is off by
Michael Foord345266a2012-03-14 12:24:34 -07001676 default because it can be dangerous. With it switched on you can write
1677 passing tests against APIs that don't actually exist!
1678
1679 Patch can be used as a `TestCase` class decorator. It works by
1680 decorating each test method in the class. This reduces the boilerplate
1681 code when your test methods share a common patchings set. `patch` finds
1682 tests by looking for method names that start with `patch.TEST_PREFIX`.
1683 By default this is `test`, which matches the way `unittest` finds tests.
1684 You can specify an alternative prefix by setting `patch.TEST_PREFIX`.
1685
1686 Patch can be used as a context manager, with the with statement. Here the
1687 patching applies to the indented block after the with statement. If you
1688 use "as" then the patched object will be bound to the name after the
1689 "as"; very useful if `patch` is creating a mock object for you.
1690
1691 `patch` takes arbitrary keyword arguments. These will be passed to
1692 the `Mock` (or `new_callable`) on construction.
1693
1694 `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are
1695 available for alternate use-cases.
1696 """
1697 getter, attribute = _get_target(target)
1698 return _patch(
1699 getter, attribute, new, spec, create,
1700 spec_set, autospec, new_callable, kwargs
1701 )
1702
1703
1704class _patch_dict(object):
1705 """
1706 Patch a dictionary, or dictionary like object, and restore the dictionary
1707 to its original state after the test.
1708
1709 `in_dict` can be a dictionary or a mapping like container. If it is a
1710 mapping then it must at least support getting, setting and deleting items
1711 plus iterating over keys.
1712
1713 `in_dict` can also be a string specifying the name of the dictionary, which
1714 will then be fetched by importing it.
1715
1716 `values` can be a dictionary of values to set in the dictionary. `values`
1717 can also be an iterable of `(key, value)` pairs.
1718
1719 If `clear` is True then the dictionary will be cleared before the new
1720 values are set.
1721
1722 `patch.dict` can also be called with arbitrary keyword arguments to set
1723 values in the dictionary::
1724
1725 with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()):
1726 ...
1727
1728 `patch.dict` can be used as a context manager, decorator or class
1729 decorator. When used as a class decorator `patch.dict` honours
1730 `patch.TEST_PREFIX` for choosing which methods to wrap.
1731 """
1732
1733 def __init__(self, in_dict, values=(), clear=False, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001734 self.in_dict = in_dict
1735 # support any argument supported by dict(...) constructor
1736 self.values = dict(values)
1737 self.values.update(kwargs)
1738 self.clear = clear
1739 self._original = None
1740
1741
1742 def __call__(self, f):
1743 if isinstance(f, type):
1744 return self.decorate_class(f)
1745 @wraps(f)
1746 def _inner(*args, **kw):
1747 self._patch_dict()
1748 try:
1749 return f(*args, **kw)
1750 finally:
1751 self._unpatch_dict()
1752
1753 return _inner
1754
1755
1756 def decorate_class(self, klass):
1757 for attr in dir(klass):
1758 attr_value = getattr(klass, attr)
1759 if (attr.startswith(patch.TEST_PREFIX) and
1760 hasattr(attr_value, "__call__")):
1761 decorator = _patch_dict(self.in_dict, self.values, self.clear)
1762 decorated = decorator(attr_value)
1763 setattr(klass, attr, decorated)
1764 return klass
1765
1766
1767 def __enter__(self):
1768 """Patch the dict."""
1769 self._patch_dict()
Mario Corchero04530812019-05-28 13:53:31 +01001770 return self.in_dict
Michael Foord345266a2012-03-14 12:24:34 -07001771
1772
1773 def _patch_dict(self):
1774 values = self.values
Xtreaka875ea52019-02-25 00:24:49 +05301775 if isinstance(self.in_dict, str):
1776 self.in_dict = _importer(self.in_dict)
Michael Foord345266a2012-03-14 12:24:34 -07001777 in_dict = self.in_dict
1778 clear = self.clear
1779
1780 try:
1781 original = in_dict.copy()
1782 except AttributeError:
1783 # dict like object with no copy method
1784 # must support iteration over keys
1785 original = {}
1786 for key in in_dict:
1787 original[key] = in_dict[key]
1788 self._original = original
1789
1790 if clear:
1791 _clear_dict(in_dict)
1792
1793 try:
1794 in_dict.update(values)
1795 except AttributeError:
1796 # dict like object with no update method
1797 for key in values:
1798 in_dict[key] = values[key]
1799
1800
1801 def _unpatch_dict(self):
1802 in_dict = self.in_dict
1803 original = self._original
1804
1805 _clear_dict(in_dict)
1806
1807 try:
1808 in_dict.update(original)
1809 except AttributeError:
1810 for key in original:
1811 in_dict[key] = original[key]
1812
1813
1814 def __exit__(self, *args):
1815 """Unpatch the dict."""
1816 self._unpatch_dict()
1817 return False
1818
1819 start = __enter__
1820 stop = __exit__
1821
1822
1823def _clear_dict(in_dict):
1824 try:
1825 in_dict.clear()
1826 except AttributeError:
1827 keys = list(in_dict)
1828 for key in keys:
1829 del in_dict[key]
1830
1831
Michael Foordf7c41582012-06-10 20:36:32 +01001832def _patch_stopall():
Michael Foordebc1a302014-04-15 17:21:08 -04001833 """Stop all active patches. LIFO to unroll nested patches."""
1834 for patch in reversed(_patch._active_patches):
Michael Foordf7c41582012-06-10 20:36:32 +01001835 patch.stop()
1836
1837
Michael Foord345266a2012-03-14 12:24:34 -07001838patch.object = _patch_object
1839patch.dict = _patch_dict
1840patch.multiple = _patch_multiple
Michael Foordf7c41582012-06-10 20:36:32 +01001841patch.stopall = _patch_stopall
Michael Foord345266a2012-03-14 12:24:34 -07001842patch.TEST_PREFIX = 'test'
1843
1844magic_methods = (
1845 "lt le gt ge eq ne "
1846 "getitem setitem delitem "
1847 "len contains iter "
1848 "hash str sizeof "
1849 "enter exit "
Berker Peksaga785dec2015-03-15 01:51:56 +02001850 # we added divmod and rdivmod here instead of numerics
1851 # because there is no idivmod
1852 "divmod rdivmod neg pos abs invert "
Michael Foord345266a2012-03-14 12:24:34 -07001853 "complex int float index "
John Reese6c4fab02018-05-22 13:01:10 -07001854 "round trunc floor ceil "
Michael Foord345266a2012-03-14 12:24:34 -07001855 "bool next "
Max Bélanger6c83d9f2018-10-25 14:48:58 -07001856 "fspath "
Michael Foord345266a2012-03-14 12:24:34 -07001857)
1858
Michael Foordd2623d72014-04-14 11:23:48 -04001859numerics = (
Berker Peksag9bd8af72015-03-12 20:42:48 +02001860 "add sub mul matmul div floordiv mod lshift rshift and xor or pow truediv"
Michael Foordd2623d72014-04-14 11:23:48 -04001861)
Michael Foord345266a2012-03-14 12:24:34 -07001862inplace = ' '.join('i%s' % n for n in numerics.split())
1863right = ' '.join('r%s' % n for n in numerics.split())
1864
1865# not including __prepare__, __instancecheck__, __subclasscheck__
1866# (as they are metaclass methods)
1867# __del__ is not supported at all as it causes problems if it exists
1868
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001869_non_defaults = {
1870 '__get__', '__set__', '__delete__', '__reversed__', '__missing__',
1871 '__reduce__', '__reduce_ex__', '__getinitargs__', '__getnewargs__',
1872 '__getstate__', '__setstate__', '__getformat__', '__setformat__',
1873 '__repr__', '__dir__', '__subclasses__', '__format__',
Lisa Roach865bb682019-09-20 23:00:04 -07001874 '__getnewargs_ex__',
Victor Stinnereb1a9952014-12-11 22:25:49 +01001875}
Michael Foord345266a2012-03-14 12:24:34 -07001876
1877
1878def _get_method(name, func):
1879 "Turns a callable object (like a mock) into a real function"
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001880 def method(self, /, *args, **kw):
Michael Foord345266a2012-03-14 12:24:34 -07001881 return func(self, *args, **kw)
1882 method.__name__ = name
1883 return method
1884
1885
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001886_magics = {
Michael Foord345266a2012-03-14 12:24:34 -07001887 '__%s__' % method for method in
1888 ' '.join([magic_methods, numerics, inplace, right]).split()
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001889}
Michael Foord345266a2012-03-14 12:24:34 -07001890
Lisa Roach77b3b772019-05-20 09:19:53 -07001891# Magic methods used for async `with` statements
1892_async_method_magics = {"__aenter__", "__aexit__", "__anext__"}
Lisa Roach865bb682019-09-20 23:00:04 -07001893# Magic methods that are only used with async calls but are synchronous functions themselves
1894_sync_async_magics = {"__aiter__"}
1895_async_magics = _async_method_magics | _sync_async_magics
Lisa Roach77b3b772019-05-20 09:19:53 -07001896
Lisa Roach865bb682019-09-20 23:00:04 -07001897_all_sync_magics = _magics | _non_defaults
1898_all_magics = _all_sync_magics | _async_magics
Michael Foord345266a2012-03-14 12:24:34 -07001899
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001900_unsupported_magics = {
Michael Foord345266a2012-03-14 12:24:34 -07001901 '__getattr__', '__setattr__',
Serhiy Storchaka34fd4c22018-11-05 16:20:25 +02001902 '__init__', '__new__', '__prepare__',
Michael Foord345266a2012-03-14 12:24:34 -07001903 '__instancecheck__', '__subclasscheck__',
1904 '__del__'
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001905}
Michael Foord345266a2012-03-14 12:24:34 -07001906
1907_calculate_return_value = {
1908 '__hash__': lambda self: object.__hash__(self),
1909 '__str__': lambda self: object.__str__(self),
1910 '__sizeof__': lambda self: object.__sizeof__(self),
Max Bélanger6c83d9f2018-10-25 14:48:58 -07001911 '__fspath__': lambda self: f"{type(self).__name__}/{self._extract_mock_name()}/{id(self)}",
Michael Foord345266a2012-03-14 12:24:34 -07001912}
1913
1914_return_values = {
Michael Foord313f85f2012-03-25 18:16:07 +01001915 '__lt__': NotImplemented,
1916 '__gt__': NotImplemented,
1917 '__le__': NotImplemented,
1918 '__ge__': NotImplemented,
Michael Foord345266a2012-03-14 12:24:34 -07001919 '__int__': 1,
1920 '__contains__': False,
1921 '__len__': 0,
1922 '__exit__': False,
1923 '__complex__': 1j,
1924 '__float__': 1.0,
1925 '__bool__': True,
1926 '__index__': 1,
Lisa Roach77b3b772019-05-20 09:19:53 -07001927 '__aexit__': False,
Michael Foord345266a2012-03-14 12:24:34 -07001928}
1929
1930
1931def _get_eq(self):
1932 def __eq__(other):
1933 ret_val = self.__eq__._mock_return_value
1934 if ret_val is not DEFAULT:
1935 return ret_val
Serhiy Storchaka362f0582017-01-21 23:12:58 +02001936 if self is other:
1937 return True
1938 return NotImplemented
Michael Foord345266a2012-03-14 12:24:34 -07001939 return __eq__
1940
1941def _get_ne(self):
1942 def __ne__(other):
1943 if self.__ne__._mock_return_value is not DEFAULT:
1944 return DEFAULT
Serhiy Storchaka362f0582017-01-21 23:12:58 +02001945 if self is other:
1946 return False
1947 return NotImplemented
Michael Foord345266a2012-03-14 12:24:34 -07001948 return __ne__
1949
1950def _get_iter(self):
1951 def __iter__():
1952 ret_val = self.__iter__._mock_return_value
1953 if ret_val is DEFAULT:
1954 return iter([])
1955 # if ret_val was already an iterator, then calling iter on it should
1956 # return the iterator unchanged
1957 return iter(ret_val)
1958 return __iter__
1959
Lisa Roach77b3b772019-05-20 09:19:53 -07001960def _get_async_iter(self):
1961 def __aiter__():
1962 ret_val = self.__aiter__._mock_return_value
1963 if ret_val is DEFAULT:
1964 return _AsyncIterator(iter([]))
1965 return _AsyncIterator(iter(ret_val))
1966 return __aiter__
1967
Michael Foord345266a2012-03-14 12:24:34 -07001968_side_effect_methods = {
1969 '__eq__': _get_eq,
1970 '__ne__': _get_ne,
1971 '__iter__': _get_iter,
Lisa Roach77b3b772019-05-20 09:19:53 -07001972 '__aiter__': _get_async_iter
Michael Foord345266a2012-03-14 12:24:34 -07001973}
1974
1975
1976
1977def _set_return_value(mock, method, name):
1978 fixed = _return_values.get(name, DEFAULT)
1979 if fixed is not DEFAULT:
1980 method.return_value = fixed
1981 return
1982
Miss Islington (bot)cc8edfb2019-09-16 09:52:45 -07001983 return_calculator = _calculate_return_value.get(name)
1984 if return_calculator is not None:
1985 return_value = return_calculator(mock)
Michael Foord345266a2012-03-14 12:24:34 -07001986 method.return_value = return_value
1987 return
1988
1989 side_effector = _side_effect_methods.get(name)
1990 if side_effector is not None:
1991 method.side_effect = side_effector(mock)
1992
1993
1994
1995class MagicMixin(object):
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03001996 def __init__(self, /, *args, **kw):
Łukasz Langaa468db92015-04-13 23:12:42 -07001997 self._mock_set_magics() # make magic work for kwargs in init
Nick Coghlan0b43bcf2012-05-27 18:17:07 +10001998 _safe_super(MagicMixin, self).__init__(*args, **kw)
Łukasz Langaa468db92015-04-13 23:12:42 -07001999 self._mock_set_magics() # fix magic broken by upper level init
Michael Foord345266a2012-03-14 12:24:34 -07002000
2001
2002 def _mock_set_magics(self):
2003 these_magics = _magics
2004
Łukasz Langaa468db92015-04-13 23:12:42 -07002005 if getattr(self, "_mock_methods", None) is not None:
Michael Foord345266a2012-03-14 12:24:34 -07002006 these_magics = _magics.intersection(self._mock_methods)
2007
2008 remove_magics = set()
2009 remove_magics = _magics - these_magics
2010
2011 for entry in remove_magics:
2012 if entry in type(self).__dict__:
2013 # remove unneeded magic methods
2014 delattr(self, entry)
2015
2016 # don't overwrite existing attributes if called a second time
2017 these_magics = these_magics - set(type(self).__dict__)
2018
2019 _type = type(self)
2020 for entry in these_magics:
2021 setattr(_type, entry, MagicProxy(entry, self))
2022
2023
2024
2025class NonCallableMagicMock(MagicMixin, NonCallableMock):
2026 """A version of `MagicMock` that isn't callable."""
2027 def mock_add_spec(self, spec, spec_set=False):
2028 """Add a spec to a mock. `spec` can either be an object or a
2029 list of strings. Only attributes on the `spec` can be fetched as
2030 attributes from the mock.
2031
2032 If `spec_set` is True then only attributes on the spec can be set."""
2033 self._mock_add_spec(spec, spec_set)
2034 self._mock_set_magics()
2035
2036
Lisa Roach77b3b772019-05-20 09:19:53 -07002037class AsyncMagicMixin:
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002038 def __init__(self, /, *args, **kw):
Lisa Roach77b3b772019-05-20 09:19:53 -07002039 self._mock_set_async_magics() # make magic work for kwargs in init
2040 _safe_super(AsyncMagicMixin, self).__init__(*args, **kw)
2041 self._mock_set_async_magics() # fix magic broken by upper level init
Michael Foord345266a2012-03-14 12:24:34 -07002042
Lisa Roach77b3b772019-05-20 09:19:53 -07002043 def _mock_set_async_magics(self):
2044 these_magics = _async_magics
2045
2046 if getattr(self, "_mock_methods", None) is not None:
2047 these_magics = _async_magics.intersection(self._mock_methods)
2048 remove_magics = _async_magics - these_magics
2049
2050 for entry in remove_magics:
2051 if entry in type(self).__dict__:
2052 # remove unneeded magic methods
2053 delattr(self, entry)
2054
2055 # don't overwrite existing attributes if called a second time
2056 these_magics = these_magics - set(type(self).__dict__)
2057
2058 _type = type(self)
2059 for entry in these_magics:
2060 setattr(_type, entry, MagicProxy(entry, self))
2061
2062
2063class MagicMock(MagicMixin, AsyncMagicMixin, Mock):
Michael Foord345266a2012-03-14 12:24:34 -07002064 """
2065 MagicMock is a subclass of Mock with default implementations
2066 of most of the magic methods. You can use MagicMock without having to
2067 configure the magic methods yourself.
2068
2069 If you use the `spec` or `spec_set` arguments then *only* magic
2070 methods that exist in the spec will be created.
2071
2072 Attributes and the return value of a `MagicMock` will also be `MagicMocks`.
2073 """
2074 def mock_add_spec(self, spec, spec_set=False):
2075 """Add a spec to a mock. `spec` can either be an object or a
2076 list of strings. Only attributes on the `spec` can be fetched as
2077 attributes from the mock.
2078
2079 If `spec_set` is True then only attributes on the spec can be set."""
2080 self._mock_add_spec(spec, spec_set)
2081 self._mock_set_magics()
2082
2083
2084
2085class MagicProxy(object):
2086 def __init__(self, name, parent):
2087 self.name = name
2088 self.parent = parent
2089
Michael Foord345266a2012-03-14 12:24:34 -07002090 def create_mock(self):
2091 entry = self.name
2092 parent = self.parent
2093 m = parent._get_child_mock(name=entry, _new_name=entry,
2094 _new_parent=parent)
2095 setattr(parent, entry, m)
2096 _set_return_value(parent, m, entry)
2097 return m
2098
2099 def __get__(self, obj, _type=None):
2100 return self.create_mock()
2101
2102
Lisa Roach77b3b772019-05-20 09:19:53 -07002103class AsyncMockMixin(Base):
2104 awaited = _delegating_property('awaited')
2105 await_count = _delegating_property('await_count')
2106 await_args = _delegating_property('await_args')
2107 await_args_list = _delegating_property('await_args_list')
2108
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002109 def __init__(self, /, *args, **kwargs):
Lisa Roach77b3b772019-05-20 09:19:53 -07002110 super().__init__(*args, **kwargs)
2111 # asyncio.iscoroutinefunction() checks _is_coroutine property to say if an
2112 # object is a coroutine. Without this check it looks to see if it is a
2113 # function/method, which in this case it is not (since it is an
2114 # AsyncMock).
2115 # It is set through __dict__ because when spec_set is True, this
2116 # attribute is likely undefined.
2117 self.__dict__['_is_coroutine'] = asyncio.coroutines._is_coroutine
2118 self.__dict__['_mock_awaited'] = _AwaitEvent(self)
2119 self.__dict__['_mock_await_count'] = 0
2120 self.__dict__['_mock_await_args'] = None
2121 self.__dict__['_mock_await_args_list'] = _CallList()
2122 code_mock = NonCallableMock(spec_set=CodeType)
2123 code_mock.co_flags = inspect.CO_COROUTINE
2124 self.__dict__['__code__'] = code_mock
2125
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002126 async def _mock_call(self, /, *args, **kwargs):
Lisa Roach77b3b772019-05-20 09:19:53 -07002127 try:
2128 result = super()._mock_call(*args, **kwargs)
2129 except (BaseException, StopIteration) as e:
2130 side_effect = self.side_effect
2131 if side_effect is not None and not callable(side_effect):
2132 raise
2133 return await _raise(e)
2134
2135 _call = self.call_args
2136
2137 async def proxy():
2138 try:
2139 if inspect.isawaitable(result):
2140 return await result
2141 else:
2142 return result
2143 finally:
2144 self.await_count += 1
2145 self.await_args = _call
2146 self.await_args_list.append(_call)
2147 await self.awaited._notify()
2148
2149 return await proxy()
2150
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002151 def assert_awaited(self):
Lisa Roach77b3b772019-05-20 09:19:53 -07002152 """
2153 Assert that the mock was awaited at least once.
2154 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002155 if self.await_count == 0:
2156 msg = f"Expected {self._mock_name or 'mock'} to have been awaited."
2157 raise AssertionError(msg)
2158
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002159 def assert_awaited_once(self):
Lisa Roach77b3b772019-05-20 09:19:53 -07002160 """
2161 Assert that the mock was awaited exactly once.
2162 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002163 if not self.await_count == 1:
2164 msg = (f"Expected {self._mock_name or 'mock'} to have been awaited once."
2165 f" Awaited {self.await_count} times.")
2166 raise AssertionError(msg)
2167
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002168 def assert_awaited_with(self, /, *args, **kwargs):
Lisa Roach77b3b772019-05-20 09:19:53 -07002169 """
2170 Assert that the last await was with the specified arguments.
2171 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002172 if self.await_args is None:
2173 expected = self._format_mock_call_signature(args, kwargs)
2174 raise AssertionError(f'Expected await: {expected}\nNot awaited')
2175
2176 def _error_message():
Xtreak0ae022c2019-05-29 12:32:26 +05302177 msg = self._format_mock_failure_message(args, kwargs, action='await')
Lisa Roach77b3b772019-05-20 09:19:53 -07002178 return msg
2179
2180 expected = self._call_matcher((args, kwargs))
2181 actual = self._call_matcher(self.await_args)
2182 if expected != actual:
2183 cause = expected if isinstance(expected, Exception) else None
2184 raise AssertionError(_error_message()) from cause
2185
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002186 def assert_awaited_once_with(self, /, *args, **kwargs):
Lisa Roach77b3b772019-05-20 09:19:53 -07002187 """
2188 Assert that the mock was awaited exactly once and with the specified
2189 arguments.
2190 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002191 if not self.await_count == 1:
2192 msg = (f"Expected {self._mock_name or 'mock'} to have been awaited once."
2193 f" Awaited {self.await_count} times.")
2194 raise AssertionError(msg)
2195 return self.assert_awaited_with(*args, **kwargs)
2196
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002197 def assert_any_await(self, /, *args, **kwargs):
Lisa Roach77b3b772019-05-20 09:19:53 -07002198 """
2199 Assert the mock has ever been awaited with the specified arguments.
2200 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002201 expected = self._call_matcher((args, kwargs))
2202 actual = [self._call_matcher(c) for c in self.await_args_list]
2203 if expected not in actual:
2204 cause = expected if isinstance(expected, Exception) else None
2205 expected_string = self._format_mock_call_signature(args, kwargs)
2206 raise AssertionError(
2207 '%s await not found' % expected_string
2208 ) from cause
2209
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002210 def assert_has_awaits(self, calls, any_order=False):
Lisa Roach77b3b772019-05-20 09:19:53 -07002211 """
2212 Assert the mock has been awaited with the specified calls.
2213 The :attr:`await_args_list` list is checked for the awaits.
2214
2215 If `any_order` is False (the default) then the awaits must be
2216 sequential. There can be extra calls before or after the
2217 specified awaits.
2218
2219 If `any_order` is True then the awaits can be in any order, but
2220 they must all appear in :attr:`await_args_list`.
2221 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002222 expected = [self._call_matcher(c) for c in calls]
2223 cause = expected if isinstance(expected, Exception) else None
2224 all_awaits = _CallList(self._call_matcher(c) for c in self.await_args_list)
2225 if not any_order:
2226 if expected not in all_awaits:
2227 raise AssertionError(
Xtreak0ae022c2019-05-29 12:32:26 +05302228 f'Awaits not found.\nExpected: {_CallList(calls)}\n'
Lisa Roach77b3b772019-05-20 09:19:53 -07002229 f'Actual: {self.await_args_list}'
2230 ) from cause
2231 return
2232
2233 all_awaits = list(all_awaits)
2234
2235 not_found = []
2236 for kall in expected:
2237 try:
2238 all_awaits.remove(kall)
2239 except ValueError:
2240 not_found.append(kall)
2241 if not_found:
2242 raise AssertionError(
2243 '%r not all found in await list' % (tuple(not_found),)
2244 ) from cause
2245
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002246 def assert_not_awaited(self):
Lisa Roach77b3b772019-05-20 09:19:53 -07002247 """
2248 Assert that the mock was never awaited.
2249 """
Lisa Roach77b3b772019-05-20 09:19:53 -07002250 if self.await_count != 0:
Xtreakff6b2e62019-05-27 18:26:23 +05302251 msg = (f"Expected {self._mock_name or 'mock'} to not have been awaited."
Lisa Roach77b3b772019-05-20 09:19:53 -07002252 f" Awaited {self.await_count} times.")
2253 raise AssertionError(msg)
2254
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002255 def reset_mock(self, /, *args, **kwargs):
Lisa Roach77b3b772019-05-20 09:19:53 -07002256 """
2257 See :func:`.Mock.reset_mock()`
2258 """
2259 super().reset_mock(*args, **kwargs)
2260 self.await_count = 0
2261 self.await_args = None
2262 self.await_args_list = _CallList()
2263
2264
2265class AsyncMock(AsyncMockMixin, AsyncMagicMixin, Mock):
2266 """
2267 Enhance :class:`Mock` with features allowing to mock
2268 an async function.
2269
2270 The :class:`AsyncMock` object will behave so the object is
2271 recognized as an async function, and the result of a call is an awaitable:
2272
2273 >>> mock = AsyncMock()
2274 >>> asyncio.iscoroutinefunction(mock)
2275 True
2276 >>> inspect.isawaitable(mock())
2277 True
2278
2279
2280 The result of ``mock()`` is an async function which will have the outcome
2281 of ``side_effect`` or ``return_value``:
2282
2283 - if ``side_effect`` is a function, the async function will return the
2284 result of that function,
2285 - if ``side_effect`` is an exception, the async function will raise the
2286 exception,
2287 - if ``side_effect`` is an iterable, the async function will return the
2288 next value of the iterable, however, if the sequence of result is
2289 exhausted, ``StopIteration`` is raised immediately,
2290 - if ``side_effect`` is not defined, the async function will return the
2291 value defined by ``return_value``, hence, by default, the async function
2292 returns a new :class:`AsyncMock` object.
2293
2294 If the outcome of ``side_effect`` or ``return_value`` is an async function,
2295 the mock async function obtained when the mock object is called will be this
2296 async function itself (and not an async function returning an async
2297 function).
2298
2299 The test author can also specify a wrapped object with ``wraps``. In this
2300 case, the :class:`Mock` object behavior is the same as with an
2301 :class:`.Mock` object: the wrapped object may have methods
2302 defined as async function functions.
2303
Xtreake7cb23b2019-05-21 14:17:17 +05302304 Based on Martin Richard's asynctest project.
Lisa Roach77b3b772019-05-20 09:19:53 -07002305 """
2306
Michael Foord345266a2012-03-14 12:24:34 -07002307
2308class _ANY(object):
2309 "A helper object that compares equal to everything."
2310
2311 def __eq__(self, other):
2312 return True
2313
2314 def __ne__(self, other):
2315 return False
2316
2317 def __repr__(self):
2318 return '<ANY>'
2319
2320ANY = _ANY()
2321
2322
2323
2324def _format_call_signature(name, args, kwargs):
2325 message = '%s(%%s)' % name
2326 formatted_args = ''
2327 args_string = ', '.join([repr(arg) for arg in args])
2328 kwargs_string = ', '.join([
Miss Islington (bot)bee8bfe2019-09-09 04:42:43 -07002329 '%s=%r' % (key, value) for key, value in kwargs.items()
Michael Foord345266a2012-03-14 12:24:34 -07002330 ])
2331 if args_string:
2332 formatted_args = args_string
2333 if kwargs_string:
2334 if formatted_args:
2335 formatted_args += ', '
2336 formatted_args += kwargs_string
2337
2338 return message % formatted_args
2339
2340
2341
2342class _Call(tuple):
2343 """
2344 A tuple for holding the results of a call to a mock, either in the form
2345 `(args, kwargs)` or `(name, args, kwargs)`.
2346
2347 If args or kwargs are empty then a call tuple will compare equal to
2348 a tuple without those values. This makes comparisons less verbose::
2349
2350 _Call(('name', (), {})) == ('name',)
2351 _Call(('name', (1,), {})) == ('name', (1,))
2352 _Call(((), {'a': 'b'})) == ({'a': 'b'},)
2353
2354 The `_Call` object provides a useful shortcut for comparing with call::
2355
2356 _Call(((1, 2), {'a': 3})) == call(1, 2, a=3)
2357 _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3)
2358
2359 If the _Call has no name then it will match any name.
2360 """
Victor Stinner84b6fb02017-01-06 18:15:51 +01002361 def __new__(cls, value=(), name='', parent=None, two=False,
Michael Foord345266a2012-03-14 12:24:34 -07002362 from_kall=True):
Michael Foord345266a2012-03-14 12:24:34 -07002363 args = ()
2364 kwargs = {}
2365 _len = len(value)
2366 if _len == 3:
2367 name, args, kwargs = value
2368 elif _len == 2:
2369 first, second = value
2370 if isinstance(first, str):
2371 name = first
2372 if isinstance(second, tuple):
2373 args = second
2374 else:
2375 kwargs = second
2376 else:
2377 args, kwargs = first, second
2378 elif _len == 1:
2379 value, = value
2380 if isinstance(value, str):
2381 name = value
2382 elif isinstance(value, tuple):
2383 args = value
2384 else:
2385 kwargs = value
2386
2387 if two:
2388 return tuple.__new__(cls, (args, kwargs))
2389
2390 return tuple.__new__(cls, (name, args, kwargs))
2391
2392
2393 def __init__(self, value=(), name=None, parent=None, two=False,
2394 from_kall=True):
Andrew Dunaie63e6172018-12-04 11:08:45 +02002395 self._mock_name = name
2396 self._mock_parent = parent
2397 self._mock_from_kall = from_kall
Michael Foord345266a2012-03-14 12:24:34 -07002398
2399
2400 def __eq__(self, other):
2401 if other is ANY:
2402 return True
2403 try:
2404 len_other = len(other)
2405 except TypeError:
2406 return False
2407
2408 self_name = ''
2409 if len(self) == 2:
2410 self_args, self_kwargs = self
2411 else:
2412 self_name, self_args, self_kwargs = self
2413
Andrew Dunaie63e6172018-12-04 11:08:45 +02002414 if (getattr(self, '_mock_parent', None) and getattr(other, '_mock_parent', None)
2415 and self._mock_parent != other._mock_parent):
Chris Withers8ca0fa92018-12-03 21:31:37 +00002416 return False
2417
Michael Foord345266a2012-03-14 12:24:34 -07002418 other_name = ''
2419 if len_other == 0:
2420 other_args, other_kwargs = (), {}
2421 elif len_other == 3:
2422 other_name, other_args, other_kwargs = other
2423 elif len_other == 1:
2424 value, = other
2425 if isinstance(value, tuple):
2426 other_args = value
2427 other_kwargs = {}
2428 elif isinstance(value, str):
2429 other_name = value
2430 other_args, other_kwargs = (), {}
2431 else:
2432 other_args = ()
2433 other_kwargs = value
Berker Peksag3fc536f2015-09-09 23:35:25 +03002434 elif len_other == 2:
Michael Foord345266a2012-03-14 12:24:34 -07002435 # could be (name, args) or (name, kwargs) or (args, kwargs)
2436 first, second = other
2437 if isinstance(first, str):
2438 other_name = first
2439 if isinstance(second, tuple):
2440 other_args, other_kwargs = second, {}
2441 else:
2442 other_args, other_kwargs = (), second
2443 else:
2444 other_args, other_kwargs = first, second
Berker Peksag3fc536f2015-09-09 23:35:25 +03002445 else:
2446 return False
Michael Foord345266a2012-03-14 12:24:34 -07002447
2448 if self_name and other_name != self_name:
2449 return False
2450
2451 # this order is important for ANY to work!
2452 return (other_args, other_kwargs) == (self_args, self_kwargs)
2453
2454
Berker Peksagce913872016-03-28 00:30:02 +03002455 __ne__ = object.__ne__
2456
2457
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002458 def __call__(self, /, *args, **kwargs):
Andrew Dunaie63e6172018-12-04 11:08:45 +02002459 if self._mock_name is None:
Michael Foord345266a2012-03-14 12:24:34 -07002460 return _Call(('', args, kwargs), name='()')
2461
Andrew Dunaie63e6172018-12-04 11:08:45 +02002462 name = self._mock_name + '()'
2463 return _Call((self._mock_name, args, kwargs), name=name, parent=self)
Michael Foord345266a2012-03-14 12:24:34 -07002464
2465
2466 def __getattr__(self, attr):
Andrew Dunaie63e6172018-12-04 11:08:45 +02002467 if self._mock_name is None:
Michael Foord345266a2012-03-14 12:24:34 -07002468 return _Call(name=attr, from_kall=False)
Andrew Dunaie63e6172018-12-04 11:08:45 +02002469 name = '%s.%s' % (self._mock_name, attr)
Michael Foord345266a2012-03-14 12:24:34 -07002470 return _Call(name=name, parent=self, from_kall=False)
2471
2472
Miss Islington (bot)db0d8a52019-09-12 03:52:49 -07002473 def __getattribute__(self, attr):
2474 if attr in tuple.__dict__:
2475 raise AttributeError
2476 return tuple.__getattribute__(self, attr)
2477
2478
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002479 def count(self, /, *args, **kwargs):
Kushal Dasa37b9582014-09-16 18:33:37 +05302480 return self.__getattr__('count')(*args, **kwargs)
2481
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002482 def index(self, /, *args, **kwargs):
Kushal Dasa37b9582014-09-16 18:33:37 +05302483 return self.__getattr__('index')(*args, **kwargs)
2484
Kumar Akshayb0df45e2019-03-22 13:40:40 +05302485 def _get_call_arguments(self):
2486 if len(self) == 2:
2487 args, kwargs = self
2488 else:
2489 name, args, kwargs = self
2490
2491 return args, kwargs
2492
2493 @property
2494 def args(self):
2495 return self._get_call_arguments()[0]
2496
2497 @property
2498 def kwargs(self):
2499 return self._get_call_arguments()[1]
2500
Michael Foord345266a2012-03-14 12:24:34 -07002501 def __repr__(self):
Andrew Dunaie63e6172018-12-04 11:08:45 +02002502 if not self._mock_from_kall:
2503 name = self._mock_name or 'call'
Michael Foord345266a2012-03-14 12:24:34 -07002504 if name.startswith('()'):
2505 name = 'call%s' % name
2506 return name
2507
2508 if len(self) == 2:
2509 name = 'call'
2510 args, kwargs = self
2511 else:
2512 name, args, kwargs = self
2513 if not name:
2514 name = 'call'
2515 elif not name.startswith('()'):
2516 name = 'call.%s' % name
2517 else:
2518 name = 'call%s' % name
2519 return _format_call_signature(name, args, kwargs)
2520
2521
2522 def call_list(self):
2523 """For a call object that represents multiple calls, `call_list`
2524 returns a list of all the intermediate calls as well as the
2525 final call."""
2526 vals = []
2527 thing = self
2528 while thing is not None:
Andrew Dunaie63e6172018-12-04 11:08:45 +02002529 if thing._mock_from_kall:
Michael Foord345266a2012-03-14 12:24:34 -07002530 vals.append(thing)
Andrew Dunaie63e6172018-12-04 11:08:45 +02002531 thing = thing._mock_parent
Michael Foord345266a2012-03-14 12:24:34 -07002532 return _CallList(reversed(vals))
2533
2534
2535call = _Call(from_kall=False)
2536
2537
Michael Foord345266a2012-03-14 12:24:34 -07002538def create_autospec(spec, spec_set=False, instance=False, _parent=None,
2539 _name=None, **kwargs):
2540 """Create a mock object using another object as a spec. Attributes on the
2541 mock will use the corresponding attribute on the `spec` object as their
2542 spec.
2543
2544 Functions or methods being mocked will have their arguments checked
2545 to check that they are called with the correct signature.
2546
2547 If `spec_set` is True then attempting to set attributes that don't exist
2548 on the spec object will raise an `AttributeError`.
2549
2550 If a class is used as a spec then the return value of the mock (the
2551 instance of the class) will have the same spec. You can use a class as the
2552 spec for an instance object by passing `instance=True`. The returned mock
2553 will only be callable if instances of the mock are callable.
2554
2555 `create_autospec` also takes arbitrary keyword arguments that are passed to
2556 the constructor of the created mock."""
2557 if _is_list(spec):
2558 # can't pass a list instance to the mock constructor as it will be
2559 # interpreted as a list of strings
2560 spec = type(spec)
2561
2562 is_type = isinstance(spec, type)
Xtreakff6b2e62019-05-27 18:26:23 +05302563 is_async_func = _is_async_func(spec)
Michael Foord345266a2012-03-14 12:24:34 -07002564 _kwargs = {'spec': spec}
2565 if spec_set:
2566 _kwargs = {'spec_set': spec}
2567 elif spec is None:
2568 # None we mock with a normal mock without a spec
2569 _kwargs = {}
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002570 if _kwargs and instance:
2571 _kwargs['_spec_as_instance'] = True
Michael Foord345266a2012-03-14 12:24:34 -07002572
2573 _kwargs.update(kwargs)
2574
2575 Klass = MagicMock
Gregory P. Smithd4583d72016-08-15 23:23:40 -07002576 if inspect.isdatadescriptor(spec):
Michael Foord345266a2012-03-14 12:24:34 -07002577 # descriptors don't have a spec
2578 # because we don't know what type they return
2579 _kwargs = {}
Lisa Roach77b3b772019-05-20 09:19:53 -07002580 elif is_async_func:
2581 if instance:
2582 raise RuntimeError("Instance can not be True when create_autospec "
2583 "is mocking an async function")
2584 Klass = AsyncMock
Michael Foord345266a2012-03-14 12:24:34 -07002585 elif not _callable(spec):
2586 Klass = NonCallableMagicMock
2587 elif is_type and instance and not _instance_callable(spec):
2588 Klass = NonCallableMagicMock
2589
Kushal Das484f8a82014-04-16 01:05:50 +05302590 _name = _kwargs.pop('name', _name)
2591
Michael Foord345266a2012-03-14 12:24:34 -07002592 _new_name = _name
2593 if _parent is None:
2594 # for a top level object no _new_name should be set
2595 _new_name = ''
2596
2597 mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name,
2598 name=_name, **_kwargs)
2599
2600 if isinstance(spec, FunctionTypes):
2601 # should only happen at the top level because we don't
2602 # recurse for functions
2603 mock = _set_signature(mock, spec)
Lisa Roach77b3b772019-05-20 09:19:53 -07002604 if is_async_func:
Xtreakff6b2e62019-05-27 18:26:23 +05302605 _setup_async_mock(mock)
Michael Foord345266a2012-03-14 12:24:34 -07002606 else:
2607 _check_signature(spec, mock, is_type, instance)
2608
2609 if _parent is not None and not instance:
2610 _parent._mock_children[_name] = mock
2611
2612 if is_type and not instance and 'return_value' not in kwargs:
Michael Foord345266a2012-03-14 12:24:34 -07002613 mock.return_value = create_autospec(spec, spec_set, instance=True,
2614 _name='()', _parent=mock)
2615
2616 for entry in dir(spec):
2617 if _is_magic(entry):
2618 # MagicMock already does the useful magic methods for us
2619 continue
2620
Michael Foord345266a2012-03-14 12:24:34 -07002621 # XXXX do we need a better way of getting attributes without
2622 # triggering code execution (?) Probably not - we need the actual
2623 # object to mock it so we would rather trigger a property than mock
2624 # the property descriptor. Likewise we want to mock out dynamically
2625 # provided attributes.
Michael Foord656319e2012-04-13 17:39:16 +01002626 # XXXX what about attributes that raise exceptions other than
2627 # AttributeError on being fetched?
Michael Foord345266a2012-03-14 12:24:34 -07002628 # we could be resilient against it, or catch and propagate the
2629 # exception when the attribute is fetched from the mock
Michael Foord656319e2012-04-13 17:39:16 +01002630 try:
2631 original = getattr(spec, entry)
2632 except AttributeError:
2633 continue
Michael Foord345266a2012-03-14 12:24:34 -07002634
2635 kwargs = {'spec': original}
2636 if spec_set:
2637 kwargs = {'spec_set': original}
2638
2639 if not isinstance(original, FunctionTypes):
2640 new = _SpecState(original, spec_set, mock, entry, instance)
2641 mock._mock_children[entry] = new
2642 else:
2643 parent = mock
2644 if isinstance(spec, FunctionTypes):
2645 parent = mock.mock
2646
Michael Foord345266a2012-03-14 12:24:34 -07002647 skipfirst = _must_skip(spec, entry, is_type)
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002648 kwargs['_eat_self'] = skipfirst
Lisa Roach77b3b772019-05-20 09:19:53 -07002649 if asyncio.iscoroutinefunction(original):
2650 child_klass = AsyncMock
2651 else:
2652 child_klass = MagicMock
2653 new = child_klass(parent=parent, name=entry, _new_name=entry,
2654 _new_parent=parent,
2655 **kwargs)
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002656 mock._mock_children[entry] = new
Michael Foord345266a2012-03-14 12:24:34 -07002657 _check_signature(original, new, skipfirst=skipfirst)
2658
2659 # so functions created with _set_signature become instance attributes,
2660 # *plus* their underlying mock exists in _mock_children of the parent
2661 # mock. Adding to _mock_children may be unnecessary where we are also
2662 # setting as an instance attribute?
2663 if isinstance(new, FunctionTypes):
2664 setattr(mock, entry, new)
2665
2666 return mock
2667
2668
2669def _must_skip(spec, entry, is_type):
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002670 """
2671 Return whether we should skip the first argument on spec's `entry`
2672 attribute.
2673 """
Michael Foord345266a2012-03-14 12:24:34 -07002674 if not isinstance(spec, type):
2675 if entry in getattr(spec, '__dict__', {}):
2676 # instance attribute - shouldn't skip
2677 return False
Michael Foord345266a2012-03-14 12:24:34 -07002678 spec = spec.__class__
Michael Foord345266a2012-03-14 12:24:34 -07002679
2680 for klass in spec.__mro__:
2681 result = klass.__dict__.get(entry, DEFAULT)
2682 if result is DEFAULT:
2683 continue
2684 if isinstance(result, (staticmethod, classmethod)):
2685 return False
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002686 elif isinstance(getattr(result, '__get__', None), MethodWrapperTypes):
2687 # Normal method => skip if looked up on type
2688 # (if looked up on instance, self is already skipped)
2689 return is_type
2690 else:
2691 return False
Michael Foord345266a2012-03-14 12:24:34 -07002692
Chris Withersadbf1782019-05-01 23:04:04 +01002693 # function is a dynamically provided attribute
Michael Foord345266a2012-03-14 12:24:34 -07002694 return is_type
2695
2696
Michael Foord345266a2012-03-14 12:24:34 -07002697class _SpecState(object):
2698
2699 def __init__(self, spec, spec_set=False, parent=None,
2700 name=None, ids=None, instance=False):
2701 self.spec = spec
2702 self.ids = ids
2703 self.spec_set = spec_set
2704 self.parent = parent
2705 self.instance = instance
2706 self.name = name
2707
2708
2709FunctionTypes = (
2710 # python function
2711 type(create_autospec),
2712 # instance method
2713 type(ANY.__eq__),
Michael Foord345266a2012-03-14 12:24:34 -07002714)
2715
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002716MethodWrapperTypes = (
2717 type(ANY.__eq__.__get__),
2718)
2719
Michael Foord345266a2012-03-14 12:24:34 -07002720
Michael Foorda74561a2012-03-25 19:03:13 +01002721file_spec = None
Michael Foord345266a2012-03-14 12:24:34 -07002722
Michael Foord04cbe0c2013-03-19 17:22:51 -07002723
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002724def _to_stream(read_data):
2725 if isinstance(read_data, bytes):
2726 return io.BytesIO(read_data)
Michael Foord04cbe0c2013-03-19 17:22:51 -07002727 else:
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002728 return io.StringIO(read_data)
Michael Foord0dccf652012-03-25 19:11:50 +01002729
Robert Collins5329aaa2015-07-17 20:08:45 +12002730
Michael Foord0dccf652012-03-25 19:11:50 +01002731def mock_open(mock=None, read_data=''):
Michael Foord99254732012-03-25 19:07:33 +01002732 """
2733 A helper function to create a mock to replace the use of `open`. It works
2734 for `open` called directly or used as a context manager.
2735
2736 The `mock` argument is the mock object to configure. If `None` (the
2737 default) then a `MagicMock` will be created for you, with the API limited
2738 to methods or attributes available on standard file handles.
2739
Xtreak71f82a22018-12-20 21:30:21 +05302740 `read_data` is a string for the `read`, `readline` and `readlines` of the
Michael Foord04cbe0c2013-03-19 17:22:51 -07002741 file handle to return. This is an empty string by default.
Michael Foord99254732012-03-25 19:07:33 +01002742 """
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002743 _read_data = _to_stream(read_data)
2744 _state = [_read_data, None]
2745
Robert Collinsca647ef2015-07-24 03:48:20 +12002746 def _readlines_side_effect(*args, **kwargs):
2747 if handle.readlines.return_value is not None:
2748 return handle.readlines.return_value
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002749 return _state[0].readlines(*args, **kwargs)
Robert Collinsca647ef2015-07-24 03:48:20 +12002750
2751 def _read_side_effect(*args, **kwargs):
2752 if handle.read.return_value is not None:
2753 return handle.read.return_value
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002754 return _state[0].read(*args, **kwargs)
Robert Collinsca647ef2015-07-24 03:48:20 +12002755
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002756 def _readline_side_effect(*args, **kwargs):
Tony Flury20870232018-09-12 23:21:16 +01002757 yield from _iter_side_effect()
2758 while True:
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002759 yield _state[0].readline(*args, **kwargs)
Tony Flury20870232018-09-12 23:21:16 +01002760
2761 def _iter_side_effect():
Robert Collinsca647ef2015-07-24 03:48:20 +12002762 if handle.readline.return_value is not None:
2763 while True:
2764 yield handle.readline.return_value
2765 for line in _state[0]:
2766 yield line
Robert Collinsca647ef2015-07-24 03:48:20 +12002767
Damien Nadé394119a2019-05-23 12:03:25 +02002768 def _next_side_effect():
2769 if handle.readline.return_value is not None:
2770 return handle.readline.return_value
2771 return next(_state[0])
2772
Michael Foorda74561a2012-03-25 19:03:13 +01002773 global file_spec
2774 if file_spec is None:
2775 import _io
2776 file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO))))
2777
Michael Foord345266a2012-03-14 12:24:34 -07002778 if mock is None:
Michael Foord0dccf652012-03-25 19:11:50 +01002779 mock = MagicMock(name='open', spec=open)
Michael Foord345266a2012-03-14 12:24:34 -07002780
Robert Collinsca647ef2015-07-24 03:48:20 +12002781 handle = MagicMock(spec=file_spec)
2782 handle.__enter__.return_value = handle
Michael Foord04cbe0c2013-03-19 17:22:51 -07002783
Robert Collinsca647ef2015-07-24 03:48:20 +12002784 handle.write.return_value = None
2785 handle.read.return_value = None
2786 handle.readline.return_value = None
2787 handle.readlines.return_value = None
Michael Foord04cbe0c2013-03-19 17:22:51 -07002788
Robert Collinsca647ef2015-07-24 03:48:20 +12002789 handle.read.side_effect = _read_side_effect
2790 _state[1] = _readline_side_effect()
2791 handle.readline.side_effect = _state[1]
2792 handle.readlines.side_effect = _readlines_side_effect
Tony Flury20870232018-09-12 23:21:16 +01002793 handle.__iter__.side_effect = _iter_side_effect
Damien Nadé394119a2019-05-23 12:03:25 +02002794 handle.__next__.side_effect = _next_side_effect
Michael Foord345266a2012-03-14 12:24:34 -07002795
Robert Collinsca647ef2015-07-24 03:48:20 +12002796 def reset_data(*args, **kwargs):
Rémi Lapeyre11a88322019-05-07 12:48:36 +02002797 _state[0] = _to_stream(read_data)
Robert Collinsca647ef2015-07-24 03:48:20 +12002798 if handle.readline.side_effect == _state[1]:
2799 # Only reset the side effect if the user hasn't overridden it.
2800 _state[1] = _readline_side_effect()
2801 handle.readline.side_effect = _state[1]
2802 return DEFAULT
Robert Collins5329aaa2015-07-17 20:08:45 +12002803
Robert Collinsca647ef2015-07-24 03:48:20 +12002804 mock.side_effect = reset_data
2805 mock.return_value = handle
Michael Foord345266a2012-03-14 12:24:34 -07002806 return mock
2807
2808
2809class PropertyMock(Mock):
Michael Foord99254732012-03-25 19:07:33 +01002810 """
2811 A mock intended to be used as a property, or other descriptor, on a class.
2812 `PropertyMock` provides `__get__` and `__set__` methods so you can specify
2813 a return value when it is fetched.
2814
2815 Fetching a `PropertyMock` instance from an object calls the mock, with
2816 no args. Setting it calls the mock with the value being set.
2817 """
Serhiy Storchaka2085bd02019-06-01 11:00:15 +03002818 def _get_child_mock(self, /, **kwargs):
Michael Foordc2870622012-04-13 16:57:22 +01002819 return MagicMock(**kwargs)
2820
Miss Islington (bot)c71ae1a2019-08-29 02:02:51 -07002821 def __get__(self, obj, obj_type=None):
Michael Foord345266a2012-03-14 12:24:34 -07002822 return self()
2823 def __set__(self, obj, val):
2824 self(val)
Mario Corchero552be9d2017-10-17 12:35:11 +01002825
2826
2827def seal(mock):
Mario Corchero96200eb2018-10-19 22:57:37 +01002828 """Disable the automatic generation of child mocks.
Mario Corchero552be9d2017-10-17 12:35:11 +01002829
2830 Given an input Mock, seals it to ensure no further mocks will be generated
2831 when accessing an attribute that was not already defined.
2832
Mario Corchero96200eb2018-10-19 22:57:37 +01002833 The operation recursively seals the mock passed in, meaning that
2834 the mock itself, any mocks generated by accessing one of its attributes,
2835 and all assigned mocks without a name or spec will be sealed.
Mario Corchero552be9d2017-10-17 12:35:11 +01002836 """
2837 mock._mock_sealed = True
2838 for attr in dir(mock):
2839 try:
2840 m = getattr(mock, attr)
2841 except AttributeError:
2842 continue
2843 if not isinstance(m, NonCallableMock):
2844 continue
2845 if m._mock_new_parent is mock:
2846 seal(m)
Lisa Roach77b3b772019-05-20 09:19:53 -07002847
2848
2849async def _raise(exception):
2850 raise exception
2851
2852
2853class _AsyncIterator:
2854 """
2855 Wraps an iterator in an asynchronous iterator.
2856 """
2857 def __init__(self, iterator):
2858 self.iterator = iterator
2859 code_mock = NonCallableMock(spec_set=CodeType)
2860 code_mock.co_flags = inspect.CO_ITERABLE_COROUTINE
2861 self.__dict__['__code__'] = code_mock
2862
2863 def __aiter__(self):
2864 return self
2865
2866 async def __anext__(self):
2867 try:
2868 return next(self.iterator)
2869 except StopIteration:
2870 pass
2871 raise StopAsyncIteration
2872
2873
2874class _AwaitEvent:
2875 def __init__(self, mock):
2876 self._mock = mock
2877 self._condition = None
2878
2879 async def _notify(self):
2880 condition = self._get_condition()
2881 try:
2882 await condition.acquire()
2883 condition.notify_all()
2884 finally:
2885 condition.release()
2886
2887 def _get_condition(self):
2888 """
2889 Creation of condition is delayed, to minimize the chance of using the
2890 wrong loop.
2891 A user may create a mock with _AwaitEvent before selecting the
2892 execution loop. Requiring a user to delay creation is error-prone and
2893 inflexible. Instead, condition is created when user actually starts to
2894 use the mock.
2895 """
2896 # No synchronization is needed:
2897 # - asyncio is thread unsafe
2898 # - there are no awaits here, method will be executed without
2899 # switching asyncio context.
2900 if self._condition is None:
2901 self._condition = asyncio.Condition()
2902
2903 return self._condition