blob: c97ea7984a6eee7fef90500ceb112c144270bd72 [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
Miss Islington (bot)a9846e02018-06-10 22:05:22 -07005# 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',
16 'FILTER_DIR',
17 'NonCallableMock',
18 'NonCallableMagicMock',
19 'mock_open',
20 'PropertyMock',
Mario Corchero552be9d2017-10-17 12:35:11 +010021 'seal',
Michael Foord345266a2012-03-14 12:24:34 -070022)
23
24
25__version__ = '1.0'
26
27
28import inspect
29import pprint
30import sys
Michael Foordfddcfa22014-04-14 16:25:20 -040031import builtins
32from types import ModuleType
Antoine Pitrou5c64df72013-02-03 00:23:58 +010033from functools import wraps, partial
Michael Foord345266a2012-03-14 12:24:34 -070034
35
Michael Foordfddcfa22014-04-14 16:25:20 -040036_builtins = {name for name in dir(builtins) if not name.startswith('_')}
37
Michael Foord345266a2012-03-14 12:24:34 -070038BaseExceptions = (BaseException,)
39if 'java' in sys.platform:
40 # jython
41 import java
42 BaseExceptions = (BaseException, java.lang.Throwable)
43
44
45FILTER_DIR = True
46
Nick Coghlan0b43bcf2012-05-27 18:17:07 +100047# Workaround for issue #12370
48# Without this, the __class__ properties wouldn't be set correctly
49_safe_super = super
Michael Foord345266a2012-03-14 12:24:34 -070050
51def _is_instance_mock(obj):
52 # can't use isinstance on Mock objects because they override __class__
53 # The base class for all mocks is NonCallableMock
54 return issubclass(type(obj), NonCallableMock)
55
56
57def _is_exception(obj):
58 return (
59 isinstance(obj, BaseExceptions) or
60 isinstance(obj, type) and issubclass(obj, BaseExceptions)
61 )
62
63
Antoine Pitrou5c64df72013-02-03 00:23:58 +010064def _get_signature_object(func, as_instance, eat_self):
65 """
66 Given an arbitrary, possibly callable object, try to create a suitable
67 signature object.
68 Return a (reduced func, signature) tuple, or None.
69 """
70 if isinstance(func, type) and not as_instance:
71 # If it's a type and should be modelled as a type, use __init__.
Michael Foord345266a2012-03-14 12:24:34 -070072 try:
73 func = func.__init__
74 except AttributeError:
Antoine Pitrou5c64df72013-02-03 00:23:58 +010075 return None
76 # Skip the `self` argument in __init__
77 eat_self = True
Michael Foord345266a2012-03-14 12:24:34 -070078 elif not isinstance(func, FunctionTypes):
Antoine Pitrou5c64df72013-02-03 00:23:58 +010079 # If we really want to model an instance of the passed type,
80 # __call__ should be looked up, not __init__.
Michael Foord345266a2012-03-14 12:24:34 -070081 try:
82 func = func.__call__
83 except AttributeError:
Antoine Pitrou5c64df72013-02-03 00:23:58 +010084 return None
85 if eat_self:
86 sig_func = partial(func, None)
87 else:
88 sig_func = func
Michael Foord345266a2012-03-14 12:24:34 -070089 try:
Antoine Pitrou5c64df72013-02-03 00:23:58 +010090 return func, inspect.signature(sig_func)
91 except ValueError:
92 # Certain callable types are not supported by inspect.signature()
93 return None
Michael Foord345266a2012-03-14 12:24:34 -070094
95
96def _check_signature(func, mock, skipfirst, instance=False):
Antoine Pitrou5c64df72013-02-03 00:23:58 +010097 sig = _get_signature_object(func, instance, skipfirst)
98 if sig is None:
Michael Foord345266a2012-03-14 12:24:34 -070099 return
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100100 func, sig = sig
101 def checksig(_mock_self, *args, **kwargs):
102 sig.bind(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700103 _copy_func_details(func, checksig)
104 type(mock)._mock_check_sig = checksig
Miss Islington (bot)6a129312018-12-12 00:58:36 -0800105 type(mock).__signature__ = sig
Michael Foord345266a2012-03-14 12:24:34 -0700106
107
108def _copy_func_details(func, funcopy):
Michael Foord345266a2012-03-14 12:24:34 -0700109 # we explicitly don't copy func.__dict__ into this copy as it would
110 # expose original attributes that should be mocked
Berker Peksag161a4dd2016-12-15 05:21:44 +0300111 for attribute in (
112 '__name__', '__doc__', '__text_signature__',
113 '__module__', '__defaults__', '__kwdefaults__',
114 ):
115 try:
116 setattr(funcopy, attribute, getattr(func, attribute))
117 except AttributeError:
118 pass
Michael Foord345266a2012-03-14 12:24:34 -0700119
120
121def _callable(obj):
122 if isinstance(obj, type):
123 return True
124 if getattr(obj, '__call__', None) is not None:
125 return True
126 return False
127
128
129def _is_list(obj):
130 # checks for list or tuples
131 # XXXX badly named!
132 return type(obj) in (list, tuple)
133
134
135def _instance_callable(obj):
136 """Given an object, return True if the object is callable.
137 For classes, return True if instances would be callable."""
138 if not isinstance(obj, type):
139 # already an instance
140 return getattr(obj, '__call__', None) is not None
141
Michael Foorda74b3aa2012-03-14 14:40:22 -0700142 # *could* be broken by a class overriding __mro__ or __dict__ via
143 # a metaclass
144 for base in (obj,) + obj.__mro__:
145 if base.__dict__.get('__call__') is not None:
Michael Foord345266a2012-03-14 12:24:34 -0700146 return True
147 return False
148
149
150def _set_signature(mock, original, instance=False):
151 # creates a function with signature (*args, **kwargs) that delegates to a
152 # mock. It still does signature checking by calling a lambda with the same
153 # signature as the original.
154 if not _callable(original):
155 return
156
157 skipfirst = isinstance(original, type)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100158 result = _get_signature_object(original, instance, skipfirst)
Michael Foord345266a2012-03-14 12:24:34 -0700159 if result is None:
Aaron Gallagher856cbcc2017-07-19 17:01:14 -0700160 return mock
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100161 func, sig = result
162 def checksig(*args, **kwargs):
163 sig.bind(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700164 _copy_func_details(func, checksig)
165
166 name = original.__name__
167 if not name.isidentifier():
168 name = 'funcopy'
Michael Foord313f85f2012-03-25 18:16:07 +0100169 context = {'_checksig_': checksig, 'mock': mock}
Michael Foord345266a2012-03-14 12:24:34 -0700170 src = """def %s(*args, **kwargs):
Michael Foord313f85f2012-03-25 18:16:07 +0100171 _checksig_(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700172 return mock(*args, **kwargs)""" % name
173 exec (src, context)
174 funcopy = context[name]
Miss Islington (bot)6a129312018-12-12 00:58:36 -0800175 _setup_func(funcopy, mock, sig)
Michael Foord345266a2012-03-14 12:24:34 -0700176 return funcopy
177
178
Miss Islington (bot)6a129312018-12-12 00:58:36 -0800179def _setup_func(funcopy, mock, sig):
Michael Foord345266a2012-03-14 12:24:34 -0700180 funcopy.mock = mock
181
182 # can't use isinstance with mocks
183 if not _is_instance_mock(mock):
184 return
185
186 def assert_called_with(*args, **kwargs):
187 return mock.assert_called_with(*args, **kwargs)
Gregory P. Smithac5084b2016-10-06 14:31:23 -0700188 def assert_called(*args, **kwargs):
189 return mock.assert_called(*args, **kwargs)
190 def assert_not_called(*args, **kwargs):
191 return mock.assert_not_called(*args, **kwargs)
192 def assert_called_once(*args, **kwargs):
193 return mock.assert_called_once(*args, **kwargs)
Michael Foord345266a2012-03-14 12:24:34 -0700194 def assert_called_once_with(*args, **kwargs):
195 return mock.assert_called_once_with(*args, **kwargs)
196 def assert_has_calls(*args, **kwargs):
197 return mock.assert_has_calls(*args, **kwargs)
198 def assert_any_call(*args, **kwargs):
199 return mock.assert_any_call(*args, **kwargs)
200 def reset_mock():
201 funcopy.method_calls = _CallList()
202 funcopy.mock_calls = _CallList()
203 mock.reset_mock()
204 ret = funcopy.return_value
205 if _is_instance_mock(ret) and not ret is mock:
206 ret.reset_mock()
207
208 funcopy.called = False
209 funcopy.call_count = 0
210 funcopy.call_args = None
211 funcopy.call_args_list = _CallList()
212 funcopy.method_calls = _CallList()
213 funcopy.mock_calls = _CallList()
214
215 funcopy.return_value = mock.return_value
216 funcopy.side_effect = mock.side_effect
217 funcopy._mock_children = mock._mock_children
218
219 funcopy.assert_called_with = assert_called_with
220 funcopy.assert_called_once_with = assert_called_once_with
221 funcopy.assert_has_calls = assert_has_calls
222 funcopy.assert_any_call = assert_any_call
223 funcopy.reset_mock = reset_mock
Gregory P. Smithac5084b2016-10-06 14:31:23 -0700224 funcopy.assert_called = assert_called
225 funcopy.assert_not_called = assert_not_called
226 funcopy.assert_called_once = assert_called_once
Miss Islington (bot)6a129312018-12-12 00:58:36 -0800227 funcopy.__signature__ = sig
Michael Foord345266a2012-03-14 12:24:34 -0700228
229 mock._mock_delegate = funcopy
230
231
232def _is_magic(name):
233 return '__%s__' % name[2:-2] == name
234
235
236class _SentinelObject(object):
237 "A unique, named, sentinel object."
238 def __init__(self, name):
239 self.name = name
240
241 def __repr__(self):
242 return 'sentinel.%s' % self.name
243
Serhiy Storchakad9c956f2017-01-11 20:13:03 +0200244 def __reduce__(self):
245 return 'sentinel.%s' % self.name
246
Michael Foord345266a2012-03-14 12:24:34 -0700247
248class _Sentinel(object):
249 """Access attributes to return a named object, usable as a sentinel."""
250 def __init__(self):
251 self._sentinels = {}
252
253 def __getattr__(self, name):
254 if name == '__bases__':
255 # Without this help(unittest.mock) raises an exception
256 raise AttributeError
257 return self._sentinels.setdefault(name, _SentinelObject(name))
258
Serhiy Storchakad9c956f2017-01-11 20:13:03 +0200259 def __reduce__(self):
260 return 'sentinel'
261
Michael Foord345266a2012-03-14 12:24:34 -0700262
263sentinel = _Sentinel()
264
265DEFAULT = sentinel.DEFAULT
266_missing = sentinel.MISSING
267_deleted = sentinel.DELETED
268
269
Michael Foord345266a2012-03-14 12:24:34 -0700270def _copy(value):
271 if type(value) in (dict, list, tuple, set):
272 return type(value)(value)
273 return value
274
275
Serhiy Storchakac02d1882014-12-11 10:28:14 +0200276_allowed_names = {
277 'return_value', '_mock_return_value', 'side_effect',
278 '_mock_side_effect', '_mock_parent', '_mock_new_parent',
279 '_mock_name', '_mock_new_name'
280}
Michael Foord345266a2012-03-14 12:24:34 -0700281
282
283def _delegating_property(name):
284 _allowed_names.add(name)
285 _the_name = '_mock_' + name
286 def _get(self, name=name, _the_name=_the_name):
287 sig = self._mock_delegate
288 if sig is None:
289 return getattr(self, _the_name)
290 return getattr(sig, name)
291 def _set(self, value, name=name, _the_name=_the_name):
292 sig = self._mock_delegate
293 if sig is None:
294 self.__dict__[_the_name] = value
295 else:
296 setattr(sig, name, value)
297
298 return property(_get, _set)
299
300
301
302class _CallList(list):
303
304 def __contains__(self, value):
305 if not isinstance(value, list):
306 return list.__contains__(self, value)
307 len_value = len(value)
308 len_self = len(self)
309 if len_value > len_self:
310 return False
311
312 for i in range(0, len_self - len_value + 1):
313 sub_list = self[i:i+len_value]
314 if sub_list == value:
315 return True
316 return False
317
318 def __repr__(self):
319 return pprint.pformat(list(self))
320
321
322def _check_and_set_parent(parent, value, name, new_name):
323 if not _is_instance_mock(value):
324 return False
325 if ((value._mock_name or value._mock_new_name) or
326 (value._mock_parent is not None) or
327 (value._mock_new_parent is not None)):
328 return False
329
330 _parent = parent
331 while _parent is not None:
332 # setting a mock (value) as a child or return value of itself
333 # should not modify the mock
334 if _parent is value:
335 return False
336 _parent = _parent._mock_new_parent
337
338 if new_name:
339 value._mock_new_parent = parent
340 value._mock_new_name = new_name
341 if name:
342 value._mock_parent = parent
343 value._mock_name = name
344 return True
345
Michael Foord01bafdc2014-04-14 16:09:42 -0400346# Internal class to identify if we wrapped an iterator object or not.
347class _MockIter(object):
348 def __init__(self, obj):
349 self.obj = iter(obj)
350 def __iter__(self):
351 return self
352 def __next__(self):
353 return next(self.obj)
Michael Foord345266a2012-03-14 12:24:34 -0700354
355class Base(object):
356 _mock_return_value = DEFAULT
357 _mock_side_effect = None
358 def __init__(self, *args, **kwargs):
359 pass
360
361
362
363class NonCallableMock(Base):
364 """A non-callable version of `Mock`"""
365
366 def __new__(cls, *args, **kw):
367 # every instance has its own class
368 # so we can create magic methods on the
369 # class without stomping on other mocks
370 new = type(cls.__name__, (cls,), {'__doc__': cls.__doc__})
371 instance = object.__new__(new)
372 return instance
373
374
375 def __init__(
376 self, spec=None, wraps=None, name=None, spec_set=None,
377 parent=None, _spec_state=None, _new_name='', _new_parent=None,
Kushal Das8c145342014-04-16 23:32:21 +0530378 _spec_as_instance=False, _eat_self=None, unsafe=False, **kwargs
Michael Foord345266a2012-03-14 12:24:34 -0700379 ):
380 if _new_parent is None:
381 _new_parent = parent
382
383 __dict__ = self.__dict__
384 __dict__['_mock_parent'] = parent
385 __dict__['_mock_name'] = name
386 __dict__['_mock_new_name'] = _new_name
387 __dict__['_mock_new_parent'] = _new_parent
Mario Corchero552be9d2017-10-17 12:35:11 +0100388 __dict__['_mock_sealed'] = False
Michael Foord345266a2012-03-14 12:24:34 -0700389
390 if spec_set is not None:
391 spec = spec_set
392 spec_set = True
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100393 if _eat_self is None:
394 _eat_self = parent is not None
Michael Foord345266a2012-03-14 12:24:34 -0700395
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100396 self._mock_add_spec(spec, spec_set, _spec_as_instance, _eat_self)
Michael Foord345266a2012-03-14 12:24:34 -0700397
398 __dict__['_mock_children'] = {}
399 __dict__['_mock_wraps'] = wraps
400 __dict__['_mock_delegate'] = None
401
402 __dict__['_mock_called'] = False
403 __dict__['_mock_call_args'] = None
404 __dict__['_mock_call_count'] = 0
405 __dict__['_mock_call_args_list'] = _CallList()
406 __dict__['_mock_mock_calls'] = _CallList()
407
408 __dict__['method_calls'] = _CallList()
Kushal Das8c145342014-04-16 23:32:21 +0530409 __dict__['_mock_unsafe'] = unsafe
Michael Foord345266a2012-03-14 12:24:34 -0700410
411 if kwargs:
412 self.configure_mock(**kwargs)
413
Nick Coghlan0b43bcf2012-05-27 18:17:07 +1000414 _safe_super(NonCallableMock, self).__init__(
Michael Foord345266a2012-03-14 12:24:34 -0700415 spec, wraps, name, spec_set, parent,
416 _spec_state
417 )
418
419
420 def attach_mock(self, mock, attribute):
421 """
422 Attach a mock as an attribute of this one, replacing its name and
423 parent. Calls to the attached mock will be recorded in the
424 `method_calls` and `mock_calls` attributes of this one."""
425 mock._mock_parent = None
426 mock._mock_new_parent = None
427 mock._mock_name = ''
428 mock._mock_new_name = None
429
430 setattr(self, attribute, mock)
431
432
433 def mock_add_spec(self, spec, spec_set=False):
434 """Add a spec to a mock. `spec` can either be an object or a
435 list of strings. Only attributes on the `spec` can be fetched as
436 attributes from the mock.
437
438 If `spec_set` is True then only attributes on the spec can be set."""
439 self._mock_add_spec(spec, spec_set)
440
441
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100442 def _mock_add_spec(self, spec, spec_set, _spec_as_instance=False,
443 _eat_self=False):
Michael Foord345266a2012-03-14 12:24:34 -0700444 _spec_class = None
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100445 _spec_signature = None
Michael Foord345266a2012-03-14 12:24:34 -0700446
447 if spec is not None and not _is_list(spec):
448 if isinstance(spec, type):
449 _spec_class = spec
450 else:
451 _spec_class = _get_class(spec)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100452 res = _get_signature_object(spec,
453 _spec_as_instance, _eat_self)
454 _spec_signature = res and res[1]
Michael Foord345266a2012-03-14 12:24:34 -0700455
456 spec = dir(spec)
457
458 __dict__ = self.__dict__
459 __dict__['_spec_class'] = _spec_class
460 __dict__['_spec_set'] = spec_set
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100461 __dict__['_spec_signature'] = _spec_signature
Michael Foord345266a2012-03-14 12:24:34 -0700462 __dict__['_mock_methods'] = spec
463
464
465 def __get_return_value(self):
466 ret = self._mock_return_value
467 if self._mock_delegate is not None:
468 ret = self._mock_delegate.return_value
469
470 if ret is DEFAULT:
471 ret = self._get_child_mock(
472 _new_parent=self, _new_name='()'
473 )
474 self.return_value = ret
475 return ret
476
477
478 def __set_return_value(self, value):
479 if self._mock_delegate is not None:
480 self._mock_delegate.return_value = value
481 else:
482 self._mock_return_value = value
483 _check_and_set_parent(self, value, None, '()')
484
485 __return_value_doc = "The value to be returned when the mock is called."
486 return_value = property(__get_return_value, __set_return_value,
487 __return_value_doc)
488
489
490 @property
491 def __class__(self):
492 if self._spec_class is None:
493 return type(self)
494 return self._spec_class
495
496 called = _delegating_property('called')
497 call_count = _delegating_property('call_count')
498 call_args = _delegating_property('call_args')
499 call_args_list = _delegating_property('call_args_list')
500 mock_calls = _delegating_property('mock_calls')
501
502
503 def __get_side_effect(self):
504 delegated = self._mock_delegate
505 if delegated is None:
506 return self._mock_side_effect
Michael Foord01bafdc2014-04-14 16:09:42 -0400507 sf = delegated.side_effect
Robert Collinsf58f88c2015-07-14 13:51:40 +1200508 if (sf is not None and not callable(sf)
509 and not isinstance(sf, _MockIter) and not _is_exception(sf)):
Michael Foord01bafdc2014-04-14 16:09:42 -0400510 sf = _MockIter(sf)
511 delegated.side_effect = sf
512 return sf
Michael Foord345266a2012-03-14 12:24:34 -0700513
514 def __set_side_effect(self, value):
515 value = _try_iter(value)
516 delegated = self._mock_delegate
517 if delegated is None:
518 self._mock_side_effect = value
519 else:
520 delegated.side_effect = value
521
522 side_effect = property(__get_side_effect, __set_side_effect)
523
524
Kushal Das9cd39a12016-06-02 10:20:16 -0700525 def reset_mock(self, visited=None,*, return_value=False, side_effect=False):
Michael Foord345266a2012-03-14 12:24:34 -0700526 "Restore the mock object to its initial state."
Robert Collinsb37f43f2015-07-15 11:42:28 +1200527 if visited is None:
528 visited = []
529 if id(self) in visited:
530 return
531 visited.append(id(self))
532
Michael Foord345266a2012-03-14 12:24:34 -0700533 self.called = False
534 self.call_args = None
535 self.call_count = 0
536 self.mock_calls = _CallList()
537 self.call_args_list = _CallList()
538 self.method_calls = _CallList()
539
Kushal Das9cd39a12016-06-02 10:20:16 -0700540 if return_value:
541 self._mock_return_value = DEFAULT
542 if side_effect:
543 self._mock_side_effect = None
544
Michael Foord345266a2012-03-14 12:24:34 -0700545 for child in self._mock_children.values():
Miss Islington (bot)422c1652018-12-01 02:24:47 -0800546 if isinstance(child, _SpecState) or child is _deleted:
Michael Foord75963642012-06-09 17:31:59 +0100547 continue
Robert Collinsb37f43f2015-07-15 11:42:28 +1200548 child.reset_mock(visited)
Michael Foord345266a2012-03-14 12:24:34 -0700549
550 ret = self._mock_return_value
551 if _is_instance_mock(ret) and ret is not self:
Robert Collinsb37f43f2015-07-15 11:42:28 +1200552 ret.reset_mock(visited)
Michael Foord345266a2012-03-14 12:24:34 -0700553
554
555 def configure_mock(self, **kwargs):
556 """Set attributes on the mock through keyword arguments.
557
558 Attributes plus return values and side effects can be set on child
559 mocks using standard dot notation and unpacking a dictionary in the
560 method call:
561
562 >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
563 >>> mock.configure_mock(**attrs)"""
564 for arg, val in sorted(kwargs.items(),
565 # we sort on the number of dots so that
566 # attributes are set before we set attributes on
567 # attributes
568 key=lambda entry: entry[0].count('.')):
569 args = arg.split('.')
570 final = args.pop()
571 obj = self
572 for entry in args:
573 obj = getattr(obj, entry)
574 setattr(obj, final, val)
575
576
577 def __getattr__(self, name):
Kushal Das8c145342014-04-16 23:32:21 +0530578 if name in {'_mock_methods', '_mock_unsafe'}:
Michael Foord345266a2012-03-14 12:24:34 -0700579 raise AttributeError(name)
580 elif self._mock_methods is not None:
581 if name not in self._mock_methods or name in _all_magics:
582 raise AttributeError("Mock object has no attribute %r" % name)
583 elif _is_magic(name):
584 raise AttributeError(name)
Kushal Das8c145342014-04-16 23:32:21 +0530585 if not self._mock_unsafe:
586 if name.startswith(('assert', 'assret')):
587 raise AttributeError(name)
Michael Foord345266a2012-03-14 12:24:34 -0700588
589 result = self._mock_children.get(name)
590 if result is _deleted:
591 raise AttributeError(name)
592 elif result is None:
593 wraps = None
594 if self._mock_wraps is not None:
595 # XXXX should we get the attribute without triggering code
596 # execution?
597 wraps = getattr(self._mock_wraps, name)
598
599 result = self._get_child_mock(
600 parent=self, name=name, wraps=wraps, _new_name=name,
601 _new_parent=self
602 )
603 self._mock_children[name] = result
604
605 elif isinstance(result, _SpecState):
606 result = create_autospec(
607 result.spec, result.spec_set, result.instance,
608 result.parent, result.name
609 )
610 self._mock_children[name] = result
611
612 return result
613
614
Mario Corchero552be9d2017-10-17 12:35:11 +0100615 def _extract_mock_name(self):
Michael Foord345266a2012-03-14 12:24:34 -0700616 _name_list = [self._mock_new_name]
617 _parent = self._mock_new_parent
618 last = self
619
620 dot = '.'
621 if _name_list == ['()']:
622 dot = ''
623 seen = set()
624 while _parent is not None:
625 last = _parent
626
627 _name_list.append(_parent._mock_new_name + dot)
628 dot = '.'
629 if _parent._mock_new_name == '()':
630 dot = ''
631
632 _parent = _parent._mock_new_parent
633
634 # use ids here so as not to call __hash__ on the mocks
635 if id(_parent) in seen:
636 break
637 seen.add(id(_parent))
638
639 _name_list = list(reversed(_name_list))
640 _first = last._mock_name or 'mock'
641 if len(_name_list) > 1:
642 if _name_list[1] not in ('()', '().'):
643 _first += '.'
644 _name_list[0] = _first
Mario Corchero552be9d2017-10-17 12:35:11 +0100645 return ''.join(_name_list)
646
647 def __repr__(self):
648 name = self._extract_mock_name()
Michael Foord345266a2012-03-14 12:24:34 -0700649
650 name_string = ''
651 if name not in ('mock', 'mock.'):
652 name_string = ' name=%r' % name
653
654 spec_string = ''
655 if self._spec_class is not None:
656 spec_string = ' spec=%r'
657 if self._spec_set:
658 spec_string = ' spec_set=%r'
659 spec_string = spec_string % self._spec_class.__name__
660 return "<%s%s%s id='%s'>" % (
661 type(self).__name__,
662 name_string,
663 spec_string,
664 id(self)
665 )
666
667
668 def __dir__(self):
Michael Foordd7c65e22012-03-14 14:56:54 -0700669 """Filter the output of `dir(mock)` to only useful members."""
Michael Foord313f85f2012-03-25 18:16:07 +0100670 if not FILTER_DIR:
671 return object.__dir__(self)
672
Michael Foord345266a2012-03-14 12:24:34 -0700673 extras = self._mock_methods or []
674 from_type = dir(type(self))
675 from_dict = list(self.__dict__)
676
Michael Foord313f85f2012-03-25 18:16:07 +0100677 from_type = [e for e in from_type if not e.startswith('_')]
678 from_dict = [e for e in from_dict if not e.startswith('_') or
679 _is_magic(e)]
Michael Foord345266a2012-03-14 12:24:34 -0700680 return sorted(set(extras + from_type + from_dict +
681 list(self._mock_children)))
682
683
684 def __setattr__(self, name, value):
685 if name in _allowed_names:
686 # property setters go through here
687 return object.__setattr__(self, name, value)
688 elif (self._spec_set and self._mock_methods is not None and
689 name not in self._mock_methods and
690 name not in self.__dict__):
691 raise AttributeError("Mock object has no attribute '%s'" % name)
692 elif name in _unsupported_magics:
693 msg = 'Attempting to set unsupported magic method %r.' % name
694 raise AttributeError(msg)
695 elif name in _all_magics:
696 if self._mock_methods is not None and name not in self._mock_methods:
697 raise AttributeError("Mock object has no attribute '%s'" % name)
698
699 if not _is_instance_mock(value):
700 setattr(type(self), name, _get_method(name, value))
701 original = value
702 value = lambda *args, **kw: original(self, *args, **kw)
703 else:
704 # only set _new_name and not name so that mock_calls is tracked
705 # but not method calls
706 _check_and_set_parent(self, value, None, name)
707 setattr(type(self), name, value)
Michael Foord75963642012-06-09 17:31:59 +0100708 self._mock_children[name] = value
Michael Foord345266a2012-03-14 12:24:34 -0700709 elif name == '__class__':
710 self._spec_class = value
711 return
712 else:
713 if _check_and_set_parent(self, value, name, name):
714 self._mock_children[name] = value
Mario Corchero552be9d2017-10-17 12:35:11 +0100715
716 if self._mock_sealed and not hasattr(self, name):
717 mock_name = f'{self._extract_mock_name()}.{name}'
718 raise AttributeError(f'Cannot set {mock_name}')
719
Michael Foord345266a2012-03-14 12:24:34 -0700720 return object.__setattr__(self, name, value)
721
722
723 def __delattr__(self, name):
724 if name in _all_magics and name in type(self).__dict__:
725 delattr(type(self), name)
726 if name not in self.__dict__:
727 # for magic methods that are still MagicProxy objects and
728 # not set on the instance itself
729 return
730
Michael Foord345266a2012-03-14 12:24:34 -0700731 obj = self._mock_children.get(name, _missing)
Miss Islington (bot)d358a8c2019-01-21 01:37:54 -0800732 if name in self.__dict__:
733 super().__delattr__(name)
734 elif obj is _deleted:
Michael Foord345266a2012-03-14 12:24:34 -0700735 raise AttributeError(name)
736 if obj is not _missing:
737 del self._mock_children[name]
738 self._mock_children[name] = _deleted
739
740
Michael Foord345266a2012-03-14 12:24:34 -0700741 def _format_mock_call_signature(self, args, kwargs):
742 name = self._mock_name or 'mock'
743 return _format_call_signature(name, args, kwargs)
744
745
746 def _format_mock_failure_message(self, args, kwargs):
747 message = 'Expected call: %s\nActual call: %s'
748 expected_string = self._format_mock_call_signature(args, kwargs)
749 call_args = self.call_args
750 if len(call_args) == 3:
751 call_args = call_args[1:]
752 actual_string = self._format_mock_call_signature(*call_args)
753 return message % (expected_string, actual_string)
754
755
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100756 def _call_matcher(self, _call):
757 """
Martin Panter204bf0b2016-07-11 07:51:37 +0000758 Given a call (or simply an (args, kwargs) tuple), return a
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100759 comparison key suitable for matching with other calls.
760 This is a best effort method which relies on the spec's signature,
761 if available, or falls back on the arguments themselves.
762 """
763 sig = self._spec_signature
764 if sig is not None:
765 if len(_call) == 2:
766 name = ''
767 args, kwargs = _call
768 else:
769 name, args, kwargs = _call
770 try:
771 return name, sig.bind(*args, **kwargs)
772 except TypeError as e:
773 return e.with_traceback(None)
774 else:
775 return _call
776
Kushal Das68290f42014-04-17 01:54:07 +0530777 def assert_not_called(_mock_self):
Kushal Das8af9db32014-04-17 01:36:14 +0530778 """assert that the mock was never called.
779 """
780 self = _mock_self
781 if self.call_count != 0:
782 msg = ("Expected '%s' to not have been called. Called %s times." %
783 (self._mock_name or 'mock', self.call_count))
784 raise AssertionError(msg)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100785
Victor Stinner2c2a4e62016-03-11 22:17:48 +0100786 def assert_called(_mock_self):
787 """assert that the mock was called at least once
788 """
789 self = _mock_self
790 if self.call_count == 0:
791 msg = ("Expected '%s' to have been called." %
792 self._mock_name or 'mock')
793 raise AssertionError(msg)
794
795 def assert_called_once(_mock_self):
796 """assert that the mock was called only once.
797 """
798 self = _mock_self
799 if not self.call_count == 1:
800 msg = ("Expected '%s' to have been called once. Called %s times." %
801 (self._mock_name or 'mock', self.call_count))
802 raise AssertionError(msg)
803
Michael Foord345266a2012-03-14 12:24:34 -0700804 def assert_called_with(_mock_self, *args, **kwargs):
805 """assert that the mock was called with the specified arguments.
806
807 Raises an AssertionError if the args and keyword args passed in are
808 different to the last call to the mock."""
809 self = _mock_self
810 if self.call_args is None:
811 expected = self._format_mock_call_signature(args, kwargs)
812 raise AssertionError('Expected call: %s\nNot called' % (expected,))
813
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100814 def _error_message():
Michael Foord345266a2012-03-14 12:24:34 -0700815 msg = self._format_mock_failure_message(args, kwargs)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100816 return msg
817 expected = self._call_matcher((args, kwargs))
818 actual = self._call_matcher(self.call_args)
819 if expected != actual:
820 cause = expected if isinstance(expected, Exception) else None
821 raise AssertionError(_error_message()) from cause
Michael Foord345266a2012-03-14 12:24:34 -0700822
823
824 def assert_called_once_with(_mock_self, *args, **kwargs):
Arne de Laat324c5d82017-02-23 15:57:25 +0100825 """assert that the mock was called exactly once and that that call was
826 with the specified arguments."""
Michael Foord345266a2012-03-14 12:24:34 -0700827 self = _mock_self
828 if not self.call_count == 1:
Michael Foord28d591c2012-09-28 16:15:22 +0100829 msg = ("Expected '%s' to be called once. Called %s times." %
830 (self._mock_name or 'mock', self.call_count))
Michael Foord345266a2012-03-14 12:24:34 -0700831 raise AssertionError(msg)
832 return self.assert_called_with(*args, **kwargs)
833
834
835 def assert_has_calls(self, calls, any_order=False):
836 """assert the mock has been called with the specified calls.
837 The `mock_calls` list is checked for the calls.
838
839 If `any_order` is False (the default) then the calls must be
840 sequential. There can be extra calls before or after the
841 specified calls.
842
843 If `any_order` is True then the calls can be in any order, but
844 they must all appear in `mock_calls`."""
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100845 expected = [self._call_matcher(c) for c in calls]
846 cause = expected if isinstance(expected, Exception) else None
847 all_calls = _CallList(self._call_matcher(c) for c in self.mock_calls)
Michael Foord345266a2012-03-14 12:24:34 -0700848 if not any_order:
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100849 if expected not in all_calls:
Michael Foord345266a2012-03-14 12:24:34 -0700850 raise AssertionError(
851 'Calls not found.\nExpected: %r\n'
Senthil Kumaran121edbf2016-01-12 06:18:32 -0800852 'Actual: %r' % (_CallList(calls), self.mock_calls)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100853 ) from cause
Michael Foord345266a2012-03-14 12:24:34 -0700854 return
855
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100856 all_calls = list(all_calls)
Michael Foord345266a2012-03-14 12:24:34 -0700857
858 not_found = []
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100859 for kall in expected:
Michael Foord345266a2012-03-14 12:24:34 -0700860 try:
861 all_calls.remove(kall)
862 except ValueError:
863 not_found.append(kall)
864 if not_found:
865 raise AssertionError(
866 '%r not all found in call list' % (tuple(not_found),)
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100867 ) from cause
Michael Foord345266a2012-03-14 12:24:34 -0700868
869
870 def assert_any_call(self, *args, **kwargs):
871 """assert the mock has been called with the specified arguments.
872
873 The assert passes if the mock has *ever* been called, unlike
874 `assert_called_with` and `assert_called_once_with` that only pass if
875 the call is the most recent one."""
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100876 expected = self._call_matcher((args, kwargs))
877 actual = [self._call_matcher(c) for c in self.call_args_list]
878 if expected not in actual:
879 cause = expected if isinstance(expected, Exception) else None
Michael Foord345266a2012-03-14 12:24:34 -0700880 expected_string = self._format_mock_call_signature(args, kwargs)
881 raise AssertionError(
882 '%s call not found' % expected_string
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100883 ) from cause
Michael Foord345266a2012-03-14 12:24:34 -0700884
885
886 def _get_child_mock(self, **kw):
887 """Create the child mocks for attributes and return value.
888 By default child mocks will be the same type as the parent.
889 Subclasses of Mock may want to override this to customize the way
890 child mocks are made.
891
892 For non-callable mocks the callable variant will be used (rather than
893 any custom subclass)."""
894 _type = type(self)
895 if not issubclass(_type, CallableMixin):
896 if issubclass(_type, NonCallableMagicMock):
897 klass = MagicMock
898 elif issubclass(_type, NonCallableMock) :
899 klass = Mock
900 else:
901 klass = _type.__mro__[1]
Mario Corchero552be9d2017-10-17 12:35:11 +0100902
903 if self._mock_sealed:
904 attribute = "." + kw["name"] if "name" in kw else "()"
905 mock_name = self._extract_mock_name() + attribute
906 raise AttributeError(mock_name)
907
Michael Foord345266a2012-03-14 12:24:34 -0700908 return klass(**kw)
909
910
911
912def _try_iter(obj):
913 if obj is None:
914 return obj
915 if _is_exception(obj):
916 return obj
917 if _callable(obj):
918 return obj
919 try:
920 return iter(obj)
921 except TypeError:
922 # XXXX backwards compatibility
923 # but this will blow up on first call - so maybe we should fail early?
924 return obj
925
926
927
928class CallableMixin(Base):
929
930 def __init__(self, spec=None, side_effect=None, return_value=DEFAULT,
931 wraps=None, name=None, spec_set=None, parent=None,
932 _spec_state=None, _new_name='', _new_parent=None, **kwargs):
933 self.__dict__['_mock_return_value'] = return_value
934
Nick Coghlan0b43bcf2012-05-27 18:17:07 +1000935 _safe_super(CallableMixin, self).__init__(
Michael Foord345266a2012-03-14 12:24:34 -0700936 spec, wraps, name, spec_set, parent,
937 _spec_state, _new_name, _new_parent, **kwargs
938 )
939
940 self.side_effect = side_effect
941
942
943 def _mock_check_sig(self, *args, **kwargs):
944 # stub method that can be replaced with one with a specific signature
945 pass
946
947
948 def __call__(_mock_self, *args, **kwargs):
949 # can't use self in-case a function / method we are mocking uses self
950 # in the signature
951 _mock_self._mock_check_sig(*args, **kwargs)
952 return _mock_self._mock_call(*args, **kwargs)
953
954
955 def _mock_call(_mock_self, *args, **kwargs):
956 self = _mock_self
957 self.called = True
958 self.call_count += 1
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100959
Miss Islington (bot)e8f9e472018-12-03 13:54:44 -0800960 # handle call_args
Antoine Pitrou5c64df72013-02-03 00:23:58 +0100961 _call = _Call((args, kwargs), two=True)
962 self.call_args = _call
963 self.call_args_list.append(_call)
Michael Foord345266a2012-03-14 12:24:34 -0700964
965 seen = set()
Miss Islington (bot)e8f9e472018-12-03 13:54:44 -0800966
967 # initial stuff for method_calls:
Michael Foord345266a2012-03-14 12:24:34 -0700968 do_method_calls = self._mock_parent is not None
Miss Islington (bot)e8f9e472018-12-03 13:54:44 -0800969 method_call_name = self._mock_name
970
971 # initial stuff for mock_calls:
972 mock_call_name = self._mock_new_name
973 is_a_call = mock_call_name == '()'
974 self.mock_calls.append(_Call(('', args, kwargs)))
975
976 # follow up the chain of mocks:
977 _new_parent = self._mock_new_parent
Michael Foord345266a2012-03-14 12:24:34 -0700978 while _new_parent is not None:
Michael Foord345266a2012-03-14 12:24:34 -0700979
Miss Islington (bot)e8f9e472018-12-03 13:54:44 -0800980 # handle method_calls:
Michael Foord345266a2012-03-14 12:24:34 -0700981 if do_method_calls:
Miss Islington (bot)e8f9e472018-12-03 13:54:44 -0800982 _new_parent.method_calls.append(_Call((method_call_name, args, kwargs)))
Michael Foord345266a2012-03-14 12:24:34 -0700983 do_method_calls = _new_parent._mock_parent is not None
984 if do_method_calls:
Miss Islington (bot)e8f9e472018-12-03 13:54:44 -0800985 method_call_name = _new_parent._mock_name + '.' + method_call_name
Michael Foord345266a2012-03-14 12:24:34 -0700986
Miss Islington (bot)e8f9e472018-12-03 13:54:44 -0800987 # handle mock_calls:
988 this_mock_call = _Call((mock_call_name, args, kwargs))
Michael Foord345266a2012-03-14 12:24:34 -0700989 _new_parent.mock_calls.append(this_mock_call)
Miss Islington (bot)e8f9e472018-12-03 13:54:44 -0800990
991 if _new_parent._mock_new_name:
992 if is_a_call:
993 dot = ''
994 else:
995 dot = '.'
996 is_a_call = _new_parent._mock_new_name == '()'
997 mock_call_name = _new_parent._mock_new_name + dot + mock_call_name
998
999 # follow the parental chain:
Michael Foord345266a2012-03-14 12:24:34 -07001000 _new_parent = _new_parent._mock_new_parent
1001
Miss Islington (bot)e8f9e472018-12-03 13:54:44 -08001002 # check we're not in an infinite loop:
1003 # ( use ids here so as not to call __hash__ on the mocks)
Michael Foord345266a2012-03-14 12:24:34 -07001004 _new_parent_id = id(_new_parent)
1005 if _new_parent_id in seen:
1006 break
1007 seen.add(_new_parent_id)
1008
Michael Foord345266a2012-03-14 12:24:34 -07001009 effect = self.side_effect
1010 if effect is not None:
1011 if _is_exception(effect):
1012 raise effect
Miss Islington (bot)ee2c5a82018-12-08 03:47:01 -08001013 elif not _callable(effect):
Michael Foord2cd48732012-04-21 15:52:11 +01001014 result = next(effect)
1015 if _is_exception(result):
1016 raise result
Miss Islington (bot)ee2c5a82018-12-08 03:47:01 -08001017 else:
1018 result = effect(*args, **kwargs)
1019
1020 if result is not DEFAULT:
Michael Foord2cd48732012-04-21 15:52:11 +01001021 return result
Michael Foord345266a2012-03-14 12:24:34 -07001022
Miss Islington (bot)ee2c5a82018-12-08 03:47:01 -08001023 if self._mock_return_value is not DEFAULT:
1024 return self.return_value
Michael Foord345266a2012-03-14 12:24:34 -07001025
Miss Islington (bot)ee2c5a82018-12-08 03:47:01 -08001026 if self._mock_wraps is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001027 return self._mock_wraps(*args, **kwargs)
Miss Islington (bot)ee2c5a82018-12-08 03:47:01 -08001028
1029 return self.return_value
Michael Foord345266a2012-03-14 12:24:34 -07001030
1031
1032
1033class Mock(CallableMixin, NonCallableMock):
1034 """
1035 Create a new `Mock` object. `Mock` takes several optional arguments
1036 that specify the behaviour of the Mock object:
1037
1038 * `spec`: This can be either a list of strings or an existing object (a
1039 class or instance) that acts as the specification for the mock object. If
1040 you pass in an object then a list of strings is formed by calling dir on
1041 the object (excluding unsupported magic attributes and methods). Accessing
1042 any attribute not in this list will raise an `AttributeError`.
1043
1044 If `spec` is an object (rather than a list of strings) then
1045 `mock.__class__` returns the class of the spec object. This allows mocks
1046 to pass `isinstance` tests.
1047
1048 * `spec_set`: A stricter variant of `spec`. If used, attempting to *set*
1049 or get an attribute on the mock that isn't on the object passed as
1050 `spec_set` will raise an `AttributeError`.
1051
1052 * `side_effect`: A function to be called whenever the Mock is called. See
1053 the `side_effect` attribute. Useful for raising exceptions or
1054 dynamically changing return values. The function is called with the same
1055 arguments as the mock, and unless it returns `DEFAULT`, the return
1056 value of this function is used as the return value.
1057
Michael Foord2cd48732012-04-21 15:52:11 +01001058 If `side_effect` is an iterable then each call to the mock will return
1059 the next value from the iterable. If any of the members of the iterable
1060 are exceptions they will be raised instead of returned.
Michael Foord345266a2012-03-14 12:24:34 -07001061
Michael Foord345266a2012-03-14 12:24:34 -07001062 * `return_value`: The value returned when the mock is called. By default
1063 this is a new Mock (created on first access). See the
1064 `return_value` attribute.
1065
Michael Foord0682a0c2012-04-13 20:51:20 +01001066 * `wraps`: Item for the mock object to wrap. If `wraps` is not None then
1067 calling the Mock will pass the call through to the wrapped object
1068 (returning the real result). Attribute access on the mock will return a
1069 Mock object that wraps the corresponding attribute of the wrapped object
1070 (so attempting to access an attribute that doesn't exist will raise an
1071 `AttributeError`).
Michael Foord345266a2012-03-14 12:24:34 -07001072
1073 If the mock has an explicit `return_value` set then calls are not passed
1074 to the wrapped object and the `return_value` is returned instead.
1075
1076 * `name`: If the mock has a name then it will be used in the repr of the
1077 mock. This can be useful for debugging. The name is propagated to child
1078 mocks.
1079
1080 Mocks can also be called with arbitrary keyword arguments. These will be
1081 used to set attributes on the mock after it is created.
1082 """
1083
1084
1085
1086def _dot_lookup(thing, comp, import_path):
1087 try:
1088 return getattr(thing, comp)
1089 except AttributeError:
1090 __import__(import_path)
1091 return getattr(thing, comp)
1092
1093
1094def _importer(target):
1095 components = target.split('.')
1096 import_path = components.pop(0)
1097 thing = __import__(import_path)
1098
1099 for comp in components:
1100 import_path += ".%s" % comp
1101 thing = _dot_lookup(thing, comp, import_path)
1102 return thing
1103
1104
1105def _is_started(patcher):
1106 # XXXX horrible
1107 return hasattr(patcher, 'is_local')
1108
1109
1110class _patch(object):
1111
1112 attribute_name = None
Michael Foordebc1a302014-04-15 17:21:08 -04001113 _active_patches = []
Michael Foord345266a2012-03-14 12:24:34 -07001114
1115 def __init__(
1116 self, getter, attribute, new, spec, create,
1117 spec_set, autospec, new_callable, kwargs
1118 ):
1119 if new_callable is not None:
1120 if new is not DEFAULT:
1121 raise ValueError(
1122 "Cannot use 'new' and 'new_callable' together"
1123 )
Michael Foord50a8c0e2012-03-25 18:57:58 +01001124 if autospec is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001125 raise ValueError(
1126 "Cannot use 'autospec' and 'new_callable' together"
1127 )
1128
1129 self.getter = getter
1130 self.attribute = attribute
1131 self.new = new
1132 self.new_callable = new_callable
1133 self.spec = spec
1134 self.create = create
1135 self.has_local = False
1136 self.spec_set = spec_set
1137 self.autospec = autospec
1138 self.kwargs = kwargs
1139 self.additional_patchers = []
1140
1141
1142 def copy(self):
1143 patcher = _patch(
1144 self.getter, self.attribute, self.new, self.spec,
1145 self.create, self.spec_set,
1146 self.autospec, self.new_callable, self.kwargs
1147 )
1148 patcher.attribute_name = self.attribute_name
1149 patcher.additional_patchers = [
1150 p.copy() for p in self.additional_patchers
1151 ]
1152 return patcher
1153
1154
1155 def __call__(self, func):
1156 if isinstance(func, type):
1157 return self.decorate_class(func)
1158 return self.decorate_callable(func)
1159
1160
1161 def decorate_class(self, klass):
1162 for attr in dir(klass):
1163 if not attr.startswith(patch.TEST_PREFIX):
1164 continue
1165
1166 attr_value = getattr(klass, attr)
1167 if not hasattr(attr_value, "__call__"):
1168 continue
1169
1170 patcher = self.copy()
1171 setattr(klass, attr, patcher(attr_value))
1172 return klass
1173
1174
1175 def decorate_callable(self, func):
1176 if hasattr(func, 'patchings'):
1177 func.patchings.append(self)
1178 return func
1179
1180 @wraps(func)
1181 def patched(*args, **keywargs):
Michael Foord345266a2012-03-14 12:24:34 -07001182 extra_args = []
1183 entered_patchers = []
1184
Michael Foord50a8c0e2012-03-25 18:57:58 +01001185 exc_info = tuple()
Michael Foord345266a2012-03-14 12:24:34 -07001186 try:
Michael Foordd7c65e22012-03-14 14:56:54 -07001187 for patching in patched.patchings:
1188 arg = patching.__enter__()
1189 entered_patchers.append(patching)
1190 if patching.attribute_name is not None:
1191 keywargs.update(arg)
1192 elif patching.new is DEFAULT:
1193 extra_args.append(arg)
Michael Foord345266a2012-03-14 12:24:34 -07001194
Michael Foordd7c65e22012-03-14 14:56:54 -07001195 args += tuple(extra_args)
1196 return func(*args, **keywargs)
1197 except:
1198 if (patching not in entered_patchers and
1199 _is_started(patching)):
1200 # the patcher may have been started, but an exception
1201 # raised whilst entering one of its additional_patchers
1202 entered_patchers.append(patching)
Michael Foord50a8c0e2012-03-25 18:57:58 +01001203 # Pass the exception to __exit__
1204 exc_info = sys.exc_info()
Michael Foordd7c65e22012-03-14 14:56:54 -07001205 # re-raise the exception
1206 raise
Michael Foord345266a2012-03-14 12:24:34 -07001207 finally:
1208 for patching in reversed(entered_patchers):
Michael Foord50a8c0e2012-03-25 18:57:58 +01001209 patching.__exit__(*exc_info)
Michael Foord345266a2012-03-14 12:24:34 -07001210
1211 patched.patchings = [self]
Michael Foord345266a2012-03-14 12:24:34 -07001212 return patched
1213
1214
1215 def get_original(self):
1216 target = self.getter()
1217 name = self.attribute
1218
1219 original = DEFAULT
1220 local = False
1221
1222 try:
1223 original = target.__dict__[name]
1224 except (AttributeError, KeyError):
1225 original = getattr(target, name, DEFAULT)
1226 else:
1227 local = True
1228
Michael Foordfddcfa22014-04-14 16:25:20 -04001229 if name in _builtins and isinstance(target, ModuleType):
1230 self.create = True
1231
Michael Foord345266a2012-03-14 12:24:34 -07001232 if not self.create and original is DEFAULT:
1233 raise AttributeError(
1234 "%s does not have the attribute %r" % (target, name)
1235 )
1236 return original, local
1237
1238
1239 def __enter__(self):
1240 """Perform the patch."""
1241 new, spec, spec_set = self.new, self.spec, self.spec_set
1242 autospec, kwargs = self.autospec, self.kwargs
1243 new_callable = self.new_callable
1244 self.target = self.getter()
1245
Michael Foord50a8c0e2012-03-25 18:57:58 +01001246 # normalise False to None
1247 if spec is False:
1248 spec = None
1249 if spec_set is False:
1250 spec_set = None
1251 if autospec is False:
1252 autospec = None
1253
1254 if spec is not None and autospec is not None:
1255 raise TypeError("Can't specify spec and autospec")
1256 if ((spec is not None or autospec is not None) and
1257 spec_set not in (True, None)):
1258 raise TypeError("Can't provide explicit spec_set *and* spec or autospec")
1259
Michael Foord345266a2012-03-14 12:24:34 -07001260 original, local = self.get_original()
1261
Michael Foord50a8c0e2012-03-25 18:57:58 +01001262 if new is DEFAULT and autospec is None:
Michael Foord345266a2012-03-14 12:24:34 -07001263 inherit = False
Michael Foord50a8c0e2012-03-25 18:57:58 +01001264 if spec is True:
Michael Foord345266a2012-03-14 12:24:34 -07001265 # set spec to the object we are replacing
1266 spec = original
Michael Foord50a8c0e2012-03-25 18:57:58 +01001267 if spec_set is True:
1268 spec_set = original
1269 spec = None
1270 elif spec is not None:
1271 if spec_set is True:
1272 spec_set = spec
1273 spec = None
1274 elif spec_set is True:
1275 spec_set = original
Michael Foord345266a2012-03-14 12:24:34 -07001276
Michael Foord50a8c0e2012-03-25 18:57:58 +01001277 if spec is not None or spec_set is not None:
1278 if original is DEFAULT:
1279 raise TypeError("Can't use 'spec' with create=True")
Michael Foord345266a2012-03-14 12:24:34 -07001280 if isinstance(original, type):
1281 # If we're patching out a class and there is a spec
1282 inherit = True
1283
1284 Klass = MagicMock
1285 _kwargs = {}
1286 if new_callable is not None:
1287 Klass = new_callable
Michael Foord50a8c0e2012-03-25 18:57:58 +01001288 elif spec is not None or spec_set is not None:
Michael Foorde58a5622012-03-25 19:53:18 +01001289 this_spec = spec
1290 if spec_set is not None:
1291 this_spec = spec_set
1292 if _is_list(this_spec):
1293 not_callable = '__call__' not in this_spec
1294 else:
1295 not_callable = not callable(this_spec)
1296 if not_callable:
Michael Foord345266a2012-03-14 12:24:34 -07001297 Klass = NonCallableMagicMock
1298
1299 if spec is not None:
1300 _kwargs['spec'] = spec
1301 if spec_set is not None:
1302 _kwargs['spec_set'] = spec_set
1303
1304 # add a name to mocks
1305 if (isinstance(Klass, type) and
1306 issubclass(Klass, NonCallableMock) and self.attribute):
1307 _kwargs['name'] = self.attribute
1308
1309 _kwargs.update(kwargs)
1310 new = Klass(**_kwargs)
1311
1312 if inherit and _is_instance_mock(new):
1313 # we can only tell if the instance should be callable if the
1314 # spec is not a list
Michael Foord50a8c0e2012-03-25 18:57:58 +01001315 this_spec = spec
1316 if spec_set is not None:
1317 this_spec = spec_set
1318 if (not _is_list(this_spec) and not
1319 _instance_callable(this_spec)):
Michael Foord345266a2012-03-14 12:24:34 -07001320 Klass = NonCallableMagicMock
1321
1322 _kwargs.pop('name')
1323 new.return_value = Klass(_new_parent=new, _new_name='()',
1324 **_kwargs)
Michael Foord50a8c0e2012-03-25 18:57:58 +01001325 elif autospec is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001326 # spec is ignored, new *must* be default, spec_set is treated
1327 # as a boolean. Should we check spec is not None and that spec_set
1328 # is a bool?
1329 if new is not DEFAULT:
1330 raise TypeError(
1331 "autospec creates the mock for you. Can't specify "
1332 "autospec and new."
1333 )
Michael Foord50a8c0e2012-03-25 18:57:58 +01001334 if original is DEFAULT:
Michael Foord99254732012-03-25 19:07:33 +01001335 raise TypeError("Can't use 'autospec' with create=True")
Michael Foord345266a2012-03-14 12:24:34 -07001336 spec_set = bool(spec_set)
1337 if autospec is True:
1338 autospec = original
1339
1340 new = create_autospec(autospec, spec_set=spec_set,
1341 _name=self.attribute, **kwargs)
1342 elif kwargs:
1343 # can't set keyword args when we aren't creating the mock
1344 # XXXX If new is a Mock we could call new.configure_mock(**kwargs)
1345 raise TypeError("Can't pass kwargs to a mock we aren't creating")
1346
1347 new_attr = new
1348
1349 self.temp_original = original
1350 self.is_local = local
1351 setattr(self.target, self.attribute, new_attr)
1352 if self.attribute_name is not None:
1353 extra_args = {}
1354 if self.new is DEFAULT:
1355 extra_args[self.attribute_name] = new
1356 for patching in self.additional_patchers:
1357 arg = patching.__enter__()
1358 if patching.new is DEFAULT:
1359 extra_args.update(arg)
1360 return extra_args
1361
1362 return new
1363
1364
Michael Foord50a8c0e2012-03-25 18:57:58 +01001365 def __exit__(self, *exc_info):
Michael Foord345266a2012-03-14 12:24:34 -07001366 """Undo the patch."""
1367 if not _is_started(self):
1368 raise RuntimeError('stop called on unstarted patcher')
1369
1370 if self.is_local and self.temp_original is not DEFAULT:
1371 setattr(self.target, self.attribute, self.temp_original)
1372 else:
1373 delattr(self.target, self.attribute)
Senthil Kumaran81bc9272016-01-08 23:43:29 -08001374 if not self.create and (not hasattr(self.target, self.attribute) or
1375 self.attribute in ('__doc__', '__module__',
1376 '__defaults__', '__annotations__',
1377 '__kwdefaults__')):
Michael Foord345266a2012-03-14 12:24:34 -07001378 # needed for proxy objects like django settings
1379 setattr(self.target, self.attribute, self.temp_original)
1380
1381 del self.temp_original
1382 del self.is_local
1383 del self.target
1384 for patcher in reversed(self.additional_patchers):
1385 if _is_started(patcher):
Michael Foord50a8c0e2012-03-25 18:57:58 +01001386 patcher.__exit__(*exc_info)
Michael Foord345266a2012-03-14 12:24:34 -07001387
Michael Foordf7c41582012-06-10 20:36:32 +01001388
1389 def start(self):
1390 """Activate a patch, returning any created mock."""
1391 result = self.__enter__()
Michael Foordebc1a302014-04-15 17:21:08 -04001392 self._active_patches.append(self)
Michael Foordf7c41582012-06-10 20:36:32 +01001393 return result
1394
1395
1396 def stop(self):
1397 """Stop an active patch."""
Michael Foordebc1a302014-04-15 17:21:08 -04001398 try:
1399 self._active_patches.remove(self)
1400 except ValueError:
1401 # If the patch hasn't been started this will fail
1402 pass
1403
Michael Foordf7c41582012-06-10 20:36:32 +01001404 return self.__exit__()
Michael Foord345266a2012-03-14 12:24:34 -07001405
1406
1407
1408def _get_target(target):
1409 try:
1410 target, attribute = target.rsplit('.', 1)
1411 except (TypeError, ValueError):
1412 raise TypeError("Need a valid target to patch. You supplied: %r" %
1413 (target,))
1414 getter = lambda: _importer(target)
1415 return getter, attribute
1416
1417
1418def _patch_object(
1419 target, attribute, new=DEFAULT, spec=None,
Michael Foord50a8c0e2012-03-25 18:57:58 +01001420 create=False, spec_set=None, autospec=None,
Michael Foord345266a2012-03-14 12:24:34 -07001421 new_callable=None, **kwargs
1422 ):
1423 """
Michael Foord345266a2012-03-14 12:24:34 -07001424 patch the named member (`attribute`) on an object (`target`) with a mock
1425 object.
1426
1427 `patch.object` can be used as a decorator, class decorator or a context
1428 manager. Arguments `new`, `spec`, `create`, `spec_set`,
1429 `autospec` and `new_callable` have the same meaning as for `patch`. Like
1430 `patch`, `patch.object` takes arbitrary keyword arguments for configuring
1431 the mock object it creates.
1432
1433 When used as a class decorator `patch.object` honours `patch.TEST_PREFIX`
1434 for choosing which methods to wrap.
1435 """
1436 getter = lambda: target
1437 return _patch(
1438 getter, attribute, new, spec, create,
1439 spec_set, autospec, new_callable, kwargs
1440 )
1441
1442
Michael Foord50a8c0e2012-03-25 18:57:58 +01001443def _patch_multiple(target, spec=None, create=False, spec_set=None,
1444 autospec=None, new_callable=None, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001445 """Perform multiple patches in a single call. It takes the object to be
1446 patched (either as an object or a string to fetch the object by importing)
1447 and keyword arguments for the patches::
1448
1449 with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):
1450 ...
1451
1452 Use `DEFAULT` as the value if you want `patch.multiple` to create
1453 mocks for you. In this case the created mocks are passed into a decorated
1454 function by keyword, and a dictionary is returned when `patch.multiple` is
1455 used as a context manager.
1456
1457 `patch.multiple` can be used as a decorator, class decorator or a context
1458 manager. The arguments `spec`, `spec_set`, `create`,
1459 `autospec` and `new_callable` have the same meaning as for `patch`. These
1460 arguments will be applied to *all* patches done by `patch.multiple`.
1461
1462 When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX`
1463 for choosing which methods to wrap.
1464 """
1465 if type(target) is str:
1466 getter = lambda: _importer(target)
1467 else:
1468 getter = lambda: target
1469
1470 if not kwargs:
1471 raise ValueError(
1472 'Must supply at least one keyword argument with patch.multiple'
1473 )
1474 # need to wrap in a list for python 3, where items is a view
1475 items = list(kwargs.items())
1476 attribute, new = items[0]
1477 patcher = _patch(
1478 getter, attribute, new, spec, create, spec_set,
1479 autospec, new_callable, {}
1480 )
1481 patcher.attribute_name = attribute
1482 for attribute, new in items[1:]:
1483 this_patcher = _patch(
1484 getter, attribute, new, spec, create, spec_set,
1485 autospec, new_callable, {}
1486 )
1487 this_patcher.attribute_name = attribute
1488 patcher.additional_patchers.append(this_patcher)
1489 return patcher
1490
1491
1492def patch(
1493 target, new=DEFAULT, spec=None, create=False,
Michael Foord50a8c0e2012-03-25 18:57:58 +01001494 spec_set=None, autospec=None, new_callable=None, **kwargs
Michael Foord345266a2012-03-14 12:24:34 -07001495 ):
1496 """
1497 `patch` acts as a function decorator, class decorator or a context
1498 manager. Inside the body of the function or with statement, the `target`
Michael Foord54b3db82012-03-28 15:08:08 +01001499 is patched with a `new` object. When the function/with statement exits
1500 the patch is undone.
Michael Foord345266a2012-03-14 12:24:34 -07001501
Michael Foord54b3db82012-03-28 15:08:08 +01001502 If `new` is omitted, then the target is replaced with a
1503 `MagicMock`. If `patch` is used as a decorator and `new` is
1504 omitted, the created mock is passed in as an extra argument to the
1505 decorated function. If `patch` is used as a context manager the created
1506 mock is returned by the context manager.
Michael Foord345266a2012-03-14 12:24:34 -07001507
Michael Foord54b3db82012-03-28 15:08:08 +01001508 `target` should be a string in the form `'package.module.ClassName'`. The
1509 `target` is imported and the specified object replaced with the `new`
1510 object, so the `target` must be importable from the environment you are
1511 calling `patch` from. The target is imported when the decorated function
1512 is executed, not at decoration time.
Michael Foord345266a2012-03-14 12:24:34 -07001513
1514 The `spec` and `spec_set` keyword arguments are passed to the `MagicMock`
1515 if patch is creating one for you.
1516
1517 In addition you can pass `spec=True` or `spec_set=True`, which causes
1518 patch to pass in the object being mocked as the spec/spec_set object.
1519
1520 `new_callable` allows you to specify a different class, or callable object,
1521 that will be called to create the `new` object. By default `MagicMock` is
1522 used.
1523
1524 A more powerful form of `spec` is `autospec`. If you set `autospec=True`
Robert Collins92b3e0652015-07-17 21:58:36 +12001525 then the mock will be created with a spec from the object being replaced.
Michael Foord345266a2012-03-14 12:24:34 -07001526 All attributes of the mock will also have the spec of the corresponding
1527 attribute of the object being replaced. Methods and functions being
1528 mocked will have their arguments checked and will raise a `TypeError` if
1529 they are called with the wrong signature. For mocks replacing a class,
1530 their return value (the 'instance') will have the same spec as the class.
1531
1532 Instead of `autospec=True` you can pass `autospec=some_object` to use an
1533 arbitrary object as the spec instead of the one being replaced.
1534
1535 By default `patch` will fail to replace attributes that don't exist. If
1536 you pass in `create=True`, and the attribute doesn't exist, patch will
1537 create the attribute for you when the patched function is called, and
1538 delete it again afterwards. This is useful for writing tests against
Terry Jan Reedy0f847642013-03-11 18:34:00 -04001539 attributes that your production code creates at runtime. It is off by
Michael Foord345266a2012-03-14 12:24:34 -07001540 default because it can be dangerous. With it switched on you can write
1541 passing tests against APIs that don't actually exist!
1542
1543 Patch can be used as a `TestCase` class decorator. It works by
1544 decorating each test method in the class. This reduces the boilerplate
1545 code when your test methods share a common patchings set. `patch` finds
1546 tests by looking for method names that start with `patch.TEST_PREFIX`.
1547 By default this is `test`, which matches the way `unittest` finds tests.
1548 You can specify an alternative prefix by setting `patch.TEST_PREFIX`.
1549
1550 Patch can be used as a context manager, with the with statement. Here the
1551 patching applies to the indented block after the with statement. If you
1552 use "as" then the patched object will be bound to the name after the
1553 "as"; very useful if `patch` is creating a mock object for you.
1554
1555 `patch` takes arbitrary keyword arguments. These will be passed to
1556 the `Mock` (or `new_callable`) on construction.
1557
1558 `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are
1559 available for alternate use-cases.
1560 """
1561 getter, attribute = _get_target(target)
1562 return _patch(
1563 getter, attribute, new, spec, create,
1564 spec_set, autospec, new_callable, kwargs
1565 )
1566
1567
1568class _patch_dict(object):
1569 """
1570 Patch a dictionary, or dictionary like object, and restore the dictionary
1571 to its original state after the test.
1572
1573 `in_dict` can be a dictionary or a mapping like container. If it is a
1574 mapping then it must at least support getting, setting and deleting items
1575 plus iterating over keys.
1576
1577 `in_dict` can also be a string specifying the name of the dictionary, which
1578 will then be fetched by importing it.
1579
1580 `values` can be a dictionary of values to set in the dictionary. `values`
1581 can also be an iterable of `(key, value)` pairs.
1582
1583 If `clear` is True then the dictionary will be cleared before the new
1584 values are set.
1585
1586 `patch.dict` can also be called with arbitrary keyword arguments to set
1587 values in the dictionary::
1588
1589 with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()):
1590 ...
1591
1592 `patch.dict` can be used as a context manager, decorator or class
1593 decorator. When used as a class decorator `patch.dict` honours
1594 `patch.TEST_PREFIX` for choosing which methods to wrap.
1595 """
1596
1597 def __init__(self, in_dict, values=(), clear=False, **kwargs):
Michael Foord345266a2012-03-14 12:24:34 -07001598 self.in_dict = in_dict
1599 # support any argument supported by dict(...) constructor
1600 self.values = dict(values)
1601 self.values.update(kwargs)
1602 self.clear = clear
1603 self._original = None
1604
1605
1606 def __call__(self, f):
1607 if isinstance(f, type):
1608 return self.decorate_class(f)
1609 @wraps(f)
1610 def _inner(*args, **kw):
1611 self._patch_dict()
1612 try:
1613 return f(*args, **kw)
1614 finally:
1615 self._unpatch_dict()
1616
1617 return _inner
1618
1619
1620 def decorate_class(self, klass):
1621 for attr in dir(klass):
1622 attr_value = getattr(klass, attr)
1623 if (attr.startswith(patch.TEST_PREFIX) and
1624 hasattr(attr_value, "__call__")):
1625 decorator = _patch_dict(self.in_dict, self.values, self.clear)
1626 decorated = decorator(attr_value)
1627 setattr(klass, attr, decorated)
1628 return klass
1629
1630
1631 def __enter__(self):
1632 """Patch the dict."""
1633 self._patch_dict()
1634
1635
1636 def _patch_dict(self):
1637 values = self.values
Miss Islington (bot)ea199b92019-02-25 13:17:16 -08001638 if isinstance(self.in_dict, str):
1639 self.in_dict = _importer(self.in_dict)
Michael Foord345266a2012-03-14 12:24:34 -07001640 in_dict = self.in_dict
1641 clear = self.clear
1642
1643 try:
1644 original = in_dict.copy()
1645 except AttributeError:
1646 # dict like object with no copy method
1647 # must support iteration over keys
1648 original = {}
1649 for key in in_dict:
1650 original[key] = in_dict[key]
1651 self._original = original
1652
1653 if clear:
1654 _clear_dict(in_dict)
1655
1656 try:
1657 in_dict.update(values)
1658 except AttributeError:
1659 # dict like object with no update method
1660 for key in values:
1661 in_dict[key] = values[key]
1662
1663
1664 def _unpatch_dict(self):
1665 in_dict = self.in_dict
1666 original = self._original
1667
1668 _clear_dict(in_dict)
1669
1670 try:
1671 in_dict.update(original)
1672 except AttributeError:
1673 for key in original:
1674 in_dict[key] = original[key]
1675
1676
1677 def __exit__(self, *args):
1678 """Unpatch the dict."""
1679 self._unpatch_dict()
1680 return False
1681
1682 start = __enter__
1683 stop = __exit__
1684
1685
1686def _clear_dict(in_dict):
1687 try:
1688 in_dict.clear()
1689 except AttributeError:
1690 keys = list(in_dict)
1691 for key in keys:
1692 del in_dict[key]
1693
1694
Michael Foordf7c41582012-06-10 20:36:32 +01001695def _patch_stopall():
Michael Foordebc1a302014-04-15 17:21:08 -04001696 """Stop all active patches. LIFO to unroll nested patches."""
1697 for patch in reversed(_patch._active_patches):
Michael Foordf7c41582012-06-10 20:36:32 +01001698 patch.stop()
1699
1700
Michael Foord345266a2012-03-14 12:24:34 -07001701patch.object = _patch_object
1702patch.dict = _patch_dict
1703patch.multiple = _patch_multiple
Michael Foordf7c41582012-06-10 20:36:32 +01001704patch.stopall = _patch_stopall
Michael Foord345266a2012-03-14 12:24:34 -07001705patch.TEST_PREFIX = 'test'
1706
1707magic_methods = (
1708 "lt le gt ge eq ne "
1709 "getitem setitem delitem "
1710 "len contains iter "
1711 "hash str sizeof "
1712 "enter exit "
Berker Peksaga785dec2015-03-15 01:51:56 +02001713 # we added divmod and rdivmod here instead of numerics
1714 # because there is no idivmod
1715 "divmod rdivmod neg pos abs invert "
Michael Foord345266a2012-03-14 12:24:34 -07001716 "complex int float index "
1717 "trunc floor ceil "
1718 "bool next "
1719)
1720
Michael Foordd2623d72014-04-14 11:23:48 -04001721numerics = (
Berker Peksag9bd8af72015-03-12 20:42:48 +02001722 "add sub mul matmul div floordiv mod lshift rshift and xor or pow truediv"
Michael Foordd2623d72014-04-14 11:23:48 -04001723)
Michael Foord345266a2012-03-14 12:24:34 -07001724inplace = ' '.join('i%s' % n for n in numerics.split())
1725right = ' '.join('r%s' % n for n in numerics.split())
1726
1727# not including __prepare__, __instancecheck__, __subclasscheck__
1728# (as they are metaclass methods)
1729# __del__ is not supported at all as it causes problems if it exists
1730
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001731_non_defaults = {
1732 '__get__', '__set__', '__delete__', '__reversed__', '__missing__',
1733 '__reduce__', '__reduce_ex__', '__getinitargs__', '__getnewargs__',
1734 '__getstate__', '__setstate__', '__getformat__', '__setformat__',
1735 '__repr__', '__dir__', '__subclasses__', '__format__',
Serhiy Storchaka5943ea72016-06-19 18:30:43 +03001736 '__getnewargs_ex__',
Victor Stinnereb1a9952014-12-11 22:25:49 +01001737}
Michael Foord345266a2012-03-14 12:24:34 -07001738
1739
1740def _get_method(name, func):
1741 "Turns a callable object (like a mock) into a real function"
1742 def method(self, *args, **kw):
1743 return func(self, *args, **kw)
1744 method.__name__ = name
1745 return method
1746
1747
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001748_magics = {
Michael Foord345266a2012-03-14 12:24:34 -07001749 '__%s__' % method for method in
1750 ' '.join([magic_methods, numerics, inplace, right]).split()
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001751}
Michael Foord345266a2012-03-14 12:24:34 -07001752
1753_all_magics = _magics | _non_defaults
1754
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001755_unsupported_magics = {
Michael Foord345266a2012-03-14 12:24:34 -07001756 '__getattr__', '__setattr__',
Miss Islington (bot)7beb8c52018-11-05 06:52:58 -08001757 '__init__', '__new__', '__prepare__',
Michael Foord345266a2012-03-14 12:24:34 -07001758 '__instancecheck__', '__subclasscheck__',
1759 '__del__'
Serhiy Storchakac02d1882014-12-11 10:28:14 +02001760}
Michael Foord345266a2012-03-14 12:24:34 -07001761
1762_calculate_return_value = {
1763 '__hash__': lambda self: object.__hash__(self),
1764 '__str__': lambda self: object.__str__(self),
1765 '__sizeof__': lambda self: object.__sizeof__(self),
1766}
1767
1768_return_values = {
Michael Foord313f85f2012-03-25 18:16:07 +01001769 '__lt__': NotImplemented,
1770 '__gt__': NotImplemented,
1771 '__le__': NotImplemented,
1772 '__ge__': NotImplemented,
Michael Foord345266a2012-03-14 12:24:34 -07001773 '__int__': 1,
1774 '__contains__': False,
1775 '__len__': 0,
1776 '__exit__': False,
1777 '__complex__': 1j,
1778 '__float__': 1.0,
1779 '__bool__': True,
1780 '__index__': 1,
1781}
1782
1783
1784def _get_eq(self):
1785 def __eq__(other):
1786 ret_val = self.__eq__._mock_return_value
1787 if ret_val is not DEFAULT:
1788 return ret_val
Serhiy Storchaka362f0582017-01-21 23:12:58 +02001789 if self is other:
1790 return True
1791 return NotImplemented
Michael Foord345266a2012-03-14 12:24:34 -07001792 return __eq__
1793
1794def _get_ne(self):
1795 def __ne__(other):
1796 if self.__ne__._mock_return_value is not DEFAULT:
1797 return DEFAULT
Serhiy Storchaka362f0582017-01-21 23:12:58 +02001798 if self is other:
1799 return False
1800 return NotImplemented
Michael Foord345266a2012-03-14 12:24:34 -07001801 return __ne__
1802
1803def _get_iter(self):
1804 def __iter__():
1805 ret_val = self.__iter__._mock_return_value
1806 if ret_val is DEFAULT:
1807 return iter([])
1808 # if ret_val was already an iterator, then calling iter on it should
1809 # return the iterator unchanged
1810 return iter(ret_val)
1811 return __iter__
1812
1813_side_effect_methods = {
1814 '__eq__': _get_eq,
1815 '__ne__': _get_ne,
1816 '__iter__': _get_iter,
1817}
1818
1819
1820
1821def _set_return_value(mock, method, name):
1822 fixed = _return_values.get(name, DEFAULT)
1823 if fixed is not DEFAULT:
1824 method.return_value = fixed
1825 return
1826
1827 return_calulator = _calculate_return_value.get(name)
1828 if return_calulator is not None:
1829 try:
1830 return_value = return_calulator(mock)
1831 except AttributeError:
1832 # XXXX why do we return AttributeError here?
1833 # set it as a side_effect instead?
1834 return_value = AttributeError(name)
1835 method.return_value = return_value
1836 return
1837
1838 side_effector = _side_effect_methods.get(name)
1839 if side_effector is not None:
1840 method.side_effect = side_effector(mock)
1841
1842
1843
1844class MagicMixin(object):
1845 def __init__(self, *args, **kw):
Łukasz Langaa468db92015-04-13 23:12:42 -07001846 self._mock_set_magics() # make magic work for kwargs in init
Nick Coghlan0b43bcf2012-05-27 18:17:07 +10001847 _safe_super(MagicMixin, self).__init__(*args, **kw)
Łukasz Langaa468db92015-04-13 23:12:42 -07001848 self._mock_set_magics() # fix magic broken by upper level init
Michael Foord345266a2012-03-14 12:24:34 -07001849
1850
1851 def _mock_set_magics(self):
1852 these_magics = _magics
1853
Łukasz Langaa468db92015-04-13 23:12:42 -07001854 if getattr(self, "_mock_methods", None) is not None:
Michael Foord345266a2012-03-14 12:24:34 -07001855 these_magics = _magics.intersection(self._mock_methods)
1856
1857 remove_magics = set()
1858 remove_magics = _magics - these_magics
1859
1860 for entry in remove_magics:
1861 if entry in type(self).__dict__:
1862 # remove unneeded magic methods
1863 delattr(self, entry)
1864
1865 # don't overwrite existing attributes if called a second time
1866 these_magics = these_magics - set(type(self).__dict__)
1867
1868 _type = type(self)
1869 for entry in these_magics:
1870 setattr(_type, entry, MagicProxy(entry, self))
1871
1872
1873
1874class NonCallableMagicMock(MagicMixin, NonCallableMock):
1875 """A version of `MagicMock` that isn't callable."""
1876 def mock_add_spec(self, spec, spec_set=False):
1877 """Add a spec to a mock. `spec` can either be an object or a
1878 list of strings. Only attributes on the `spec` can be fetched as
1879 attributes from the mock.
1880
1881 If `spec_set` is True then only attributes on the spec can be set."""
1882 self._mock_add_spec(spec, spec_set)
1883 self._mock_set_magics()
1884
1885
1886
1887class MagicMock(MagicMixin, Mock):
1888 """
1889 MagicMock is a subclass of Mock with default implementations
1890 of most of the magic methods. You can use MagicMock without having to
1891 configure the magic methods yourself.
1892
1893 If you use the `spec` or `spec_set` arguments then *only* magic
1894 methods that exist in the spec will be created.
1895
1896 Attributes and the return value of a `MagicMock` will also be `MagicMocks`.
1897 """
1898 def mock_add_spec(self, spec, spec_set=False):
1899 """Add a spec to a mock. `spec` can either be an object or a
1900 list of strings. Only attributes on the `spec` can be fetched as
1901 attributes from the mock.
1902
1903 If `spec_set` is True then only attributes on the spec can be set."""
1904 self._mock_add_spec(spec, spec_set)
1905 self._mock_set_magics()
1906
1907
1908
1909class MagicProxy(object):
1910 def __init__(self, name, parent):
1911 self.name = name
1912 self.parent = parent
1913
1914 def __call__(self, *args, **kwargs):
1915 m = self.create_mock()
1916 return m(*args, **kwargs)
1917
1918 def create_mock(self):
1919 entry = self.name
1920 parent = self.parent
1921 m = parent._get_child_mock(name=entry, _new_name=entry,
1922 _new_parent=parent)
1923 setattr(parent, entry, m)
1924 _set_return_value(parent, m, entry)
1925 return m
1926
1927 def __get__(self, obj, _type=None):
1928 return self.create_mock()
1929
1930
1931
1932class _ANY(object):
1933 "A helper object that compares equal to everything."
1934
1935 def __eq__(self, other):
1936 return True
1937
1938 def __ne__(self, other):
1939 return False
1940
1941 def __repr__(self):
1942 return '<ANY>'
1943
1944ANY = _ANY()
1945
1946
1947
1948def _format_call_signature(name, args, kwargs):
1949 message = '%s(%%s)' % name
1950 formatted_args = ''
1951 args_string = ', '.join([repr(arg) for arg in args])
1952 kwargs_string = ', '.join([
Kushal Das047f14c2014-06-09 13:45:56 +05301953 '%s=%r' % (key, value) for key, value in sorted(kwargs.items())
Michael Foord345266a2012-03-14 12:24:34 -07001954 ])
1955 if args_string:
1956 formatted_args = args_string
1957 if kwargs_string:
1958 if formatted_args:
1959 formatted_args += ', '
1960 formatted_args += kwargs_string
1961
1962 return message % formatted_args
1963
1964
1965
1966class _Call(tuple):
1967 """
1968 A tuple for holding the results of a call to a mock, either in the form
1969 `(args, kwargs)` or `(name, args, kwargs)`.
1970
1971 If args or kwargs are empty then a call tuple will compare equal to
1972 a tuple without those values. This makes comparisons less verbose::
1973
1974 _Call(('name', (), {})) == ('name',)
1975 _Call(('name', (1,), {})) == ('name', (1,))
1976 _Call(((), {'a': 'b'})) == ({'a': 'b'},)
1977
1978 The `_Call` object provides a useful shortcut for comparing with call::
1979
1980 _Call(((1, 2), {'a': 3})) == call(1, 2, a=3)
1981 _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3)
1982
1983 If the _Call has no name then it will match any name.
1984 """
Victor Stinner84b6fb02017-01-06 18:15:51 +01001985 def __new__(cls, value=(), name='', parent=None, two=False,
Michael Foord345266a2012-03-14 12:24:34 -07001986 from_kall=True):
Michael Foord345266a2012-03-14 12:24:34 -07001987 args = ()
1988 kwargs = {}
1989 _len = len(value)
1990 if _len == 3:
1991 name, args, kwargs = value
1992 elif _len == 2:
1993 first, second = value
1994 if isinstance(first, str):
1995 name = first
1996 if isinstance(second, tuple):
1997 args = second
1998 else:
1999 kwargs = second
2000 else:
2001 args, kwargs = first, second
2002 elif _len == 1:
2003 value, = value
2004 if isinstance(value, str):
2005 name = value
2006 elif isinstance(value, tuple):
2007 args = value
2008 else:
2009 kwargs = value
2010
2011 if two:
2012 return tuple.__new__(cls, (args, kwargs))
2013
2014 return tuple.__new__(cls, (name, args, kwargs))
2015
2016
2017 def __init__(self, value=(), name=None, parent=None, two=False,
2018 from_kall=True):
Miss Islington (bot)12735c12018-12-04 01:34:34 -08002019 self._mock_name = name
2020 self._mock_parent = parent
2021 self._mock_from_kall = from_kall
Michael Foord345266a2012-03-14 12:24:34 -07002022
2023
2024 def __eq__(self, other):
2025 if other is ANY:
2026 return True
2027 try:
2028 len_other = len(other)
2029 except TypeError:
2030 return False
2031
2032 self_name = ''
2033 if len(self) == 2:
2034 self_args, self_kwargs = self
2035 else:
2036 self_name, self_args, self_kwargs = self
2037
Miss Islington (bot)12735c12018-12-04 01:34:34 -08002038 if (getattr(self, '_mock_parent', None) and getattr(other, '_mock_parent', None)
2039 and self._mock_parent != other._mock_parent):
Miss Islington (bot)e8f9e472018-12-03 13:54:44 -08002040 return False
2041
Michael Foord345266a2012-03-14 12:24:34 -07002042 other_name = ''
2043 if len_other == 0:
2044 other_args, other_kwargs = (), {}
2045 elif len_other == 3:
2046 other_name, other_args, other_kwargs = other
2047 elif len_other == 1:
2048 value, = other
2049 if isinstance(value, tuple):
2050 other_args = value
2051 other_kwargs = {}
2052 elif isinstance(value, str):
2053 other_name = value
2054 other_args, other_kwargs = (), {}
2055 else:
2056 other_args = ()
2057 other_kwargs = value
Berker Peksag3fc536f2015-09-09 23:35:25 +03002058 elif len_other == 2:
Michael Foord345266a2012-03-14 12:24:34 -07002059 # could be (name, args) or (name, kwargs) or (args, kwargs)
2060 first, second = other
2061 if isinstance(first, str):
2062 other_name = first
2063 if isinstance(second, tuple):
2064 other_args, other_kwargs = second, {}
2065 else:
2066 other_args, other_kwargs = (), second
2067 else:
2068 other_args, other_kwargs = first, second
Berker Peksag3fc536f2015-09-09 23:35:25 +03002069 else:
2070 return False
Michael Foord345266a2012-03-14 12:24:34 -07002071
2072 if self_name and other_name != self_name:
2073 return False
2074
2075 # this order is important for ANY to work!
2076 return (other_args, other_kwargs) == (self_args, self_kwargs)
2077
2078
Berker Peksagce913872016-03-28 00:30:02 +03002079 __ne__ = object.__ne__
2080
2081
Michael Foord345266a2012-03-14 12:24:34 -07002082 def __call__(self, *args, **kwargs):
Miss Islington (bot)12735c12018-12-04 01:34:34 -08002083 if self._mock_name is None:
Michael Foord345266a2012-03-14 12:24:34 -07002084 return _Call(('', args, kwargs), name='()')
2085
Miss Islington (bot)12735c12018-12-04 01:34:34 -08002086 name = self._mock_name + '()'
2087 return _Call((self._mock_name, args, kwargs), name=name, parent=self)
Michael Foord345266a2012-03-14 12:24:34 -07002088
2089
2090 def __getattr__(self, attr):
Miss Islington (bot)12735c12018-12-04 01:34:34 -08002091 if self._mock_name is None:
Michael Foord345266a2012-03-14 12:24:34 -07002092 return _Call(name=attr, from_kall=False)
Miss Islington (bot)12735c12018-12-04 01:34:34 -08002093 name = '%s.%s' % (self._mock_name, attr)
Michael Foord345266a2012-03-14 12:24:34 -07002094 return _Call(name=name, parent=self, from_kall=False)
2095
2096
Kushal Dasa37b9582014-09-16 18:33:37 +05302097 def count(self, *args, **kwargs):
2098 return self.__getattr__('count')(*args, **kwargs)
2099
2100 def index(self, *args, **kwargs):
2101 return self.__getattr__('index')(*args, **kwargs)
2102
Michael Foord345266a2012-03-14 12:24:34 -07002103 def __repr__(self):
Miss Islington (bot)12735c12018-12-04 01:34:34 -08002104 if not self._mock_from_kall:
2105 name = self._mock_name or 'call'
Michael Foord345266a2012-03-14 12:24:34 -07002106 if name.startswith('()'):
2107 name = 'call%s' % name
2108 return name
2109
2110 if len(self) == 2:
2111 name = 'call'
2112 args, kwargs = self
2113 else:
2114 name, args, kwargs = self
2115 if not name:
2116 name = 'call'
2117 elif not name.startswith('()'):
2118 name = 'call.%s' % name
2119 else:
2120 name = 'call%s' % name
2121 return _format_call_signature(name, args, kwargs)
2122
2123
2124 def call_list(self):
2125 """For a call object that represents multiple calls, `call_list`
2126 returns a list of all the intermediate calls as well as the
2127 final call."""
2128 vals = []
2129 thing = self
2130 while thing is not None:
Miss Islington (bot)12735c12018-12-04 01:34:34 -08002131 if thing._mock_from_kall:
Michael Foord345266a2012-03-14 12:24:34 -07002132 vals.append(thing)
Miss Islington (bot)12735c12018-12-04 01:34:34 -08002133 thing = thing._mock_parent
Michael Foord345266a2012-03-14 12:24:34 -07002134 return _CallList(reversed(vals))
2135
2136
2137call = _Call(from_kall=False)
2138
2139
2140
2141def create_autospec(spec, spec_set=False, instance=False, _parent=None,
2142 _name=None, **kwargs):
2143 """Create a mock object using another object as a spec. Attributes on the
2144 mock will use the corresponding attribute on the `spec` object as their
2145 spec.
2146
2147 Functions or methods being mocked will have their arguments checked
2148 to check that they are called with the correct signature.
2149
2150 If `spec_set` is True then attempting to set attributes that don't exist
2151 on the spec object will raise an `AttributeError`.
2152
2153 If a class is used as a spec then the return value of the mock (the
2154 instance of the class) will have the same spec. You can use a class as the
2155 spec for an instance object by passing `instance=True`. The returned mock
2156 will only be callable if instances of the mock are callable.
2157
2158 `create_autospec` also takes arbitrary keyword arguments that are passed to
2159 the constructor of the created mock."""
2160 if _is_list(spec):
2161 # can't pass a list instance to the mock constructor as it will be
2162 # interpreted as a list of strings
2163 spec = type(spec)
2164
2165 is_type = isinstance(spec, type)
2166
2167 _kwargs = {'spec': spec}
2168 if spec_set:
2169 _kwargs = {'spec_set': spec}
2170 elif spec is None:
2171 # None we mock with a normal mock without a spec
2172 _kwargs = {}
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002173 if _kwargs and instance:
2174 _kwargs['_spec_as_instance'] = True
Michael Foord345266a2012-03-14 12:24:34 -07002175
2176 _kwargs.update(kwargs)
2177
2178 Klass = MagicMock
Gregory P. Smithd4583d72016-08-15 23:23:40 -07002179 if inspect.isdatadescriptor(spec):
Michael Foord345266a2012-03-14 12:24:34 -07002180 # descriptors don't have a spec
2181 # because we don't know what type they return
2182 _kwargs = {}
2183 elif not _callable(spec):
2184 Klass = NonCallableMagicMock
2185 elif is_type and instance and not _instance_callable(spec):
2186 Klass = NonCallableMagicMock
2187
Kushal Das484f8a82014-04-16 01:05:50 +05302188 _name = _kwargs.pop('name', _name)
2189
Michael Foord345266a2012-03-14 12:24:34 -07002190 _new_name = _name
2191 if _parent is None:
2192 # for a top level object no _new_name should be set
2193 _new_name = ''
2194
2195 mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name,
2196 name=_name, **_kwargs)
2197
2198 if isinstance(spec, FunctionTypes):
2199 # should only happen at the top level because we don't
2200 # recurse for functions
2201 mock = _set_signature(mock, spec)
2202 else:
2203 _check_signature(spec, mock, is_type, instance)
2204
2205 if _parent is not None and not instance:
2206 _parent._mock_children[_name] = mock
2207
2208 if is_type and not instance and 'return_value' not in kwargs:
Michael Foord345266a2012-03-14 12:24:34 -07002209 mock.return_value = create_autospec(spec, spec_set, instance=True,
2210 _name='()', _parent=mock)
2211
2212 for entry in dir(spec):
2213 if _is_magic(entry):
2214 # MagicMock already does the useful magic methods for us
2215 continue
2216
Michael Foord345266a2012-03-14 12:24:34 -07002217 # XXXX do we need a better way of getting attributes without
2218 # triggering code execution (?) Probably not - we need the actual
2219 # object to mock it so we would rather trigger a property than mock
2220 # the property descriptor. Likewise we want to mock out dynamically
2221 # provided attributes.
Michael Foord656319e2012-04-13 17:39:16 +01002222 # XXXX what about attributes that raise exceptions other than
2223 # AttributeError on being fetched?
Michael Foord345266a2012-03-14 12:24:34 -07002224 # we could be resilient against it, or catch and propagate the
2225 # exception when the attribute is fetched from the mock
Michael Foord656319e2012-04-13 17:39:16 +01002226 try:
2227 original = getattr(spec, entry)
2228 except AttributeError:
2229 continue
Michael Foord345266a2012-03-14 12:24:34 -07002230
2231 kwargs = {'spec': original}
2232 if spec_set:
2233 kwargs = {'spec_set': original}
2234
2235 if not isinstance(original, FunctionTypes):
2236 new = _SpecState(original, spec_set, mock, entry, instance)
2237 mock._mock_children[entry] = new
2238 else:
2239 parent = mock
2240 if isinstance(spec, FunctionTypes):
2241 parent = mock.mock
2242
Michael Foord345266a2012-03-14 12:24:34 -07002243 skipfirst = _must_skip(spec, entry, is_type)
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002244 kwargs['_eat_self'] = skipfirst
2245 new = MagicMock(parent=parent, name=entry, _new_name=entry,
2246 _new_parent=parent,
2247 **kwargs)
2248 mock._mock_children[entry] = new
Michael Foord345266a2012-03-14 12:24:34 -07002249 _check_signature(original, new, skipfirst=skipfirst)
2250
2251 # so functions created with _set_signature become instance attributes,
2252 # *plus* their underlying mock exists in _mock_children of the parent
2253 # mock. Adding to _mock_children may be unnecessary where we are also
2254 # setting as an instance attribute?
2255 if isinstance(new, FunctionTypes):
2256 setattr(mock, entry, new)
2257
2258 return mock
2259
2260
2261def _must_skip(spec, entry, is_type):
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002262 """
2263 Return whether we should skip the first argument on spec's `entry`
2264 attribute.
2265 """
Michael Foord345266a2012-03-14 12:24:34 -07002266 if not isinstance(spec, type):
2267 if entry in getattr(spec, '__dict__', {}):
2268 # instance attribute - shouldn't skip
2269 return False
Michael Foord345266a2012-03-14 12:24:34 -07002270 spec = spec.__class__
Michael Foord345266a2012-03-14 12:24:34 -07002271
2272 for klass in spec.__mro__:
2273 result = klass.__dict__.get(entry, DEFAULT)
2274 if result is DEFAULT:
2275 continue
2276 if isinstance(result, (staticmethod, classmethod)):
2277 return False
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002278 elif isinstance(getattr(result, '__get__', None), MethodWrapperTypes):
2279 # Normal method => skip if looked up on type
2280 # (if looked up on instance, self is already skipped)
2281 return is_type
2282 else:
2283 return False
Michael Foord345266a2012-03-14 12:24:34 -07002284
2285 # shouldn't get here unless function is a dynamically provided attribute
2286 # XXXX untested behaviour
2287 return is_type
2288
2289
2290def _get_class(obj):
2291 try:
2292 return obj.__class__
2293 except AttributeError:
Michael Foord50a8c0e2012-03-25 18:57:58 +01002294 # it is possible for objects to have no __class__
Michael Foord345266a2012-03-14 12:24:34 -07002295 return type(obj)
2296
2297
2298class _SpecState(object):
2299
2300 def __init__(self, spec, spec_set=False, parent=None,
2301 name=None, ids=None, instance=False):
2302 self.spec = spec
2303 self.ids = ids
2304 self.spec_set = spec_set
2305 self.parent = parent
2306 self.instance = instance
2307 self.name = name
2308
2309
2310FunctionTypes = (
2311 # python function
2312 type(create_autospec),
2313 # instance method
2314 type(ANY.__eq__),
Michael Foord345266a2012-03-14 12:24:34 -07002315)
2316
Antoine Pitrou5c64df72013-02-03 00:23:58 +01002317MethodWrapperTypes = (
2318 type(ANY.__eq__.__get__),
2319)
2320
Michael Foord345266a2012-03-14 12:24:34 -07002321
Michael Foorda74561a2012-03-25 19:03:13 +01002322file_spec = None
Michael Foord345266a2012-03-14 12:24:34 -07002323
Michael Foord04cbe0c2013-03-19 17:22:51 -07002324def _iterate_read_data(read_data):
2325 # Helper for mock_open:
2326 # Retrieve lines from read_data via a generator so that separate calls to
2327 # readline, read, and readlines are properly interleaved
Berker Peksag86b34da2015-08-06 13:15:51 +03002328 sep = b'\n' if isinstance(read_data, bytes) else '\n'
2329 data_as_list = [l + sep for l in read_data.split(sep)]
Michael Foord04cbe0c2013-03-19 17:22:51 -07002330
Berker Peksag86b34da2015-08-06 13:15:51 +03002331 if data_as_list[-1] == sep:
Michael Foord04cbe0c2013-03-19 17:22:51 -07002332 # If the last line ended in a newline, the list comprehension will have an
2333 # extra entry that's just a newline. Remove this.
2334 data_as_list = data_as_list[:-1]
2335 else:
2336 # If there wasn't an extra newline by itself, then the file being
2337 # emulated doesn't have a newline to end the last line remove the
2338 # newline that our naive format() added
2339 data_as_list[-1] = data_as_list[-1][:-1]
2340
2341 for line in data_as_list:
2342 yield line
Michael Foord0dccf652012-03-25 19:11:50 +01002343
Robert Collins5329aaa2015-07-17 20:08:45 +12002344
Michael Foord0dccf652012-03-25 19:11:50 +01002345def mock_open(mock=None, read_data=''):
Michael Foord99254732012-03-25 19:07:33 +01002346 """
2347 A helper function to create a mock to replace the use of `open`. It works
2348 for `open` called directly or used as a context manager.
2349
2350 The `mock` argument is the mock object to configure. If `None` (the
2351 default) then a `MagicMock` will be created for you, with the API limited
2352 to methods or attributes available on standard file handles.
2353
Miss Islington (bot)5fe170d2018-12-20 08:23:57 -08002354 `read_data` is a string for the `read`, `readline` and `readlines` of the
Michael Foord04cbe0c2013-03-19 17:22:51 -07002355 file handle to return. This is an empty string by default.
Michael Foord99254732012-03-25 19:07:33 +01002356 """
Robert Collinsca647ef2015-07-24 03:48:20 +12002357 def _readlines_side_effect(*args, **kwargs):
2358 if handle.readlines.return_value is not None:
2359 return handle.readlines.return_value
2360 return list(_state[0])
2361
2362 def _read_side_effect(*args, **kwargs):
2363 if handle.read.return_value is not None:
2364 return handle.read.return_value
Berker Peksag86b34da2015-08-06 13:15:51 +03002365 return type(read_data)().join(_state[0])
Robert Collinsca647ef2015-07-24 03:48:20 +12002366
2367 def _readline_side_effect():
Miss Islington (bot)c83c3752018-09-14 14:30:04 -07002368 yield from _iter_side_effect()
2369 while True:
2370 yield type(read_data)()
2371
2372 def _iter_side_effect():
Robert Collinsca647ef2015-07-24 03:48:20 +12002373 if handle.readline.return_value is not None:
2374 while True:
2375 yield handle.readline.return_value
2376 for line in _state[0]:
2377 yield line
Robert Collinsca647ef2015-07-24 03:48:20 +12002378
Michael Foorda74561a2012-03-25 19:03:13 +01002379 global file_spec
2380 if file_spec is None:
2381 import _io
2382 file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO))))
2383
Michael Foord345266a2012-03-14 12:24:34 -07002384 if mock is None:
Michael Foord0dccf652012-03-25 19:11:50 +01002385 mock = MagicMock(name='open', spec=open)
Michael Foord345266a2012-03-14 12:24:34 -07002386
Robert Collinsca647ef2015-07-24 03:48:20 +12002387 handle = MagicMock(spec=file_spec)
2388 handle.__enter__.return_value = handle
Michael Foord04cbe0c2013-03-19 17:22:51 -07002389
Robert Collinsca647ef2015-07-24 03:48:20 +12002390 _state = [_iterate_read_data(read_data), None]
Michael Foord04cbe0c2013-03-19 17:22:51 -07002391
Robert Collinsca647ef2015-07-24 03:48:20 +12002392 handle.write.return_value = None
2393 handle.read.return_value = None
2394 handle.readline.return_value = None
2395 handle.readlines.return_value = None
Michael Foord04cbe0c2013-03-19 17:22:51 -07002396
Robert Collinsca647ef2015-07-24 03:48:20 +12002397 handle.read.side_effect = _read_side_effect
2398 _state[1] = _readline_side_effect()
2399 handle.readline.side_effect = _state[1]
2400 handle.readlines.side_effect = _readlines_side_effect
Miss Islington (bot)c83c3752018-09-14 14:30:04 -07002401 handle.__iter__.side_effect = _iter_side_effect
Michael Foord345266a2012-03-14 12:24:34 -07002402
Robert Collinsca647ef2015-07-24 03:48:20 +12002403 def reset_data(*args, **kwargs):
2404 _state[0] = _iterate_read_data(read_data)
2405 if handle.readline.side_effect == _state[1]:
2406 # Only reset the side effect if the user hasn't overridden it.
2407 _state[1] = _readline_side_effect()
2408 handle.readline.side_effect = _state[1]
2409 return DEFAULT
Robert Collins5329aaa2015-07-17 20:08:45 +12002410
Robert Collinsca647ef2015-07-24 03:48:20 +12002411 mock.side_effect = reset_data
2412 mock.return_value = handle
Michael Foord345266a2012-03-14 12:24:34 -07002413 return mock
2414
2415
2416class PropertyMock(Mock):
Michael Foord99254732012-03-25 19:07:33 +01002417 """
2418 A mock intended to be used as a property, or other descriptor, on a class.
2419 `PropertyMock` provides `__get__` and `__set__` methods so you can specify
2420 a return value when it is fetched.
2421
2422 Fetching a `PropertyMock` instance from an object calls the mock, with
2423 no args. Setting it calls the mock with the value being set.
2424 """
Michael Foordc2870622012-04-13 16:57:22 +01002425 def _get_child_mock(self, **kwargs):
2426 return MagicMock(**kwargs)
2427
Michael Foord345266a2012-03-14 12:24:34 -07002428 def __get__(self, obj, obj_type):
2429 return self()
2430 def __set__(self, obj, val):
2431 self(val)
Mario Corchero552be9d2017-10-17 12:35:11 +01002432
2433
2434def seal(mock):
Miss Islington (bot)984a8002018-10-19 15:17:31 -07002435 """Disable the automatic generation of child mocks.
Mario Corchero552be9d2017-10-17 12:35:11 +01002436
2437 Given an input Mock, seals it to ensure no further mocks will be generated
2438 when accessing an attribute that was not already defined.
2439
Miss Islington (bot)984a8002018-10-19 15:17:31 -07002440 The operation recursively seals the mock passed in, meaning that
2441 the mock itself, any mocks generated by accessing one of its attributes,
2442 and all assigned mocks without a name or spec will be sealed.
Mario Corchero552be9d2017-10-17 12:35:11 +01002443 """
2444 mock._mock_sealed = True
2445 for attr in dir(mock):
2446 try:
2447 m = getattr(mock, attr)
2448 except AttributeError:
2449 continue
2450 if not isinstance(m, NonCallableMock):
2451 continue
2452 if m._mock_new_parent is mock:
2453 seal(m)