Merge lp:~jjo/juju-deployer/decorate-tests-failing-on-LP-builders_and_support-precise-python-mock into lp:juju-deployer

Proposed by JuanJo Ciarlante
Status: Merged
Merged at revision: 86
Proposed branch: lp:~jjo/juju-deployer/decorate-tests-failing-on-LP-builders_and_support-precise-python-mock
Merge into: lp:juju-deployer
Diff against target: 2469 lines (+2380/-2)
6 files modified
deployer/tests/mock.py (+2367/-0)
deployer/tests/test_charm.py (+5/-0)
deployer/tests/test_deployment.py (+3/-0)
deployer/tests/test_guiserver.py (+4/-0)
deployer/tests/test_utils.py (+1/-1)
setup.py (+0/-1)
To merge this branch: bzr merge lp:~jjo/juju-deployer/decorate-tests-failing-on-LP-builders_and_support-precise-python-mock
Reviewer Review Type Date Requested Status
Kapil Thangavelu Approve
Review via email: mp+196372@code.launchpad.net

Commit message

decorate tests failing on LP builders, cp mock.py from python-mock==1.0.1 (to fix building on precise)

To post a comment you must log in.
86. By JuanJo Ciarlante

as per hazmat, directly cp mock.py into distrib and keep previous mock usage

Revision history for this message
Kapil Thangavelu (hazmat) wrote :

looks good, thanks. modified to use a constant based on env var instead of repeating DEB_BUILD_ARCH.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file 'deployer/tests/mock.py'
--- deployer/tests/mock.py 1970-01-01 00:00:00 +0000
+++ deployer/tests/mock.py 2013-11-22 20:44:08 +0000
@@ -0,0 +1,2367 @@
1# mock.py
2# Test tools for mocking and patching.
3# Copyright (C) 2007-2012 Michael Foord & the mock team
4# E-mail: fuzzyman AT voidspace DOT org DOT uk
5
6# mock 1.0
7# http://www.voidspace.org.uk/python/mock/
8
9# Released subject to the BSD License
10# Please see http://www.voidspace.org.uk/python/license.shtml
11
12# Scripts maintained at http://www.voidspace.org.uk/python/index.shtml
13# Comments, suggestions and bug reports welcome.
14
15
16__all__ = (
17 'Mock',
18 'MagicMock',
19 'patch',
20 'sentinel',
21 'DEFAULT',
22 'ANY',
23 'call',
24 'create_autospec',
25 'FILTER_DIR',
26 'NonCallableMock',
27 'NonCallableMagicMock',
28 'mock_open',
29 'PropertyMock',
30)
31
32
33__version__ = '1.0.1'
34
35
36import pprint
37import sys
38
39try:
40 import inspect
41except ImportError:
42 # for alternative platforms that
43 # may not have inspect
44 inspect = None
45
46try:
47 from functools import wraps as original_wraps
48except ImportError:
49 # Python 2.4 compatibility
50 def wraps(original):
51 def inner(f):
52 f.__name__ = original.__name__
53 f.__doc__ = original.__doc__
54 f.__module__ = original.__module__
55 f.__wrapped__ = original
56 return f
57 return inner
58else:
59 if sys.version_info[:2] >= (3, 3):
60 wraps = original_wraps
61 else:
62 def wraps(func):
63 def inner(f):
64 f = original_wraps(func)(f)
65 f.__wrapped__ = func
66 return f
67 return inner
68
69try:
70 unicode
71except NameError:
72 # Python 3
73 basestring = unicode = str
74
75try:
76 long
77except NameError:
78 # Python 3
79 long = int
80
81try:
82 BaseException
83except NameError:
84 # Python 2.4 compatibility
85 BaseException = Exception
86
87try:
88 next
89except NameError:
90 def next(obj):
91 return obj.next()
92
93
94BaseExceptions = (BaseException,)
95if 'java' in sys.platform:
96 # jython
97 import java
98 BaseExceptions = (BaseException, java.lang.Throwable)
99
100try:
101 _isidentifier = str.isidentifier
102except AttributeError:
103 # Python 2.X
104 import keyword
105 import re
106 regex = re.compile(r'^[a-z_][a-z0-9_]*$', re.I)
107 def _isidentifier(string):
108 if string in keyword.kwlist:
109 return False
110 return regex.match(string)
111
112
113inPy3k = sys.version_info[0] == 3
114
115# Needed to work around Python 3 bug where use of "super" interferes with
116# defining __class__ as a descriptor
117_super = super
118
119self = 'im_self'
120builtin = '__builtin__'
121if inPy3k:
122 self = '__self__'
123 builtin = 'builtins'
124
125FILTER_DIR = True
126
127
128def _is_instance_mock(obj):
129 # can't use isinstance on Mock objects because they override __class__
130 # The base class for all mocks is NonCallableMock
131 return issubclass(type(obj), NonCallableMock)
132
133
134def _is_exception(obj):
135 return (
136 isinstance(obj, BaseExceptions) or
137 isinstance(obj, ClassTypes) and issubclass(obj, BaseExceptions)
138 )
139
140
141class _slotted(object):
142 __slots__ = ['a']
143
144
145DescriptorTypes = (
146 type(_slotted.a),
147 property,
148)
149
150
151def _getsignature(func, skipfirst, instance=False):
152 if inspect is None:
153 raise ImportError('inspect module not available')
154
155 if isinstance(func, ClassTypes) and not instance:
156 try:
157 func = func.__init__
158 except AttributeError:
159 return
160 skipfirst = True
161 elif not isinstance(func, FunctionTypes):
162 # for classes where instance is True we end up here too
163 try:
164 func = func.__call__
165 except AttributeError:
166 return
167
168 if inPy3k:
169 try:
170 argspec = inspect.getfullargspec(func)
171 except TypeError:
172 # C function / method, possibly inherited object().__init__
173 return
174 regargs, varargs, varkw, defaults, kwonly, kwonlydef, ann = argspec
175 else:
176 try:
177 regargs, varargs, varkwargs, defaults = inspect.getargspec(func)
178 except TypeError:
179 # C function / method, possibly inherited object().__init__
180 return
181
182 # instance methods and classmethods need to lose the self argument
183 if getattr(func, self, None) is not None:
184 regargs = regargs[1:]
185 if skipfirst:
186 # this condition and the above one are never both True - why?
187 regargs = regargs[1:]
188
189 if inPy3k:
190 signature = inspect.formatargspec(
191 regargs, varargs, varkw, defaults,
192 kwonly, kwonlydef, ann, formatvalue=lambda value: "")
193 else:
194 signature = inspect.formatargspec(
195 regargs, varargs, varkwargs, defaults,
196 formatvalue=lambda value: "")
197 return signature[1:-1], func
198
199
200def _check_signature(func, mock, skipfirst, instance=False):
201 if not _callable(func):
202 return
203
204 result = _getsignature(func, skipfirst, instance)
205 if result is None:
206 return
207 signature, func = result
208
209 # can't use self because "self" is common as an argument name
210 # unfortunately even not in the first place
211 src = "lambda _mock_self, %s: None" % signature
212 checksig = eval(src, {})
213 _copy_func_details(func, checksig)
214 type(mock)._mock_check_sig = checksig
215
216
217def _copy_func_details(func, funcopy):
218 funcopy.__name__ = func.__name__
219 funcopy.__doc__ = func.__doc__
220 #funcopy.__dict__.update(func.__dict__)
221 funcopy.__module__ = func.__module__
222 if not inPy3k:
223 funcopy.func_defaults = func.func_defaults
224 return
225 funcopy.__defaults__ = func.__defaults__
226 funcopy.__kwdefaults__ = func.__kwdefaults__
227
228
229def _callable(obj):
230 if isinstance(obj, ClassTypes):
231 return True
232 if getattr(obj, '__call__', None) is not None:
233 return True
234 return False
235
236
237def _is_list(obj):
238 # checks for list or tuples
239 # XXXX badly named!
240 return type(obj) in (list, tuple)
241
242
243def _instance_callable(obj):
244 """Given an object, return True if the object is callable.
245 For classes, return True if instances would be callable."""
246 if not isinstance(obj, ClassTypes):
247 # already an instance
248 return getattr(obj, '__call__', None) is not None
249
250 klass = obj
251 # uses __bases__ instead of __mro__ so that we work with old style classes
252 if klass.__dict__.get('__call__') is not None:
253 return True
254
255 for base in klass.__bases__:
256 if _instance_callable(base):
257 return True
258 return False
259
260
261def _set_signature(mock, original, instance=False):
262 # creates a function with signature (*args, **kwargs) that delegates to a
263 # mock. It still does signature checking by calling a lambda with the same
264 # signature as the original.
265 if not _callable(original):
266 return
267
268 skipfirst = isinstance(original, ClassTypes)
269 result = _getsignature(original, skipfirst, instance)
270 if result is None:
271 # was a C function (e.g. object().__init__ ) that can't be mocked
272 return
273
274 signature, func = result
275
276 src = "lambda %s: None" % signature
277 checksig = eval(src, {})
278 _copy_func_details(func, checksig)
279
280 name = original.__name__
281 if not _isidentifier(name):
282 name = 'funcopy'
283 context = {'_checksig_': checksig, 'mock': mock}
284 src = """def %s(*args, **kwargs):
285 _checksig_(*args, **kwargs)
286 return mock(*args, **kwargs)""" % name
287 exec (src, context)
288 funcopy = context[name]
289 _setup_func(funcopy, mock)
290 return funcopy
291
292
293def _setup_func(funcopy, mock):
294 funcopy.mock = mock
295
296 # can't use isinstance with mocks
297 if not _is_instance_mock(mock):
298 return
299
300 def assert_called_with(*args, **kwargs):
301 return mock.assert_called_with(*args, **kwargs)
302 def assert_called_once_with(*args, **kwargs):
303 return mock.assert_called_once_with(*args, **kwargs)
304 def assert_has_calls(*args, **kwargs):
305 return mock.assert_has_calls(*args, **kwargs)
306 def assert_any_call(*args, **kwargs):
307 return mock.assert_any_call(*args, **kwargs)
308 def reset_mock():
309 funcopy.method_calls = _CallList()
310 funcopy.mock_calls = _CallList()
311 mock.reset_mock()
312 ret = funcopy.return_value
313 if _is_instance_mock(ret) and not ret is mock:
314 ret.reset_mock()
315
316 funcopy.called = False
317 funcopy.call_count = 0
318 funcopy.call_args = None
319 funcopy.call_args_list = _CallList()
320 funcopy.method_calls = _CallList()
321 funcopy.mock_calls = _CallList()
322
323 funcopy.return_value = mock.return_value
324 funcopy.side_effect = mock.side_effect
325 funcopy._mock_children = mock._mock_children
326
327 funcopy.assert_called_with = assert_called_with
328 funcopy.assert_called_once_with = assert_called_once_with
329 funcopy.assert_has_calls = assert_has_calls
330 funcopy.assert_any_call = assert_any_call
331 funcopy.reset_mock = reset_mock
332
333 mock._mock_delegate = funcopy
334
335
336def _is_magic(name):
337 return '__%s__' % name[2:-2] == name
338
339
340class _SentinelObject(object):
341 "A unique, named, sentinel object."
342 def __init__(self, name):
343 self.name = name
344
345 def __repr__(self):
346 return 'sentinel.%s' % self.name
347
348
349class _Sentinel(object):
350 """Access attributes to return a named object, usable as a sentinel."""
351 def __init__(self):
352 self._sentinels = {}
353
354 def __getattr__(self, name):
355 if name == '__bases__':
356 # Without this help(mock) raises an exception
357 raise AttributeError
358 return self._sentinels.setdefault(name, _SentinelObject(name))
359
360
361sentinel = _Sentinel()
362
363DEFAULT = sentinel.DEFAULT
364_missing = sentinel.MISSING
365_deleted = sentinel.DELETED
366
367
368class OldStyleClass:
369 pass
370ClassType = type(OldStyleClass)
371
372
373def _copy(value):
374 if type(value) in (dict, list, tuple, set):
375 return type(value)(value)
376 return value
377
378
379ClassTypes = (type,)
380if not inPy3k:
381 ClassTypes = (type, ClassType)
382
383_allowed_names = set(
384 [
385 'return_value', '_mock_return_value', 'side_effect',
386 '_mock_side_effect', '_mock_parent', '_mock_new_parent',
387 '_mock_name', '_mock_new_name'
388 ]
389)
390
391
392def _delegating_property(name):
393 _allowed_names.add(name)
394 _the_name = '_mock_' + name
395 def _get(self, name=name, _the_name=_the_name):
396 sig = self._mock_delegate
397 if sig is None:
398 return getattr(self, _the_name)
399 return getattr(sig, name)
400 def _set(self, value, name=name, _the_name=_the_name):
401 sig = self._mock_delegate
402 if sig is None:
403 self.__dict__[_the_name] = value
404 else:
405 setattr(sig, name, value)
406
407 return property(_get, _set)
408
409
410
411class _CallList(list):
412
413 def __contains__(self, value):
414 if not isinstance(value, list):
415 return list.__contains__(self, value)
416 len_value = len(value)
417 len_self = len(self)
418 if len_value > len_self:
419 return False
420
421 for i in range(0, len_self - len_value + 1):
422 sub_list = self[i:i+len_value]
423 if sub_list == value:
424 return True
425 return False
426
427 def __repr__(self):
428 return pprint.pformat(list(self))
429
430
431def _check_and_set_parent(parent, value, name, new_name):
432 if not _is_instance_mock(value):
433 return False
434 if ((value._mock_name or value._mock_new_name) or
435 (value._mock_parent is not None) or
436 (value._mock_new_parent is not None)):
437 return False
438
439 _parent = parent
440 while _parent is not None:
441 # setting a mock (value) as a child or return value of itself
442 # should not modify the mock
443 if _parent is value:
444 return False
445 _parent = _parent._mock_new_parent
446
447 if new_name:
448 value._mock_new_parent = parent
449 value._mock_new_name = new_name
450 if name:
451 value._mock_parent = parent
452 value._mock_name = name
453 return True
454
455
456
457class Base(object):
458 _mock_return_value = DEFAULT
459 _mock_side_effect = None
460 def __init__(self, *args, **kwargs):
461 pass
462
463
464
465class NonCallableMock(Base):
466 """A non-callable version of `Mock`"""
467
468 def __new__(cls, *args, **kw):
469 # every instance has its own class
470 # so we can create magic methods on the
471 # class without stomping on other mocks
472 new = type(cls.__name__, (cls,), {'__doc__': cls.__doc__})
473 instance = object.__new__(new)
474 return instance
475
476
477 def __init__(
478 self, spec=None, wraps=None, name=None, spec_set=None,
479 parent=None, _spec_state=None, _new_name='', _new_parent=None,
480 **kwargs
481 ):
482 if _new_parent is None:
483 _new_parent = parent
484
485 __dict__ = self.__dict__
486 __dict__['_mock_parent'] = parent
487 __dict__['_mock_name'] = name
488 __dict__['_mock_new_name'] = _new_name
489 __dict__['_mock_new_parent'] = _new_parent
490
491 if spec_set is not None:
492 spec = spec_set
493 spec_set = True
494
495 self._mock_add_spec(spec, spec_set)
496
497 __dict__['_mock_children'] = {}
498 __dict__['_mock_wraps'] = wraps
499 __dict__['_mock_delegate'] = None
500
501 __dict__['_mock_called'] = False
502 __dict__['_mock_call_args'] = None
503 __dict__['_mock_call_count'] = 0
504 __dict__['_mock_call_args_list'] = _CallList()
505 __dict__['_mock_mock_calls'] = _CallList()
506
507 __dict__['method_calls'] = _CallList()
508
509 if kwargs:
510 self.configure_mock(**kwargs)
511
512 _super(NonCallableMock, self).__init__(
513 spec, wraps, name, spec_set, parent,
514 _spec_state
515 )
516
517
518 def attach_mock(self, mock, attribute):
519 """
520 Attach a mock as an attribute of this one, replacing its name and
521 parent. Calls to the attached mock will be recorded in the
522 `method_calls` and `mock_calls` attributes of this one."""
523 mock._mock_parent = None
524 mock._mock_new_parent = None
525 mock._mock_name = ''
526 mock._mock_new_name = None
527
528 setattr(self, attribute, mock)
529
530
531 def mock_add_spec(self, spec, spec_set=False):
532 """Add a spec to a mock. `spec` can either be an object or a
533 list of strings. Only attributes on the `spec` can be fetched as
534 attributes from the mock.
535
536 If `spec_set` is True then only attributes on the spec can be set."""
537 self._mock_add_spec(spec, spec_set)
538
539
540 def _mock_add_spec(self, spec, spec_set):
541 _spec_class = None
542
543 if spec is not None and not _is_list(spec):
544 if isinstance(spec, ClassTypes):
545 _spec_class = spec
546 else:
547 _spec_class = _get_class(spec)
548
549 spec = dir(spec)
550
551 __dict__ = self.__dict__
552 __dict__['_spec_class'] = _spec_class
553 __dict__['_spec_set'] = spec_set
554 __dict__['_mock_methods'] = spec
555
556
557 def __get_return_value(self):
558 ret = self._mock_return_value
559 if self._mock_delegate is not None:
560 ret = self._mock_delegate.return_value
561
562 if ret is DEFAULT:
563 ret = self._get_child_mock(
564 _new_parent=self, _new_name='()'
565 )
566 self.return_value = ret
567 return ret
568
569
570 def __set_return_value(self, value):
571 if self._mock_delegate is not None:
572 self._mock_delegate.return_value = value
573 else:
574 self._mock_return_value = value
575 _check_and_set_parent(self, value, None, '()')
576
577 __return_value_doc = "The value to be returned when the mock is called."
578 return_value = property(__get_return_value, __set_return_value,
579 __return_value_doc)
580
581
582 @property
583 def __class__(self):
584 if self._spec_class is None:
585 return type(self)
586 return self._spec_class
587
588 called = _delegating_property('called')
589 call_count = _delegating_property('call_count')
590 call_args = _delegating_property('call_args')
591 call_args_list = _delegating_property('call_args_list')
592 mock_calls = _delegating_property('mock_calls')
593
594
595 def __get_side_effect(self):
596 sig = self._mock_delegate
597 if sig is None:
598 return self._mock_side_effect
599 return sig.side_effect
600
601 def __set_side_effect(self, value):
602 value = _try_iter(value)
603 sig = self._mock_delegate
604 if sig is None:
605 self._mock_side_effect = value
606 else:
607 sig.side_effect = value
608
609 side_effect = property(__get_side_effect, __set_side_effect)
610
611
612 def reset_mock(self):
613 "Restore the mock object to its initial state."
614 self.called = False
615 self.call_args = None
616 self.call_count = 0
617 self.mock_calls = _CallList()
618 self.call_args_list = _CallList()
619 self.method_calls = _CallList()
620
621 for child in self._mock_children.values():
622 if isinstance(child, _SpecState):
623 continue
624 child.reset_mock()
625
626 ret = self._mock_return_value
627 if _is_instance_mock(ret) and ret is not self:
628 ret.reset_mock()
629
630
631 def configure_mock(self, **kwargs):
632 """Set attributes on the mock through keyword arguments.
633
634 Attributes plus return values and side effects can be set on child
635 mocks using standard dot notation and unpacking a dictionary in the
636 method call:
637
638 >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError}
639 >>> mock.configure_mock(**attrs)"""
640 for arg, val in sorted(kwargs.items(),
641 # we sort on the number of dots so that
642 # attributes are set before we set attributes on
643 # attributes
644 key=lambda entry: entry[0].count('.')):
645 args = arg.split('.')
646 final = args.pop()
647 obj = self
648 for entry in args:
649 obj = getattr(obj, entry)
650 setattr(obj, final, val)
651
652
653 def __getattr__(self, name):
654 if name == '_mock_methods':
655 raise AttributeError(name)
656 elif self._mock_methods is not None:
657 if name not in self._mock_methods or name in _all_magics:
658 raise AttributeError("Mock object has no attribute %r" % name)
659 elif _is_magic(name):
660 raise AttributeError(name)
661
662 result = self._mock_children.get(name)
663 if result is _deleted:
664 raise AttributeError(name)
665 elif result is None:
666 wraps = None
667 if self._mock_wraps is not None:
668 # XXXX should we get the attribute without triggering code
669 # execution?
670 wraps = getattr(self._mock_wraps, name)
671
672 result = self._get_child_mock(
673 parent=self, name=name, wraps=wraps, _new_name=name,
674 _new_parent=self
675 )
676 self._mock_children[name] = result
677
678 elif isinstance(result, _SpecState):
679 result = create_autospec(
680 result.spec, result.spec_set, result.instance,
681 result.parent, result.name
682 )
683 self._mock_children[name] = result
684
685 return result
686
687
688 def __repr__(self):
689 _name_list = [self._mock_new_name]
690 _parent = self._mock_new_parent
691 last = self
692
693 dot = '.'
694 if _name_list == ['()']:
695 dot = ''
696 seen = set()
697 while _parent is not None:
698 last = _parent
699
700 _name_list.append(_parent._mock_new_name + dot)
701 dot = '.'
702 if _parent._mock_new_name == '()':
703 dot = ''
704
705 _parent = _parent._mock_new_parent
706
707 # use ids here so as not to call __hash__ on the mocks
708 if id(_parent) in seen:
709 break
710 seen.add(id(_parent))
711
712 _name_list = list(reversed(_name_list))
713 _first = last._mock_name or 'mock'
714 if len(_name_list) > 1:
715 if _name_list[1] not in ('()', '().'):
716 _first += '.'
717 _name_list[0] = _first
718 name = ''.join(_name_list)
719
720 name_string = ''
721 if name not in ('mock', 'mock.'):
722 name_string = ' name=%r' % name
723
724 spec_string = ''
725 if self._spec_class is not None:
726 spec_string = ' spec=%r'
727 if self._spec_set:
728 spec_string = ' spec_set=%r'
729 spec_string = spec_string % self._spec_class.__name__
730 return "<%s%s%s id='%s'>" % (
731 type(self).__name__,
732 name_string,
733 spec_string,
734 id(self)
735 )
736
737
738 def __dir__(self):
739 """Filter the output of `dir(mock)` to only useful members.
740 XXXX
741 """
742 extras = self._mock_methods or []
743 from_type = dir(type(self))
744 from_dict = list(self.__dict__)
745
746 if FILTER_DIR:
747 from_type = [e for e in from_type if not e.startswith('_')]
748 from_dict = [e for e in from_dict if not e.startswith('_') or
749 _is_magic(e)]
750 return sorted(set(extras + from_type + from_dict +
751 list(self._mock_children)))
752
753
754 def __setattr__(self, name, value):
755 if name in _allowed_names:
756 # property setters go through here
757 return object.__setattr__(self, name, value)
758 elif (self._spec_set and self._mock_methods is not None and
759 name not in self._mock_methods and
760 name not in self.__dict__):
761 raise AttributeError("Mock object has no attribute '%s'" % name)
762 elif name in _unsupported_magics:
763 msg = 'Attempting to set unsupported magic method %r.' % name
764 raise AttributeError(msg)
765 elif name in _all_magics:
766 if self._mock_methods is not None and name not in self._mock_methods:
767 raise AttributeError("Mock object has no attribute '%s'" % name)
768
769 if not _is_instance_mock(value):
770 setattr(type(self), name, _get_method(name, value))
771 original = value
772 value = lambda *args, **kw: original(self, *args, **kw)
773 else:
774 # only set _new_name and not name so that mock_calls is tracked
775 # but not method calls
776 _check_and_set_parent(self, value, None, name)
777 setattr(type(self), name, value)
778 self._mock_children[name] = value
779 elif name == '__class__':
780 self._spec_class = value
781 return
782 else:
783 if _check_and_set_parent(self, value, name, name):
784 self._mock_children[name] = value
785 return object.__setattr__(self, name, value)
786
787
788 def __delattr__(self, name):
789 if name in _all_magics and name in type(self).__dict__:
790 delattr(type(self), name)
791 if name not in self.__dict__:
792 # for magic methods that are still MagicProxy objects and
793 # not set on the instance itself
794 return
795
796 if name in self.__dict__:
797 object.__delattr__(self, name)
798
799 obj = self._mock_children.get(name, _missing)
800 if obj is _deleted:
801 raise AttributeError(name)
802 if obj is not _missing:
803 del self._mock_children[name]
804 self._mock_children[name] = _deleted
805
806
807
808 def _format_mock_call_signature(self, args, kwargs):
809 name = self._mock_name or 'mock'
810 return _format_call_signature(name, args, kwargs)
811
812
813 def _format_mock_failure_message(self, args, kwargs):
814 message = 'Expected call: %s\nActual call: %s'
815 expected_string = self._format_mock_call_signature(args, kwargs)
816 call_args = self.call_args
817 if len(call_args) == 3:
818 call_args = call_args[1:]
819 actual_string = self._format_mock_call_signature(*call_args)
820 return message % (expected_string, actual_string)
821
822
823 def assert_called_with(_mock_self, *args, **kwargs):
824 """assert that the mock was called with the specified arguments.
825
826 Raises an AssertionError if the args and keyword args passed in are
827 different to the last call to the mock."""
828 self = _mock_self
829 if self.call_args is None:
830 expected = self._format_mock_call_signature(args, kwargs)
831 raise AssertionError('Expected call: %s\nNot called' % (expected,))
832
833 if self.call_args != (args, kwargs):
834 msg = self._format_mock_failure_message(args, kwargs)
835 raise AssertionError(msg)
836
837
838 def assert_called_once_with(_mock_self, *args, **kwargs):
839 """assert that the mock was called exactly once and with the specified
840 arguments."""
841 self = _mock_self
842 if not self.call_count == 1:
843 msg = ("Expected to be called once. Called %s times." %
844 self.call_count)
845 raise AssertionError(msg)
846 return self.assert_called_with(*args, **kwargs)
847
848
849 def assert_has_calls(self, calls, any_order=False):
850 """assert the mock has been called with the specified calls.
851 The `mock_calls` list is checked for the calls.
852
853 If `any_order` is False (the default) then the calls must be
854 sequential. There can be extra calls before or after the
855 specified calls.
856
857 If `any_order` is True then the calls can be in any order, but
858 they must all appear in `mock_calls`."""
859 if not any_order:
860 if calls not in self.mock_calls:
861 raise AssertionError(
862 'Calls not found.\nExpected: %r\n'
863 'Actual: %r' % (calls, self.mock_calls)
864 )
865 return
866
867 all_calls = list(self.mock_calls)
868
869 not_found = []
870 for kall in calls:
871 try:
872 all_calls.remove(kall)
873 except ValueError:
874 not_found.append(kall)
875 if not_found:
876 raise AssertionError(
877 '%r not all found in call list' % (tuple(not_found),)
878 )
879
880
881 def assert_any_call(self, *args, **kwargs):
882 """assert the mock has been called with the specified arguments.
883
884 The assert passes if the mock has *ever* been called, unlike
885 `assert_called_with` and `assert_called_once_with` that only pass if
886 the call is the most recent one."""
887 kall = call(*args, **kwargs)
888 if kall not in self.call_args_list:
889 expected_string = self._format_mock_call_signature(args, kwargs)
890 raise AssertionError(
891 '%s call not found' % expected_string
892 )
893
894
895 def _get_child_mock(self, **kw):
896 """Create the child mocks for attributes and return value.
897 By default child mocks will be the same type as the parent.
898 Subclasses of Mock may want to override this to customize the way
899 child mocks are made.
900
901 For non-callable mocks the callable variant will be used (rather than
902 any custom subclass)."""
903 _type = type(self)
904 if not issubclass(_type, CallableMixin):
905 if issubclass(_type, NonCallableMagicMock):
906 klass = MagicMock
907 elif issubclass(_type, NonCallableMock) :
908 klass = Mock
909 else:
910 klass = _type.__mro__[1]
911 return klass(**kw)
912
913
914
915def _try_iter(obj):
916 if obj is None:
917 return obj
918 if _is_exception(obj):
919 return obj
920 if _callable(obj):
921 return obj
922 try:
923 return iter(obj)
924 except TypeError:
925 # XXXX backwards compatibility
926 # but this will blow up on first call - so maybe we should fail early?
927 return obj
928
929
930
931class CallableMixin(Base):
932
933 def __init__(self, spec=None, side_effect=None, return_value=DEFAULT,
934 wraps=None, name=None, spec_set=None, parent=None,
935 _spec_state=None, _new_name='', _new_parent=None, **kwargs):
936 self.__dict__['_mock_return_value'] = return_value
937
938 _super(CallableMixin, self).__init__(
939 spec, wraps, name, spec_set, parent,
940 _spec_state, _new_name, _new_parent, **kwargs
941 )
942
943 self.side_effect = side_effect
944
945
946 def _mock_check_sig(self, *args, **kwargs):
947 # stub method that can be replaced with one with a specific signature
948 pass
949
950
951 def __call__(_mock_self, *args, **kwargs):
952 # can't use self in-case a function / method we are mocking uses self
953 # in the signature
954 _mock_self._mock_check_sig(*args, **kwargs)
955 return _mock_self._mock_call(*args, **kwargs)
956
957
958 def _mock_call(_mock_self, *args, **kwargs):
959 self = _mock_self
960 self.called = True
961 self.call_count += 1
962 self.call_args = _Call((args, kwargs), two=True)
963 self.call_args_list.append(_Call((args, kwargs), two=True))
964
965 _new_name = self._mock_new_name
966 _new_parent = self._mock_new_parent
967 self.mock_calls.append(_Call(('', args, kwargs)))
968
969 seen = set()
970 skip_next_dot = _new_name == '()'
971 do_method_calls = self._mock_parent is not None
972 name = self._mock_name
973 while _new_parent is not None:
974 this_mock_call = _Call((_new_name, args, kwargs))
975 if _new_parent._mock_new_name:
976 dot = '.'
977 if skip_next_dot:
978 dot = ''
979
980 skip_next_dot = False
981 if _new_parent._mock_new_name == '()':
982 skip_next_dot = True
983
984 _new_name = _new_parent._mock_new_name + dot + _new_name
985
986 if do_method_calls:
987 if _new_name == name:
988 this_method_call = this_mock_call
989 else:
990 this_method_call = _Call((name, args, kwargs))
991 _new_parent.method_calls.append(this_method_call)
992
993 do_method_calls = _new_parent._mock_parent is not None
994 if do_method_calls:
995 name = _new_parent._mock_name + '.' + name
996
997 _new_parent.mock_calls.append(this_mock_call)
998 _new_parent = _new_parent._mock_new_parent
999
1000 # use ids here so as not to call __hash__ on the mocks
1001 _new_parent_id = id(_new_parent)
1002 if _new_parent_id in seen:
1003 break
1004 seen.add(_new_parent_id)
1005
1006 ret_val = DEFAULT
1007 effect = self.side_effect
1008 if effect is not None:
1009 if _is_exception(effect):
1010 raise effect
1011
1012 if not _callable(effect):
1013 result = next(effect)
1014 if _is_exception(result):
1015 raise result
1016 return result
1017
1018 ret_val = effect(*args, **kwargs)
1019 if ret_val is DEFAULT:
1020 ret_val = self.return_value
1021
1022 if (self._mock_wraps is not None and
1023 self._mock_return_value is DEFAULT):
1024 return self._mock_wraps(*args, **kwargs)
1025 if ret_val is DEFAULT:
1026 ret_val = self.return_value
1027 return ret_val
1028
1029
1030
1031class Mock(CallableMixin, NonCallableMock):
1032 """
1033 Create a new `Mock` object. `Mock` takes several optional arguments
1034 that specify the behaviour of the Mock object:
1035
1036 * `spec`: This can be either a list of strings or an existing object (a
1037 class or instance) that acts as the specification for the mock object. If
1038 you pass in an object then a list of strings is formed by calling dir on
1039 the object (excluding unsupported magic attributes and methods). Accessing
1040 any attribute not in this list will raise an `AttributeError`.
1041
1042 If `spec` is an object (rather than a list of strings) then
1043 `mock.__class__` returns the class of the spec object. This allows mocks
1044 to pass `isinstance` tests.
1045
1046 * `spec_set`: A stricter variant of `spec`. If used, attempting to *set*
1047 or get an attribute on the mock that isn't on the object passed as
1048 `spec_set` will raise an `AttributeError`.
1049
1050 * `side_effect`: A function to be called whenever the Mock is called. See
1051 the `side_effect` attribute. Useful for raising exceptions or
1052 dynamically changing return values. The function is called with the same
1053 arguments as the mock, and unless it returns `DEFAULT`, the return
1054 value of this function is used as the return value.
1055
1056 Alternatively `side_effect` can be an exception class or instance. In
1057 this case the exception will be raised when the mock is called.
1058
1059 If `side_effect` is an iterable then each call to the mock will return
1060 the next value from the iterable. If any of the members of the iterable
1061 are exceptions they will be raised instead of returned.
1062
1063 * `return_value`: The value returned when the mock is called. By default
1064 this is a new Mock (created on first access). See the
1065 `return_value` attribute.
1066
1067 * `wraps`: Item for the mock object to wrap. If `wraps` is not None then
1068 calling the Mock will pass the call through to the wrapped object
1069 (returning the real result). Attribute access on the mock will return a
1070 Mock object that wraps the corresponding attribute of the wrapped object
1071 (so attempting to access an attribute that doesn't exist will raise an
1072 `AttributeError`).
1073
1074 If the mock has an explicit `return_value` set then calls are not passed
1075 to the wrapped object and the `return_value` is returned instead.
1076
1077 * `name`: If the mock has a name then it will be used in the repr of the
1078 mock. This can be useful for debugging. The name is propagated to child
1079 mocks.
1080
1081 Mocks can also be called with arbitrary keyword arguments. These will be
1082 used to set attributes on the mock after it is created.
1083 """
1084
1085
1086
1087def _dot_lookup(thing, comp, import_path):
1088 try:
1089 return getattr(thing, comp)
1090 except AttributeError:
1091 __import__(import_path)
1092 return getattr(thing, comp)
1093
1094
1095def _importer(target):
1096 components = target.split('.')
1097 import_path = components.pop(0)
1098 thing = __import__(import_path)
1099
1100 for comp in components:
1101 import_path += ".%s" % comp
1102 thing = _dot_lookup(thing, comp, import_path)
1103 return thing
1104
1105
1106def _is_started(patcher):
1107 # XXXX horrible
1108 return hasattr(patcher, 'is_local')
1109
1110
1111class _patch(object):
1112
1113 attribute_name = None
1114 _active_patches = set()
1115
1116 def __init__(
1117 self, getter, attribute, new, spec, create,
1118 spec_set, autospec, new_callable, kwargs
1119 ):
1120 if new_callable is not None:
1121 if new is not DEFAULT:
1122 raise ValueError(
1123 "Cannot use 'new' and 'new_callable' together"
1124 )
1125 if autospec is not None:
1126 raise ValueError(
1127 "Cannot use 'autospec' and 'new_callable' together"
1128 )
1129
1130 self.getter = getter
1131 self.attribute = attribute
1132 self.new = new
1133 self.new_callable = new_callable
1134 self.spec = spec
1135 self.create = create
1136 self.has_local = False
1137 self.spec_set = spec_set
1138 self.autospec = autospec
1139 self.kwargs = kwargs
1140 self.additional_patchers = []
1141
1142
1143 def copy(self):
1144 patcher = _patch(
1145 self.getter, self.attribute, self.new, self.spec,
1146 self.create, self.spec_set,
1147 self.autospec, self.new_callable, self.kwargs
1148 )
1149 patcher.attribute_name = self.attribute_name
1150 patcher.additional_patchers = [
1151 p.copy() for p in self.additional_patchers
1152 ]
1153 return patcher
1154
1155
1156 def __call__(self, func):
1157 if isinstance(func, ClassTypes):
1158 return self.decorate_class(func)
1159 return self.decorate_callable(func)
1160
1161
1162 def decorate_class(self, klass):
1163 for attr in dir(klass):
1164 if not attr.startswith(patch.TEST_PREFIX):
1165 continue
1166
1167 attr_value = getattr(klass, attr)
1168 if not hasattr(attr_value, "__call__"):
1169 continue
1170
1171 patcher = self.copy()
1172 setattr(klass, attr, patcher(attr_value))
1173 return klass
1174
1175
1176 def decorate_callable(self, func):
1177 if hasattr(func, 'patchings'):
1178 func.patchings.append(self)
1179 return func
1180
1181 @wraps(func)
1182 def patched(*args, **keywargs):
1183 # don't use a with here (backwards compatability with Python 2.4)
1184 extra_args = []
1185 entered_patchers = []
1186
1187 # can't use try...except...finally because of Python 2.4
1188 # compatibility
1189 exc_info = tuple()
1190 try:
1191 try:
1192 for patching in patched.patchings:
1193 arg = patching.__enter__()
1194 entered_patchers.append(patching)
1195 if patching.attribute_name is not None:
1196 keywargs.update(arg)
1197 elif patching.new is DEFAULT:
1198 extra_args.append(arg)
1199
1200 args += tuple(extra_args)
1201 return func(*args, **keywargs)
1202 except:
1203 if (patching not in entered_patchers and
1204 _is_started(patching)):
1205 # the patcher may have been started, but an exception
1206 # raised whilst entering one of its additional_patchers
1207 entered_patchers.append(patching)
1208 # Pass the exception to __exit__
1209 exc_info = sys.exc_info()
1210 # re-raise the exception
1211 raise
1212 finally:
1213 for patching in reversed(entered_patchers):
1214 patching.__exit__(*exc_info)
1215
1216 patched.patchings = [self]
1217 if hasattr(func, 'func_code'):
1218 # not in Python 3
1219 patched.compat_co_firstlineno = getattr(
1220 func, "compat_co_firstlineno",
1221 func.func_code.co_firstlineno
1222 )
1223 return patched
1224
1225
1226 def get_original(self):
1227 target = self.getter()
1228 name = self.attribute
1229
1230 original = DEFAULT
1231 local = False
1232
1233 try:
1234 original = target.__dict__[name]
1235 except (AttributeError, KeyError):
1236 original = getattr(target, name, DEFAULT)
1237 else:
1238 local = True
1239
1240 if not self.create and original is DEFAULT:
1241 raise AttributeError(
1242 "%s does not have the attribute %r" % (target, name)
1243 )
1244 return original, local
1245
1246
1247 def __enter__(self):
1248 """Perform the patch."""
1249 new, spec, spec_set = self.new, self.spec, self.spec_set
1250 autospec, kwargs = self.autospec, self.kwargs
1251 new_callable = self.new_callable
1252 self.target = self.getter()
1253
1254 # normalise False to None
1255 if spec is False:
1256 spec = None
1257 if spec_set is False:
1258 spec_set = None
1259 if autospec is False:
1260 autospec = None
1261
1262 if spec is not None and autospec is not None:
1263 raise TypeError("Can't specify spec and autospec")
1264 if ((spec is not None or autospec is not None) and
1265 spec_set not in (True, None)):
1266 raise TypeError("Can't provide explicit spec_set *and* spec or autospec")
1267
1268 original, local = self.get_original()
1269
1270 if new is DEFAULT and autospec is None:
1271 inherit = False
1272 if spec is True:
1273 # set spec to the object we are replacing
1274 spec = original
1275 if spec_set is True:
1276 spec_set = original
1277 spec = None
1278 elif spec is not None:
1279 if spec_set is True:
1280 spec_set = spec
1281 spec = None
1282 elif spec_set is True:
1283 spec_set = original
1284
1285 if spec is not None or spec_set is not None:
1286 if original is DEFAULT:
1287 raise TypeError("Can't use 'spec' with create=True")
1288 if isinstance(original, ClassTypes):
1289 # If we're patching out a class and there is a spec
1290 inherit = True
1291
1292 Klass = MagicMock
1293 _kwargs = {}
1294 if new_callable is not None:
1295 Klass = new_callable
1296 elif spec is not None or spec_set is not None:
1297 this_spec = spec
1298 if spec_set is not None:
1299 this_spec = spec_set
1300 if _is_list(this_spec):
1301 not_callable = '__call__' not in this_spec
1302 else:
1303 not_callable = not _callable(this_spec)
1304 if not_callable:
1305 Klass = NonCallableMagicMock
1306
1307 if spec is not None:
1308 _kwargs['spec'] = spec
1309 if spec_set is not None:
1310 _kwargs['spec_set'] = spec_set
1311
1312 # add a name to mocks
1313 if (isinstance(Klass, type) and
1314 issubclass(Klass, NonCallableMock) and self.attribute):
1315 _kwargs['name'] = self.attribute
1316
1317 _kwargs.update(kwargs)
1318 new = Klass(**_kwargs)
1319
1320 if inherit and _is_instance_mock(new):
1321 # we can only tell if the instance should be callable if the
1322 # spec is not a list
1323 this_spec = spec
1324 if spec_set is not None:
1325 this_spec = spec_set
1326 if (not _is_list(this_spec) and not
1327 _instance_callable(this_spec)):
1328 Klass = NonCallableMagicMock
1329
1330 _kwargs.pop('name')
1331 new.return_value = Klass(_new_parent=new, _new_name='()',
1332 **_kwargs)
1333 elif autospec is not None:
1334 # spec is ignored, new *must* be default, spec_set is treated
1335 # as a boolean. Should we check spec is not None and that spec_set
1336 # is a bool?
1337 if new is not DEFAULT:
1338 raise TypeError(
1339 "autospec creates the mock for you. Can't specify "
1340 "autospec and new."
1341 )
1342 if original is DEFAULT:
1343 raise TypeError("Can't use 'autospec' with create=True")
1344 spec_set = bool(spec_set)
1345 if autospec is True:
1346 autospec = original
1347
1348 new = create_autospec(autospec, spec_set=spec_set,
1349 _name=self.attribute, **kwargs)
1350 elif kwargs:
1351 # can't set keyword args when we aren't creating the mock
1352 # XXXX If new is a Mock we could call new.configure_mock(**kwargs)
1353 raise TypeError("Can't pass kwargs to a mock we aren't creating")
1354
1355 new_attr = new
1356
1357 self.temp_original = original
1358 self.is_local = local
1359 setattr(self.target, self.attribute, new_attr)
1360 if self.attribute_name is not None:
1361 extra_args = {}
1362 if self.new is DEFAULT:
1363 extra_args[self.attribute_name] = new
1364 for patching in self.additional_patchers:
1365 arg = patching.__enter__()
1366 if patching.new is DEFAULT:
1367 extra_args.update(arg)
1368 return extra_args
1369
1370 return new
1371
1372
1373 def __exit__(self, *exc_info):
1374 """Undo the patch."""
1375 if not _is_started(self):
1376 raise RuntimeError('stop called on unstarted patcher')
1377
1378 if self.is_local and self.temp_original is not DEFAULT:
1379 setattr(self.target, self.attribute, self.temp_original)
1380 else:
1381 delattr(self.target, self.attribute)
1382 if not self.create and not hasattr(self.target, self.attribute):
1383 # needed for proxy objects like django settings
1384 setattr(self.target, self.attribute, self.temp_original)
1385
1386 del self.temp_original
1387 del self.is_local
1388 del self.target
1389 for patcher in reversed(self.additional_patchers):
1390 if _is_started(patcher):
1391 patcher.__exit__(*exc_info)
1392
1393
1394 def start(self):
1395 """Activate a patch, returning any created mock."""
1396 result = self.__enter__()
1397 self._active_patches.add(self)
1398 return result
1399
1400
1401 def stop(self):
1402 """Stop an active patch."""
1403 self._active_patches.discard(self)
1404 return self.__exit__()
1405
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,
1420 create=False, spec_set=None, autospec=None,
1421 new_callable=None, **kwargs
1422 ):
1423 """
1424 patch.object(target, attribute, new=DEFAULT, spec=None, create=False,
1425 spec_set=None, autospec=None, new_callable=None, **kwargs)
1426
1427 patch the named member (`attribute`) on an object (`target`) with a mock
1428 object.
1429
1430 `patch.object` can be used as a decorator, class decorator or a context
1431 manager. Arguments `new`, `spec`, `create`, `spec_set`,
1432 `autospec` and `new_callable` have the same meaning as for `patch`. Like
1433 `patch`, `patch.object` takes arbitrary keyword arguments for configuring
1434 the mock object it creates.
1435
1436 When used as a class decorator `patch.object` honours `patch.TEST_PREFIX`
1437 for choosing which methods to wrap.
1438 """
1439 getter = lambda: target
1440 return _patch(
1441 getter, attribute, new, spec, create,
1442 spec_set, autospec, new_callable, kwargs
1443 )
1444
1445
1446def _patch_multiple(target, spec=None, create=False, spec_set=None,
1447 autospec=None, new_callable=None, **kwargs):
1448 """Perform multiple patches in a single call. It takes the object to be
1449 patched (either as an object or a string to fetch the object by importing)
1450 and keyword arguments for the patches::
1451
1452 with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'):
1453 ...
1454
1455 Use `DEFAULT` as the value if you want `patch.multiple` to create
1456 mocks for you. In this case the created mocks are passed into a decorated
1457 function by keyword, and a dictionary is returned when `patch.multiple` is
1458 used as a context manager.
1459
1460 `patch.multiple` can be used as a decorator, class decorator or a context
1461 manager. The arguments `spec`, `spec_set`, `create`,
1462 `autospec` and `new_callable` have the same meaning as for `patch`. These
1463 arguments will be applied to *all* patches done by `patch.multiple`.
1464
1465 When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX`
1466 for choosing which methods to wrap.
1467 """
1468 if type(target) in (unicode, str):
1469 getter = lambda: _importer(target)
1470 else:
1471 getter = lambda: target
1472
1473 if not kwargs:
1474 raise ValueError(
1475 'Must supply at least one keyword argument with patch.multiple'
1476 )
1477 # need to wrap in a list for python 3, where items is a view
1478 items = list(kwargs.items())
1479 attribute, new = items[0]
1480 patcher = _patch(
1481 getter, attribute, new, spec, create, spec_set,
1482 autospec, new_callable, {}
1483 )
1484 patcher.attribute_name = attribute
1485 for attribute, new in items[1:]:
1486 this_patcher = _patch(
1487 getter, attribute, new, spec, create, spec_set,
1488 autospec, new_callable, {}
1489 )
1490 this_patcher.attribute_name = attribute
1491 patcher.additional_patchers.append(this_patcher)
1492 return patcher
1493
1494
1495def patch(
1496 target, new=DEFAULT, spec=None, create=False,
1497 spec_set=None, autospec=None, new_callable=None, **kwargs
1498 ):
1499 """
1500 `patch` acts as a function decorator, class decorator or a context
1501 manager. Inside the body of the function or with statement, the `target`
1502 is patched with a `new` object. When the function/with statement exits
1503 the patch is undone.
1504
1505 If `new` is omitted, then the target is replaced with a
1506 `MagicMock`. If `patch` is used as a decorator and `new` is
1507 omitted, the created mock is passed in as an extra argument to the
1508 decorated function. If `patch` is used as a context manager the created
1509 mock is returned by the context manager.
1510
1511 `target` should be a string in the form `'package.module.ClassName'`. The
1512 `target` is imported and the specified object replaced with the `new`
1513 object, so the `target` must be importable from the environment you are
1514 calling `patch` from. The target is imported when the decorated function
1515 is executed, not at decoration time.
1516
1517 The `spec` and `spec_set` keyword arguments are passed to the `MagicMock`
1518 if patch is creating one for you.
1519
1520 In addition you can pass `spec=True` or `spec_set=True`, which causes
1521 patch to pass in the object being mocked as the spec/spec_set object.
1522
1523 `new_callable` allows you to specify a different class, or callable object,
1524 that will be called to create the `new` object. By default `MagicMock` is
1525 used.
1526
1527 A more powerful form of `spec` is `autospec`. If you set `autospec=True`
1528 then the mock with be created with a spec from the object being replaced.
1529 All attributes of the mock will also have the spec of the corresponding
1530 attribute of the object being replaced. Methods and functions being
1531 mocked will have their arguments checked and will raise a `TypeError` if
1532 they are called with the wrong signature. For mocks replacing a class,
1533 their return value (the 'instance') will have the same spec as the class.
1534
1535 Instead of `autospec=True` you can pass `autospec=some_object` to use an
1536 arbitrary object as the spec instead of the one being replaced.
1537
1538 By default `patch` will fail to replace attributes that don't exist. If
1539 you pass in `create=True`, and the attribute doesn't exist, patch will
1540 create the attribute for you when the patched function is called, and
1541 delete it again afterwards. This is useful for writing tests against
1542 attributes that your production code creates at runtime. It is off by by
1543 default because it can be dangerous. With it switched on you can write
1544 passing tests against APIs that don't actually exist!
1545
1546 Patch can be used as a `TestCase` class decorator. It works by
1547 decorating each test method in the class. This reduces the boilerplate
1548 code when your test methods share a common patchings set. `patch` finds
1549 tests by looking for method names that start with `patch.TEST_PREFIX`.
1550 By default this is `test`, which matches the way `unittest` finds tests.
1551 You can specify an alternative prefix by setting `patch.TEST_PREFIX`.
1552
1553 Patch can be used as a context manager, with the with statement. Here the
1554 patching applies to the indented block after the with statement. If you
1555 use "as" then the patched object will be bound to the name after the
1556 "as"; very useful if `patch` is creating a mock object for you.
1557
1558 `patch` takes arbitrary keyword arguments. These will be passed to
1559 the `Mock` (or `new_callable`) on construction.
1560
1561 `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are
1562 available for alternate use-cases.
1563 """
1564 getter, attribute = _get_target(target)
1565 return _patch(
1566 getter, attribute, new, spec, create,
1567 spec_set, autospec, new_callable, kwargs
1568 )
1569
1570
1571class _patch_dict(object):
1572 """
1573 Patch a dictionary, or dictionary like object, and restore the dictionary
1574 to its original state after the test.
1575
1576 `in_dict` can be a dictionary or a mapping like container. If it is a
1577 mapping then it must at least support getting, setting and deleting items
1578 plus iterating over keys.
1579
1580 `in_dict` can also be a string specifying the name of the dictionary, which
1581 will then be fetched by importing it.
1582
1583 `values` can be a dictionary of values to set in the dictionary. `values`
1584 can also be an iterable of `(key, value)` pairs.
1585
1586 If `clear` is True then the dictionary will be cleared before the new
1587 values are set.
1588
1589 `patch.dict` can also be called with arbitrary keyword arguments to set
1590 values in the dictionary::
1591
1592 with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()):
1593 ...
1594
1595 `patch.dict` can be used as a context manager, decorator or class
1596 decorator. When used as a class decorator `patch.dict` honours
1597 `patch.TEST_PREFIX` for choosing which methods to wrap.
1598 """
1599
1600 def __init__(self, in_dict, values=(), clear=False, **kwargs):
1601 if isinstance(in_dict, basestring):
1602 in_dict = _importer(in_dict)
1603 self.in_dict = in_dict
1604 # support any argument supported by dict(...) constructor
1605 self.values = dict(values)
1606 self.values.update(kwargs)
1607 self.clear = clear
1608 self._original = None
1609
1610
1611 def __call__(self, f):
1612 if isinstance(f, ClassTypes):
1613 return self.decorate_class(f)
1614 @wraps(f)
1615 def _inner(*args, **kw):
1616 self._patch_dict()
1617 try:
1618 return f(*args, **kw)
1619 finally:
1620 self._unpatch_dict()
1621
1622 return _inner
1623
1624
1625 def decorate_class(self, klass):
1626 for attr in dir(klass):
1627 attr_value = getattr(klass, attr)
1628 if (attr.startswith(patch.TEST_PREFIX) and
1629 hasattr(attr_value, "__call__")):
1630 decorator = _patch_dict(self.in_dict, self.values, self.clear)
1631 decorated = decorator(attr_value)
1632 setattr(klass, attr, decorated)
1633 return klass
1634
1635
1636 def __enter__(self):
1637 """Patch the dict."""
1638 self._patch_dict()
1639
1640
1641 def _patch_dict(self):
1642 values = self.values
1643 in_dict = self.in_dict
1644 clear = self.clear
1645
1646 try:
1647 original = in_dict.copy()
1648 except AttributeError:
1649 # dict like object with no copy method
1650 # must support iteration over keys
1651 original = {}
1652 for key in in_dict:
1653 original[key] = in_dict[key]
1654 self._original = original
1655
1656 if clear:
1657 _clear_dict(in_dict)
1658
1659 try:
1660 in_dict.update(values)
1661 except AttributeError:
1662 # dict like object with no update method
1663 for key in values:
1664 in_dict[key] = values[key]
1665
1666
1667 def _unpatch_dict(self):
1668 in_dict = self.in_dict
1669 original = self._original
1670
1671 _clear_dict(in_dict)
1672
1673 try:
1674 in_dict.update(original)
1675 except AttributeError:
1676 for key in original:
1677 in_dict[key] = original[key]
1678
1679
1680 def __exit__(self, *args):
1681 """Unpatch the dict."""
1682 self._unpatch_dict()
1683 return False
1684
1685 start = __enter__
1686 stop = __exit__
1687
1688
1689def _clear_dict(in_dict):
1690 try:
1691 in_dict.clear()
1692 except AttributeError:
1693 keys = list(in_dict)
1694 for key in keys:
1695 del in_dict[key]
1696
1697
1698def _patch_stopall():
1699 """Stop all active patches."""
1700 for patch in list(_patch._active_patches):
1701 patch.stop()
1702
1703
1704patch.object = _patch_object
1705patch.dict = _patch_dict
1706patch.multiple = _patch_multiple
1707patch.stopall = _patch_stopall
1708patch.TEST_PREFIX = 'test'
1709
1710magic_methods = (
1711 "lt le gt ge eq ne "
1712 "getitem setitem delitem "
1713 "len contains iter "
1714 "hash str sizeof "
1715 "enter exit "
1716 "divmod neg pos abs invert "
1717 "complex int float index "
1718 "trunc floor ceil "
1719)
1720
1721numerics = "add sub mul div floordiv mod lshift rshift and xor or pow "
1722inplace = ' '.join('i%s' % n for n in numerics.split())
1723right = ' '.join('r%s' % n for n in numerics.split())
1724extra = ''
1725if inPy3k:
1726 extra = 'bool next '
1727else:
1728 extra = 'unicode long nonzero oct hex truediv rtruediv '
1729
1730# not including __prepare__, __instancecheck__, __subclasscheck__
1731# (as they are metaclass methods)
1732# __del__ is not supported at all as it causes problems if it exists
1733
1734_non_defaults = set('__%s__' % method for method in [
1735 'cmp', 'getslice', 'setslice', 'coerce', 'subclasses',
1736 'format', 'get', 'set', 'delete', 'reversed',
1737 'missing', 'reduce', 'reduce_ex', 'getinitargs',
1738 'getnewargs', 'getstate', 'setstate', 'getformat',
1739 'setformat', 'repr', 'dir'
1740])
1741
1742
1743def _get_method(name, func):
1744 "Turns a callable object (like a mock) into a real function"
1745 def method(self, *args, **kw):
1746 return func(self, *args, **kw)
1747 method.__name__ = name
1748 return method
1749
1750
1751_magics = set(
1752 '__%s__' % method for method in
1753 ' '.join([magic_methods, numerics, inplace, right, extra]).split()
1754)
1755
1756_all_magics = _magics | _non_defaults
1757
1758_unsupported_magics = set([
1759 '__getattr__', '__setattr__',
1760 '__init__', '__new__', '__prepare__'
1761 '__instancecheck__', '__subclasscheck__',
1762 '__del__'
1763])
1764
1765_calculate_return_value = {
1766 '__hash__': lambda self: object.__hash__(self),
1767 '__str__': lambda self: object.__str__(self),
1768 '__sizeof__': lambda self: object.__sizeof__(self),
1769 '__unicode__': lambda self: unicode(object.__str__(self)),
1770}
1771
1772_return_values = {
1773 '__lt__': NotImplemented,
1774 '__gt__': NotImplemented,
1775 '__le__': NotImplemented,
1776 '__ge__': NotImplemented,
1777 '__int__': 1,
1778 '__contains__': False,
1779 '__len__': 0,
1780 '__exit__': False,
1781 '__complex__': 1j,
1782 '__float__': 1.0,
1783 '__bool__': True,
1784 '__nonzero__': True,
1785 '__oct__': '1',
1786 '__hex__': '0x1',
1787 '__long__': long(1),
1788 '__index__': 1,
1789}
1790
1791
1792def _get_eq(self):
1793 def __eq__(other):
1794 ret_val = self.__eq__._mock_return_value
1795 if ret_val is not DEFAULT:
1796 return ret_val
1797 return self is other
1798 return __eq__
1799
1800def _get_ne(self):
1801 def __ne__(other):
1802 if self.__ne__._mock_return_value is not DEFAULT:
1803 return DEFAULT
1804 return self is not other
1805 return __ne__
1806
1807def _get_iter(self):
1808 def __iter__():
1809 ret_val = self.__iter__._mock_return_value
1810 if ret_val is DEFAULT:
1811 return iter([])
1812 # if ret_val was already an iterator, then calling iter on it should
1813 # return the iterator unchanged
1814 return iter(ret_val)
1815 return __iter__
1816
1817_side_effect_methods = {
1818 '__eq__': _get_eq,
1819 '__ne__': _get_ne,
1820 '__iter__': _get_iter,
1821}
1822
1823
1824
1825def _set_return_value(mock, method, name):
1826 fixed = _return_values.get(name, DEFAULT)
1827 if fixed is not DEFAULT:
1828 method.return_value = fixed
1829 return
1830
1831 return_calulator = _calculate_return_value.get(name)
1832 if return_calulator is not None:
1833 try:
1834 return_value = return_calulator(mock)
1835 except AttributeError:
1836 # XXXX why do we return AttributeError here?
1837 # set it as a side_effect instead?
1838 return_value = AttributeError(name)
1839 method.return_value = return_value
1840 return
1841
1842 side_effector = _side_effect_methods.get(name)
1843 if side_effector is not None:
1844 method.side_effect = side_effector(mock)
1845
1846
1847
1848class MagicMixin(object):
1849 def __init__(self, *args, **kw):
1850 _super(MagicMixin, self).__init__(*args, **kw)
1851 self._mock_set_magics()
1852
1853
1854 def _mock_set_magics(self):
1855 these_magics = _magics
1856
1857 if self._mock_methods is not None:
1858 these_magics = _magics.intersection(self._mock_methods)
1859
1860 remove_magics = set()
1861 remove_magics = _magics - these_magics
1862
1863 for entry in remove_magics:
1864 if entry in type(self).__dict__:
1865 # remove unneeded magic methods
1866 delattr(self, entry)
1867
1868 # don't overwrite existing attributes if called a second time
1869 these_magics = these_magics - set(type(self).__dict__)
1870
1871 _type = type(self)
1872 for entry in these_magics:
1873 setattr(_type, entry, MagicProxy(entry, self))
1874
1875
1876
1877class NonCallableMagicMock(MagicMixin, NonCallableMock):
1878 """A version of `MagicMock` that isn't callable."""
1879 def mock_add_spec(self, spec, spec_set=False):
1880 """Add a spec to a mock. `spec` can either be an object or a
1881 list of strings. Only attributes on the `spec` can be fetched as
1882 attributes from the mock.
1883
1884 If `spec_set` is True then only attributes on the spec can be set."""
1885 self._mock_add_spec(spec, spec_set)
1886 self._mock_set_magics()
1887
1888
1889
1890class MagicMock(MagicMixin, Mock):
1891 """
1892 MagicMock is a subclass of Mock with default implementations
1893 of most of the magic methods. You can use MagicMock without having to
1894 configure the magic methods yourself.
1895
1896 If you use the `spec` or `spec_set` arguments then *only* magic
1897 methods that exist in the spec will be created.
1898
1899 Attributes and the return value of a `MagicMock` will also be `MagicMocks`.
1900 """
1901 def mock_add_spec(self, spec, spec_set=False):
1902 """Add a spec to a mock. `spec` can either be an object or a
1903 list of strings. Only attributes on the `spec` can be fetched as
1904 attributes from the mock.
1905
1906 If `spec_set` is True then only attributes on the spec can be set."""
1907 self._mock_add_spec(spec, spec_set)
1908 self._mock_set_magics()
1909
1910
1911
1912class MagicProxy(object):
1913 def __init__(self, name, parent):
1914 self.name = name
1915 self.parent = parent
1916
1917 def __call__(self, *args, **kwargs):
1918 m = self.create_mock()
1919 return m(*args, **kwargs)
1920
1921 def create_mock(self):
1922 entry = self.name
1923 parent = self.parent
1924 m = parent._get_child_mock(name=entry, _new_name=entry,
1925 _new_parent=parent)
1926 setattr(parent, entry, m)
1927 _set_return_value(parent, m, entry)
1928 return m
1929
1930 def __get__(self, obj, _type=None):
1931 return self.create_mock()
1932
1933
1934
1935class _ANY(object):
1936 "A helper object that compares equal to everything."
1937
1938 def __eq__(self, other):
1939 return True
1940
1941 def __ne__(self, other):
1942 return False
1943
1944 def __repr__(self):
1945 return '<ANY>'
1946
1947ANY = _ANY()
1948
1949
1950
1951def _format_call_signature(name, args, kwargs):
1952 message = '%s(%%s)' % name
1953 formatted_args = ''
1954 args_string = ', '.join([repr(arg) for arg in args])
1955 kwargs_string = ', '.join([
1956 '%s=%r' % (key, value) for key, value in kwargs.items()
1957 ])
1958 if args_string:
1959 formatted_args = args_string
1960 if kwargs_string:
1961 if formatted_args:
1962 formatted_args += ', '
1963 formatted_args += kwargs_string
1964
1965 return message % formatted_args
1966
1967
1968
1969class _Call(tuple):
1970 """
1971 A tuple for holding the results of a call to a mock, either in the form
1972 `(args, kwargs)` or `(name, args, kwargs)`.
1973
1974 If args or kwargs are empty then a call tuple will compare equal to
1975 a tuple without those values. This makes comparisons less verbose::
1976
1977 _Call(('name', (), {})) == ('name',)
1978 _Call(('name', (1,), {})) == ('name', (1,))
1979 _Call(((), {'a': 'b'})) == ({'a': 'b'},)
1980
1981 The `_Call` object provides a useful shortcut for comparing with call::
1982
1983 _Call(((1, 2), {'a': 3})) == call(1, 2, a=3)
1984 _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3)
1985
1986 If the _Call has no name then it will match any name.
1987 """
1988 def __new__(cls, value=(), name=None, parent=None, two=False,
1989 from_kall=True):
1990 name = ''
1991 args = ()
1992 kwargs = {}
1993 _len = len(value)
1994 if _len == 3:
1995 name, args, kwargs = value
1996 elif _len == 2:
1997 first, second = value
1998 if isinstance(first, basestring):
1999 name = first
2000 if isinstance(second, tuple):
2001 args = second
2002 else:
2003 kwargs = second
2004 else:
2005 args, kwargs = first, second
2006 elif _len == 1:
2007 value, = value
2008 if isinstance(value, basestring):
2009 name = value
2010 elif isinstance(value, tuple):
2011 args = value
2012 else:
2013 kwargs = value
2014
2015 if two:
2016 return tuple.__new__(cls, (args, kwargs))
2017
2018 return tuple.__new__(cls, (name, args, kwargs))
2019
2020
2021 def __init__(self, value=(), name=None, parent=None, two=False,
2022 from_kall=True):
2023 self.name = name
2024 self.parent = parent
2025 self.from_kall = from_kall
2026
2027
2028 def __eq__(self, other):
2029 if other is ANY:
2030 return True
2031 try:
2032 len_other = len(other)
2033 except TypeError:
2034 return False
2035
2036 self_name = ''
2037 if len(self) == 2:
2038 self_args, self_kwargs = self
2039 else:
2040 self_name, self_args, self_kwargs = self
2041
2042 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, basestring):
2053 other_name = value
2054 other_args, other_kwargs = (), {}
2055 else:
2056 other_args = ()
2057 other_kwargs = value
2058 else:
2059 # len 2
2060 # could be (name, args) or (name, kwargs) or (args, kwargs)
2061 first, second = other
2062 if isinstance(first, basestring):
2063 other_name = first
2064 if isinstance(second, tuple):
2065 other_args, other_kwargs = second, {}
2066 else:
2067 other_args, other_kwargs = (), second
2068 else:
2069 other_args, other_kwargs = first, second
2070
2071 if self_name and other_name != self_name:
2072 return False
2073
2074 # this order is important for ANY to work!
2075 return (other_args, other_kwargs) == (self_args, self_kwargs)
2076
2077
2078 def __ne__(self, other):
2079 return not self.__eq__(other)
2080
2081
2082 def __call__(self, *args, **kwargs):
2083 if self.name is None:
2084 return _Call(('', args, kwargs), name='()')
2085
2086 name = self.name + '()'
2087 return _Call((self.name, args, kwargs), name=name, parent=self)
2088
2089
2090 def __getattr__(self, attr):
2091 if self.name is None:
2092 return _Call(name=attr, from_kall=False)
2093 name = '%s.%s' % (self.name, attr)
2094 return _Call(name=name, parent=self, from_kall=False)
2095
2096
2097 def __repr__(self):
2098 if not self.from_kall:
2099 name = self.name or 'call'
2100 if name.startswith('()'):
2101 name = 'call%s' % name
2102 return name
2103
2104 if len(self) == 2:
2105 name = 'call'
2106 args, kwargs = self
2107 else:
2108 name, args, kwargs = self
2109 if not name:
2110 name = 'call'
2111 elif not name.startswith('()'):
2112 name = 'call.%s' % name
2113 else:
2114 name = 'call%s' % name
2115 return _format_call_signature(name, args, kwargs)
2116
2117
2118 def call_list(self):
2119 """For a call object that represents multiple calls, `call_list`
2120 returns a list of all the intermediate calls as well as the
2121 final call."""
2122 vals = []
2123 thing = self
2124 while thing is not None:
2125 if thing.from_kall:
2126 vals.append(thing)
2127 thing = thing.parent
2128 return _CallList(reversed(vals))
2129
2130
2131call = _Call(from_kall=False)
2132
2133
2134
2135def create_autospec(spec, spec_set=False, instance=False, _parent=None,
2136 _name=None, **kwargs):
2137 """Create a mock object using another object as a spec. Attributes on the
2138 mock will use the corresponding attribute on the `spec` object as their
2139 spec.
2140
2141 Functions or methods being mocked will have their arguments checked
2142 to check that they are called with the correct signature.
2143
2144 If `spec_set` is True then attempting to set attributes that don't exist
2145 on the spec object will raise an `AttributeError`.
2146
2147 If a class is used as a spec then the return value of the mock (the
2148 instance of the class) will have the same spec. You can use a class as the
2149 spec for an instance object by passing `instance=True`. The returned mock
2150 will only be callable if instances of the mock are callable.
2151
2152 `create_autospec` also takes arbitrary keyword arguments that are passed to
2153 the constructor of the created mock."""
2154 if _is_list(spec):
2155 # can't pass a list instance to the mock constructor as it will be
2156 # interpreted as a list of strings
2157 spec = type(spec)
2158
2159 is_type = isinstance(spec, ClassTypes)
2160
2161 _kwargs = {'spec': spec}
2162 if spec_set:
2163 _kwargs = {'spec_set': spec}
2164 elif spec is None:
2165 # None we mock with a normal mock without a spec
2166 _kwargs = {}
2167
2168 _kwargs.update(kwargs)
2169
2170 Klass = MagicMock
2171 if type(spec) in DescriptorTypes:
2172 # descriptors don't have a spec
2173 # because we don't know what type they return
2174 _kwargs = {}
2175 elif not _callable(spec):
2176 Klass = NonCallableMagicMock
2177 elif is_type and instance and not _instance_callable(spec):
2178 Klass = NonCallableMagicMock
2179
2180 _new_name = _name
2181 if _parent is None:
2182 # for a top level object no _new_name should be set
2183 _new_name = ''
2184
2185 mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name,
2186 name=_name, **_kwargs)
2187
2188 if isinstance(spec, FunctionTypes):
2189 # should only happen at the top level because we don't
2190 # recurse for functions
2191 mock = _set_signature(mock, spec)
2192 else:
2193 _check_signature(spec, mock, is_type, instance)
2194
2195 if _parent is not None and not instance:
2196 _parent._mock_children[_name] = mock
2197
2198 if is_type and not instance and 'return_value' not in kwargs:
2199 mock.return_value = create_autospec(spec, spec_set, instance=True,
2200 _name='()', _parent=mock)
2201
2202 for entry in dir(spec):
2203 if _is_magic(entry):
2204 # MagicMock already does the useful magic methods for us
2205 continue
2206
2207 if isinstance(spec, FunctionTypes) and entry in FunctionAttributes:
2208 # allow a mock to actually be a function
2209 continue
2210
2211 # XXXX do we need a better way of getting attributes without
2212 # triggering code execution (?) Probably not - we need the actual
2213 # object to mock it so we would rather trigger a property than mock
2214 # the property descriptor. Likewise we want to mock out dynamically
2215 # provided attributes.
2216 # XXXX what about attributes that raise exceptions other than
2217 # AttributeError on being fetched?
2218 # we could be resilient against it, or catch and propagate the
2219 # exception when the attribute is fetched from the mock
2220 try:
2221 original = getattr(spec, entry)
2222 except AttributeError:
2223 continue
2224
2225 kwargs = {'spec': original}
2226 if spec_set:
2227 kwargs = {'spec_set': original}
2228
2229 if not isinstance(original, FunctionTypes):
2230 new = _SpecState(original, spec_set, mock, entry, instance)
2231 mock._mock_children[entry] = new
2232 else:
2233 parent = mock
2234 if isinstance(spec, FunctionTypes):
2235 parent = mock.mock
2236
2237 new = MagicMock(parent=parent, name=entry, _new_name=entry,
2238 _new_parent=parent, **kwargs)
2239 mock._mock_children[entry] = new
2240 skipfirst = _must_skip(spec, entry, is_type)
2241 _check_signature(original, new, skipfirst=skipfirst)
2242
2243 # so functions created with _set_signature become instance attributes,
2244 # *plus* their underlying mock exists in _mock_children of the parent
2245 # mock. Adding to _mock_children may be unnecessary where we are also
2246 # setting as an instance attribute?
2247 if isinstance(new, FunctionTypes):
2248 setattr(mock, entry, new)
2249
2250 return mock
2251
2252
2253def _must_skip(spec, entry, is_type):
2254 if not isinstance(spec, ClassTypes):
2255 if entry in getattr(spec, '__dict__', {}):
2256 # instance attribute - shouldn't skip
2257 return False
2258 spec = spec.__class__
2259 if not hasattr(spec, '__mro__'):
2260 # old style class: can't have descriptors anyway
2261 return is_type
2262
2263 for klass in spec.__mro__:
2264 result = klass.__dict__.get(entry, DEFAULT)
2265 if result is DEFAULT:
2266 continue
2267 if isinstance(result, (staticmethod, classmethod)):
2268 return False
2269 return is_type
2270
2271 # shouldn't get here unless function is a dynamically provided attribute
2272 # XXXX untested behaviour
2273 return is_type
2274
2275
2276def _get_class(obj):
2277 try:
2278 return obj.__class__
2279 except AttributeError:
2280 # in Python 2, _sre.SRE_Pattern objects have no __class__
2281 return type(obj)
2282
2283
2284class _SpecState(object):
2285
2286 def __init__(self, spec, spec_set=False, parent=None,
2287 name=None, ids=None, instance=False):
2288 self.spec = spec
2289 self.ids = ids
2290 self.spec_set = spec_set
2291 self.parent = parent
2292 self.instance = instance
2293 self.name = name
2294
2295
2296FunctionTypes = (
2297 # python function
2298 type(create_autospec),
2299 # instance method
2300 type(ANY.__eq__),
2301 # unbound method
2302 type(_ANY.__eq__),
2303)
2304
2305FunctionAttributes = set([
2306 'func_closure',
2307 'func_code',
2308 'func_defaults',
2309 'func_dict',
2310 'func_doc',
2311 'func_globals',
2312 'func_name',
2313])
2314
2315
2316file_spec = None
2317
2318
2319def mock_open(mock=None, read_data=''):
2320 """
2321 A helper function to create a mock to replace the use of `open`. It works
2322 for `open` called directly or used as a context manager.
2323
2324 The `mock` argument is the mock object to configure. If `None` (the
2325 default) then a `MagicMock` will be created for you, with the API limited
2326 to methods or attributes available on standard file handles.
2327
2328 `read_data` is a string for the `read` method of the file handle to return.
2329 This is an empty string by default.
2330 """
2331 global file_spec
2332 if file_spec is None:
2333 # set on first use
2334 if inPy3k:
2335 import _io
2336 file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO))))
2337 else:
2338 file_spec = file
2339
2340 if mock is None:
2341 mock = MagicMock(name='open', spec=open)
2342
2343 handle = MagicMock(spec=file_spec)
2344 handle.write.return_value = None
2345 handle.__enter__.return_value = handle
2346 handle.read.return_value = read_data
2347
2348 mock.return_value = handle
2349 return mock
2350
2351
2352class PropertyMock(Mock):
2353 """
2354 A mock intended to be used as a property, or other descriptor, on a class.
2355 `PropertyMock` provides `__get__` and `__set__` methods so you can specify
2356 a return value when it is fetched.
2357
2358 Fetching a `PropertyMock` instance from an object calls the mock, with
2359 no args. Setting it calls the mock with the value being set.
2360 """
2361 def _get_child_mock(self, **kwargs):
2362 return MagicMock(**kwargs)
2363
2364 def __get__(self, obj, obj_type):
2365 return self()
2366 def __set__(self, obj, val):
2367 self(val)
02368
=== modified file 'deployer/tests/test_charm.py'
--- deployer/tests/test_charm.py 2013-07-22 15:29:31 +0000
+++ deployer/tests/test_charm.py 2013-11-22 20:44:08 +0000
@@ -1,6 +1,7 @@
1import os1import os
2import logging2import logging
3import subprocess3import subprocess
4import unittest
45
5from deployer.charm import Charm6from deployer.charm import Charm
6from deployer.utils import ErrorExit7from deployer.utils import ErrorExit
@@ -25,6 +26,8 @@
25 self.output = self.capture_logging(26 self.output = self.capture_logging(
26 "deployer.charm", level=logging.DEBUG)27 "deployer.charm", level=logging.DEBUG)
2728
29 @unittest.skipIf("DEB_BUILD_ARCH" in os.environ,
30 "Requires configured bzr launchpad id and network access")
28 def test_vcs_charm(self):31 def test_vcs_charm(self):
29 params = dict(self.charm_data)32 params = dict(self.charm_data)
30 charm = Charm.from_service("scratch", self.series_path, params)33 charm = Charm.from_service("scratch", self.series_path, params)
@@ -46,6 +49,8 @@
46 def test_store_charm(self):49 def test_store_charm(self):
47 pass50 pass
4851
52 @unittest.skipIf("DEB_BUILD_ARCH" in os.environ,
53 "Requires configured bzr launchpad id and network access")
49 def test_charm_error(self):54 def test_charm_error(self):
50 params = dict(self.charm_data)55 params = dict(self.charm_data)
51 params['branch'] = "lp:charms/precise/zebramoon"56 params['branch'] = "lp:charms/precise/zebramoon"
5257
=== modified file 'deployer/tests/test_deployment.py'
--- deployer/tests/test_deployment.py 2013-10-31 19:19:36 +0000
+++ deployer/tests/test_deployment.py 2013-11-22 20:44:08 +0000
@@ -1,6 +1,7 @@
1import base641import base64
2import StringIO2import StringIO
3import os3import os
4import unittest
45
56
6from deployer.config import ConfigStack7from deployer.config import ConfigStack
@@ -21,6 +22,8 @@
21 [os.path.join(22 [os.path.join(
22 self.test_data_dir, file_name)]).get(stack_name)23 self.test_data_dir, file_name)]).get(stack_name)
2324
25 @unittest.skipIf("DEB_BUILD_ARCH" in os.environ,
26 "Requires configured bzr launchpad id and network access")
24 def test_deployer(self):27 def test_deployer(self):
25 d = ConfigStack(28 d = ConfigStack(
26 [os.path.join(29 [os.path.join(
2730
=== modified file 'deployer/tests/test_guiserver.py'
--- deployer/tests/test_guiserver.py 2013-11-21 03:19:56 +0000
+++ deployer/tests/test_guiserver.py 2013-11-22 20:44:08 +0000
@@ -83,6 +83,8 @@
83 mock_env_instance.close.assert_called_once_with()83 mock_env_instance.close.assert_called_once_with()
8484
8585
86@unittest.skipIf("DEB_BUILD_ARCH" in os.environ,
87 "Requires configured bzr launchpad id and network access")
86@mock.patch('deployer.guiserver.GUIEnvironment')88@mock.patch('deployer.guiserver.GUIEnvironment')
87class TestValidate(DeployerFunctionsTestMixin, unittest.TestCase):89class TestValidate(DeployerFunctionsTestMixin, unittest.TestCase):
8890
@@ -99,6 +101,8 @@
99 guiserver.validate(self.apiurl, self.password, self.bundle)101 guiserver.validate(self.apiurl, self.password, self.bundle)
100102
101103
104@unittest.skipIf("DEB_BUILD_ARCH" in os.environ,
105 "Requires configured bzr launchpad id and network access")
102@mock.patch('deployer.guiserver.GUIEnvironment')106@mock.patch('deployer.guiserver.GUIEnvironment')
103class TestImportBundle(DeployerFunctionsTestMixin, unittest.TestCase):107class TestImportBundle(DeployerFunctionsTestMixin, unittest.TestCase):
104108
105109
=== modified file 'deployer/tests/test_utils.py'
--- deployer/tests/test_utils.py 2013-11-12 04:54:58 +0000
+++ deployer/tests/test_utils.py 2013-11-22 20:44:08 +0000
@@ -53,7 +53,7 @@
53 check_output.side_effect = [53 check_output.side_effect = [
54 _e, _e, 'good', _e]54 _e, _e, 'good', _e]
55 output = _check_call(55 output = _check_call(
56 params=['magybe_fail'], log=MagicMock(), max_retry=3)56 params=['maybe_fail'], log=MagicMock(), max_retry=3)
57 self.assertEquals(output, 'good')57 self.assertEquals(output, 'good')
58 # 1 failure + 3 retries58 # 1 failure + 3 retries
59 self.assertEquals(len(check_output.call_args_list), 3)59 self.assertEquals(len(check_output.call_args_list), 3)
6060
=== modified file 'setup.py'
--- setup.py 2013-11-21 14:58:44 +0000
+++ setup.py 2013-11-22 20:44:08 +0000
@@ -13,7 +13,6 @@
13 author_email="kapil.foss@gmail.com",13 author_email="kapil.foss@gmail.com",
14 url="http://launchpad.net/juju-deployer",14 url="http://launchpad.net/juju-deployer",
15 install_requires=["jujuclient>=0.15", "PyYAML==3.10"],15 install_requires=["jujuclient>=0.15", "PyYAML==3.10"],
16 tests_require=['mock==1.0.1'],
17 packages=find_packages(),16 packages=find_packages(),
18 classifiers=[17 classifiers=[
19 "Development Status :: 2 - Pre-Alpha",18 "Development Status :: 2 - Pre-Alpha",

Subscribers

People subscribed via source and target branches