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