1*cda5da8dSAndroid Build Coastguard Worker# mock.py 2*cda5da8dSAndroid Build Coastguard Worker# Test tools for mocking and patching. 3*cda5da8dSAndroid Build Coastguard Worker# Maintained by Michael Foord 4*cda5da8dSAndroid Build Coastguard Worker# Backport for other versions of Python available from 5*cda5da8dSAndroid Build Coastguard Worker# https://pypi.org/project/mock 6*cda5da8dSAndroid Build Coastguard Worker 7*cda5da8dSAndroid Build Coastguard Worker__all__ = ( 8*cda5da8dSAndroid Build Coastguard Worker 'Mock', 9*cda5da8dSAndroid Build Coastguard Worker 'MagicMock', 10*cda5da8dSAndroid Build Coastguard Worker 'patch', 11*cda5da8dSAndroid Build Coastguard Worker 'sentinel', 12*cda5da8dSAndroid Build Coastguard Worker 'DEFAULT', 13*cda5da8dSAndroid Build Coastguard Worker 'ANY', 14*cda5da8dSAndroid Build Coastguard Worker 'call', 15*cda5da8dSAndroid Build Coastguard Worker 'create_autospec', 16*cda5da8dSAndroid Build Coastguard Worker 'AsyncMock', 17*cda5da8dSAndroid Build Coastguard Worker 'FILTER_DIR', 18*cda5da8dSAndroid Build Coastguard Worker 'NonCallableMock', 19*cda5da8dSAndroid Build Coastguard Worker 'NonCallableMagicMock', 20*cda5da8dSAndroid Build Coastguard Worker 'mock_open', 21*cda5da8dSAndroid Build Coastguard Worker 'PropertyMock', 22*cda5da8dSAndroid Build Coastguard Worker 'seal', 23*cda5da8dSAndroid Build Coastguard Worker) 24*cda5da8dSAndroid Build Coastguard Worker 25*cda5da8dSAndroid Build Coastguard Worker 26*cda5da8dSAndroid Build Coastguard Workerimport asyncio 27*cda5da8dSAndroid Build Coastguard Workerimport contextlib 28*cda5da8dSAndroid Build Coastguard Workerimport io 29*cda5da8dSAndroid Build Coastguard Workerimport inspect 30*cda5da8dSAndroid Build Coastguard Workerimport pprint 31*cda5da8dSAndroid Build Coastguard Workerimport sys 32*cda5da8dSAndroid Build Coastguard Workerimport builtins 33*cda5da8dSAndroid Build Coastguard Workerimport pkgutil 34*cda5da8dSAndroid Build Coastguard Workerfrom asyncio import iscoroutinefunction 35*cda5da8dSAndroid Build Coastguard Workerfrom types import CodeType, ModuleType, MethodType 36*cda5da8dSAndroid Build Coastguard Workerfrom unittest.util import safe_repr 37*cda5da8dSAndroid Build Coastguard Workerfrom functools import wraps, partial 38*cda5da8dSAndroid Build Coastguard Workerfrom threading import RLock 39*cda5da8dSAndroid Build Coastguard Worker 40*cda5da8dSAndroid Build Coastguard Worker 41*cda5da8dSAndroid Build Coastguard Workerclass InvalidSpecError(Exception): 42*cda5da8dSAndroid Build Coastguard Worker """Indicates that an invalid value was used as a mock spec.""" 43*cda5da8dSAndroid Build Coastguard Worker 44*cda5da8dSAndroid Build Coastguard Worker 45*cda5da8dSAndroid Build Coastguard Worker_builtins = {name for name in dir(builtins) if not name.startswith('_')} 46*cda5da8dSAndroid Build Coastguard Worker 47*cda5da8dSAndroid Build Coastguard WorkerFILTER_DIR = True 48*cda5da8dSAndroid Build Coastguard Worker 49*cda5da8dSAndroid Build Coastguard Worker# Workaround for issue #12370 50*cda5da8dSAndroid Build Coastguard Worker# Without this, the __class__ properties wouldn't be set correctly 51*cda5da8dSAndroid Build Coastguard Worker_safe_super = super 52*cda5da8dSAndroid Build Coastguard Worker 53*cda5da8dSAndroid Build Coastguard Workerdef _is_async_obj(obj): 54*cda5da8dSAndroid Build Coastguard Worker if _is_instance_mock(obj) and not isinstance(obj, AsyncMock): 55*cda5da8dSAndroid Build Coastguard Worker return False 56*cda5da8dSAndroid Build Coastguard Worker if hasattr(obj, '__func__'): 57*cda5da8dSAndroid Build Coastguard Worker obj = getattr(obj, '__func__') 58*cda5da8dSAndroid Build Coastguard Worker return iscoroutinefunction(obj) or inspect.isawaitable(obj) 59*cda5da8dSAndroid Build Coastguard Worker 60*cda5da8dSAndroid Build Coastguard Worker 61*cda5da8dSAndroid Build Coastguard Workerdef _is_async_func(func): 62*cda5da8dSAndroid Build Coastguard Worker if getattr(func, '__code__', None): 63*cda5da8dSAndroid Build Coastguard Worker return iscoroutinefunction(func) 64*cda5da8dSAndroid Build Coastguard Worker else: 65*cda5da8dSAndroid Build Coastguard Worker return False 66*cda5da8dSAndroid Build Coastguard Worker 67*cda5da8dSAndroid Build Coastguard Worker 68*cda5da8dSAndroid Build Coastguard Workerdef _is_instance_mock(obj): 69*cda5da8dSAndroid Build Coastguard Worker # can't use isinstance on Mock objects because they override __class__ 70*cda5da8dSAndroid Build Coastguard Worker # The base class for all mocks is NonCallableMock 71*cda5da8dSAndroid Build Coastguard Worker return issubclass(type(obj), NonCallableMock) 72*cda5da8dSAndroid Build Coastguard Worker 73*cda5da8dSAndroid Build Coastguard Worker 74*cda5da8dSAndroid Build Coastguard Workerdef _is_exception(obj): 75*cda5da8dSAndroid Build Coastguard Worker return ( 76*cda5da8dSAndroid Build Coastguard Worker isinstance(obj, BaseException) or 77*cda5da8dSAndroid Build Coastguard Worker isinstance(obj, type) and issubclass(obj, BaseException) 78*cda5da8dSAndroid Build Coastguard Worker ) 79*cda5da8dSAndroid Build Coastguard Worker 80*cda5da8dSAndroid Build Coastguard Worker 81*cda5da8dSAndroid Build Coastguard Workerdef _extract_mock(obj): 82*cda5da8dSAndroid Build Coastguard Worker # Autospecced functions will return a FunctionType with "mock" attribute 83*cda5da8dSAndroid Build Coastguard Worker # which is the actual mock object that needs to be used. 84*cda5da8dSAndroid Build Coastguard Worker if isinstance(obj, FunctionTypes) and hasattr(obj, 'mock'): 85*cda5da8dSAndroid Build Coastguard Worker return obj.mock 86*cda5da8dSAndroid Build Coastguard Worker else: 87*cda5da8dSAndroid Build Coastguard Worker return obj 88*cda5da8dSAndroid Build Coastguard Worker 89*cda5da8dSAndroid Build Coastguard Worker 90*cda5da8dSAndroid Build Coastguard Workerdef _get_signature_object(func, as_instance, eat_self): 91*cda5da8dSAndroid Build Coastguard Worker """ 92*cda5da8dSAndroid Build Coastguard Worker Given an arbitrary, possibly callable object, try to create a suitable 93*cda5da8dSAndroid Build Coastguard Worker signature object. 94*cda5da8dSAndroid Build Coastguard Worker Return a (reduced func, signature) tuple, or None. 95*cda5da8dSAndroid Build Coastguard Worker """ 96*cda5da8dSAndroid Build Coastguard Worker if isinstance(func, type) and not as_instance: 97*cda5da8dSAndroid Build Coastguard Worker # If it's a type and should be modelled as a type, use __init__. 98*cda5da8dSAndroid Build Coastguard Worker func = func.__init__ 99*cda5da8dSAndroid Build Coastguard Worker # Skip the `self` argument in __init__ 100*cda5da8dSAndroid Build Coastguard Worker eat_self = True 101*cda5da8dSAndroid Build Coastguard Worker elif isinstance(func, (classmethod, staticmethod)): 102*cda5da8dSAndroid Build Coastguard Worker if isinstance(func, classmethod): 103*cda5da8dSAndroid Build Coastguard Worker # Skip the `cls` argument of a class method 104*cda5da8dSAndroid Build Coastguard Worker eat_self = True 105*cda5da8dSAndroid Build Coastguard Worker # Use the original decorated method to extract the correct function signature 106*cda5da8dSAndroid Build Coastguard Worker func = func.__func__ 107*cda5da8dSAndroid Build Coastguard Worker elif not isinstance(func, FunctionTypes): 108*cda5da8dSAndroid Build Coastguard Worker # If we really want to model an instance of the passed type, 109*cda5da8dSAndroid Build Coastguard Worker # __call__ should be looked up, not __init__. 110*cda5da8dSAndroid Build Coastguard Worker try: 111*cda5da8dSAndroid Build Coastguard Worker func = func.__call__ 112*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 113*cda5da8dSAndroid Build Coastguard Worker return None 114*cda5da8dSAndroid Build Coastguard Worker if eat_self: 115*cda5da8dSAndroid Build Coastguard Worker sig_func = partial(func, None) 116*cda5da8dSAndroid Build Coastguard Worker else: 117*cda5da8dSAndroid Build Coastguard Worker sig_func = func 118*cda5da8dSAndroid Build Coastguard Worker try: 119*cda5da8dSAndroid Build Coastguard Worker return func, inspect.signature(sig_func) 120*cda5da8dSAndroid Build Coastguard Worker except ValueError: 121*cda5da8dSAndroid Build Coastguard Worker # Certain callable types are not supported by inspect.signature() 122*cda5da8dSAndroid Build Coastguard Worker return None 123*cda5da8dSAndroid Build Coastguard Worker 124*cda5da8dSAndroid Build Coastguard Worker 125*cda5da8dSAndroid Build Coastguard Workerdef _check_signature(func, mock, skipfirst, instance=False): 126*cda5da8dSAndroid Build Coastguard Worker sig = _get_signature_object(func, instance, skipfirst) 127*cda5da8dSAndroid Build Coastguard Worker if sig is None: 128*cda5da8dSAndroid Build Coastguard Worker return 129*cda5da8dSAndroid Build Coastguard Worker func, sig = sig 130*cda5da8dSAndroid Build Coastguard Worker def checksig(self, /, *args, **kwargs): 131*cda5da8dSAndroid Build Coastguard Worker sig.bind(*args, **kwargs) 132*cda5da8dSAndroid Build Coastguard Worker _copy_func_details(func, checksig) 133*cda5da8dSAndroid Build Coastguard Worker type(mock)._mock_check_sig = checksig 134*cda5da8dSAndroid Build Coastguard Worker type(mock).__signature__ = sig 135*cda5da8dSAndroid Build Coastguard Worker 136*cda5da8dSAndroid Build Coastguard Worker 137*cda5da8dSAndroid Build Coastguard Workerdef _copy_func_details(func, funcopy): 138*cda5da8dSAndroid Build Coastguard Worker # we explicitly don't copy func.__dict__ into this copy as it would 139*cda5da8dSAndroid Build Coastguard Worker # expose original attributes that should be mocked 140*cda5da8dSAndroid Build Coastguard Worker for attribute in ( 141*cda5da8dSAndroid Build Coastguard Worker '__name__', '__doc__', '__text_signature__', 142*cda5da8dSAndroid Build Coastguard Worker '__module__', '__defaults__', '__kwdefaults__', 143*cda5da8dSAndroid Build Coastguard Worker ): 144*cda5da8dSAndroid Build Coastguard Worker try: 145*cda5da8dSAndroid Build Coastguard Worker setattr(funcopy, attribute, getattr(func, attribute)) 146*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 147*cda5da8dSAndroid Build Coastguard Worker pass 148*cda5da8dSAndroid Build Coastguard Worker 149*cda5da8dSAndroid Build Coastguard Worker 150*cda5da8dSAndroid Build Coastguard Workerdef _callable(obj): 151*cda5da8dSAndroid Build Coastguard Worker if isinstance(obj, type): 152*cda5da8dSAndroid Build Coastguard Worker return True 153*cda5da8dSAndroid Build Coastguard Worker if isinstance(obj, (staticmethod, classmethod, MethodType)): 154*cda5da8dSAndroid Build Coastguard Worker return _callable(obj.__func__) 155*cda5da8dSAndroid Build Coastguard Worker if getattr(obj, '__call__', None) is not None: 156*cda5da8dSAndroid Build Coastguard Worker return True 157*cda5da8dSAndroid Build Coastguard Worker return False 158*cda5da8dSAndroid Build Coastguard Worker 159*cda5da8dSAndroid Build Coastguard Worker 160*cda5da8dSAndroid Build Coastguard Workerdef _is_list(obj): 161*cda5da8dSAndroid Build Coastguard Worker # checks for list or tuples 162*cda5da8dSAndroid Build Coastguard Worker # XXXX badly named! 163*cda5da8dSAndroid Build Coastguard Worker return type(obj) in (list, tuple) 164*cda5da8dSAndroid Build Coastguard Worker 165*cda5da8dSAndroid Build Coastguard Worker 166*cda5da8dSAndroid Build Coastguard Workerdef _instance_callable(obj): 167*cda5da8dSAndroid Build Coastguard Worker """Given an object, return True if the object is callable. 168*cda5da8dSAndroid Build Coastguard Worker For classes, return True if instances would be callable.""" 169*cda5da8dSAndroid Build Coastguard Worker if not isinstance(obj, type): 170*cda5da8dSAndroid Build Coastguard Worker # already an instance 171*cda5da8dSAndroid Build Coastguard Worker return getattr(obj, '__call__', None) is not None 172*cda5da8dSAndroid Build Coastguard Worker 173*cda5da8dSAndroid Build Coastguard Worker # *could* be broken by a class overriding __mro__ or __dict__ via 174*cda5da8dSAndroid Build Coastguard Worker # a metaclass 175*cda5da8dSAndroid Build Coastguard Worker for base in (obj,) + obj.__mro__: 176*cda5da8dSAndroid Build Coastguard Worker if base.__dict__.get('__call__') is not None: 177*cda5da8dSAndroid Build Coastguard Worker return True 178*cda5da8dSAndroid Build Coastguard Worker return False 179*cda5da8dSAndroid Build Coastguard Worker 180*cda5da8dSAndroid Build Coastguard Worker 181*cda5da8dSAndroid Build Coastguard Workerdef _set_signature(mock, original, instance=False): 182*cda5da8dSAndroid Build Coastguard Worker # creates a function with signature (*args, **kwargs) that delegates to a 183*cda5da8dSAndroid Build Coastguard Worker # mock. It still does signature checking by calling a lambda with the same 184*cda5da8dSAndroid Build Coastguard Worker # signature as the original. 185*cda5da8dSAndroid Build Coastguard Worker 186*cda5da8dSAndroid Build Coastguard Worker skipfirst = isinstance(original, type) 187*cda5da8dSAndroid Build Coastguard Worker result = _get_signature_object(original, instance, skipfirst) 188*cda5da8dSAndroid Build Coastguard Worker if result is None: 189*cda5da8dSAndroid Build Coastguard Worker return mock 190*cda5da8dSAndroid Build Coastguard Worker func, sig = result 191*cda5da8dSAndroid Build Coastguard Worker def checksig(*args, **kwargs): 192*cda5da8dSAndroid Build Coastguard Worker sig.bind(*args, **kwargs) 193*cda5da8dSAndroid Build Coastguard Worker _copy_func_details(func, checksig) 194*cda5da8dSAndroid Build Coastguard Worker 195*cda5da8dSAndroid Build Coastguard Worker name = original.__name__ 196*cda5da8dSAndroid Build Coastguard Worker if not name.isidentifier(): 197*cda5da8dSAndroid Build Coastguard Worker name = 'funcopy' 198*cda5da8dSAndroid Build Coastguard Worker context = {'_checksig_': checksig, 'mock': mock} 199*cda5da8dSAndroid Build Coastguard Worker src = """def %s(*args, **kwargs): 200*cda5da8dSAndroid Build Coastguard Worker _checksig_(*args, **kwargs) 201*cda5da8dSAndroid Build Coastguard Worker return mock(*args, **kwargs)""" % name 202*cda5da8dSAndroid Build Coastguard Worker exec (src, context) 203*cda5da8dSAndroid Build Coastguard Worker funcopy = context[name] 204*cda5da8dSAndroid Build Coastguard Worker _setup_func(funcopy, mock, sig) 205*cda5da8dSAndroid Build Coastguard Worker return funcopy 206*cda5da8dSAndroid Build Coastguard Worker 207*cda5da8dSAndroid Build Coastguard Worker 208*cda5da8dSAndroid Build Coastguard Workerdef _setup_func(funcopy, mock, sig): 209*cda5da8dSAndroid Build Coastguard Worker funcopy.mock = mock 210*cda5da8dSAndroid Build Coastguard Worker 211*cda5da8dSAndroid Build Coastguard Worker def assert_called_with(*args, **kwargs): 212*cda5da8dSAndroid Build Coastguard Worker return mock.assert_called_with(*args, **kwargs) 213*cda5da8dSAndroid Build Coastguard Worker def assert_called(*args, **kwargs): 214*cda5da8dSAndroid Build Coastguard Worker return mock.assert_called(*args, **kwargs) 215*cda5da8dSAndroid Build Coastguard Worker def assert_not_called(*args, **kwargs): 216*cda5da8dSAndroid Build Coastguard Worker return mock.assert_not_called(*args, **kwargs) 217*cda5da8dSAndroid Build Coastguard Worker def assert_called_once(*args, **kwargs): 218*cda5da8dSAndroid Build Coastguard Worker return mock.assert_called_once(*args, **kwargs) 219*cda5da8dSAndroid Build Coastguard Worker def assert_called_once_with(*args, **kwargs): 220*cda5da8dSAndroid Build Coastguard Worker return mock.assert_called_once_with(*args, **kwargs) 221*cda5da8dSAndroid Build Coastguard Worker def assert_has_calls(*args, **kwargs): 222*cda5da8dSAndroid Build Coastguard Worker return mock.assert_has_calls(*args, **kwargs) 223*cda5da8dSAndroid Build Coastguard Worker def assert_any_call(*args, **kwargs): 224*cda5da8dSAndroid Build Coastguard Worker return mock.assert_any_call(*args, **kwargs) 225*cda5da8dSAndroid Build Coastguard Worker def reset_mock(): 226*cda5da8dSAndroid Build Coastguard Worker funcopy.method_calls = _CallList() 227*cda5da8dSAndroid Build Coastguard Worker funcopy.mock_calls = _CallList() 228*cda5da8dSAndroid Build Coastguard Worker mock.reset_mock() 229*cda5da8dSAndroid Build Coastguard Worker ret = funcopy.return_value 230*cda5da8dSAndroid Build Coastguard Worker if _is_instance_mock(ret) and not ret is mock: 231*cda5da8dSAndroid Build Coastguard Worker ret.reset_mock() 232*cda5da8dSAndroid Build Coastguard Worker 233*cda5da8dSAndroid Build Coastguard Worker funcopy.called = False 234*cda5da8dSAndroid Build Coastguard Worker funcopy.call_count = 0 235*cda5da8dSAndroid Build Coastguard Worker funcopy.call_args = None 236*cda5da8dSAndroid Build Coastguard Worker funcopy.call_args_list = _CallList() 237*cda5da8dSAndroid Build Coastguard Worker funcopy.method_calls = _CallList() 238*cda5da8dSAndroid Build Coastguard Worker funcopy.mock_calls = _CallList() 239*cda5da8dSAndroid Build Coastguard Worker 240*cda5da8dSAndroid Build Coastguard Worker funcopy.return_value = mock.return_value 241*cda5da8dSAndroid Build Coastguard Worker funcopy.side_effect = mock.side_effect 242*cda5da8dSAndroid Build Coastguard Worker funcopy._mock_children = mock._mock_children 243*cda5da8dSAndroid Build Coastguard Worker 244*cda5da8dSAndroid Build Coastguard Worker funcopy.assert_called_with = assert_called_with 245*cda5da8dSAndroid Build Coastguard Worker funcopy.assert_called_once_with = assert_called_once_with 246*cda5da8dSAndroid Build Coastguard Worker funcopy.assert_has_calls = assert_has_calls 247*cda5da8dSAndroid Build Coastguard Worker funcopy.assert_any_call = assert_any_call 248*cda5da8dSAndroid Build Coastguard Worker funcopy.reset_mock = reset_mock 249*cda5da8dSAndroid Build Coastguard Worker funcopy.assert_called = assert_called 250*cda5da8dSAndroid Build Coastguard Worker funcopy.assert_not_called = assert_not_called 251*cda5da8dSAndroid Build Coastguard Worker funcopy.assert_called_once = assert_called_once 252*cda5da8dSAndroid Build Coastguard Worker funcopy.__signature__ = sig 253*cda5da8dSAndroid Build Coastguard Worker 254*cda5da8dSAndroid Build Coastguard Worker mock._mock_delegate = funcopy 255*cda5da8dSAndroid Build Coastguard Worker 256*cda5da8dSAndroid Build Coastguard Worker 257*cda5da8dSAndroid Build Coastguard Workerdef _setup_async_mock(mock): 258*cda5da8dSAndroid Build Coastguard Worker mock._is_coroutine = asyncio.coroutines._is_coroutine 259*cda5da8dSAndroid Build Coastguard Worker mock.await_count = 0 260*cda5da8dSAndroid Build Coastguard Worker mock.await_args = None 261*cda5da8dSAndroid Build Coastguard Worker mock.await_args_list = _CallList() 262*cda5da8dSAndroid Build Coastguard Worker 263*cda5da8dSAndroid Build Coastguard Worker # Mock is not configured yet so the attributes are set 264*cda5da8dSAndroid Build Coastguard Worker # to a function and then the corresponding mock helper function 265*cda5da8dSAndroid Build Coastguard Worker # is called when the helper is accessed similar to _setup_func. 266*cda5da8dSAndroid Build Coastguard Worker def wrapper(attr, /, *args, **kwargs): 267*cda5da8dSAndroid Build Coastguard Worker return getattr(mock.mock, attr)(*args, **kwargs) 268*cda5da8dSAndroid Build Coastguard Worker 269*cda5da8dSAndroid Build Coastguard Worker for attribute in ('assert_awaited', 270*cda5da8dSAndroid Build Coastguard Worker 'assert_awaited_once', 271*cda5da8dSAndroid Build Coastguard Worker 'assert_awaited_with', 272*cda5da8dSAndroid Build Coastguard Worker 'assert_awaited_once_with', 273*cda5da8dSAndroid Build Coastguard Worker 'assert_any_await', 274*cda5da8dSAndroid Build Coastguard Worker 'assert_has_awaits', 275*cda5da8dSAndroid Build Coastguard Worker 'assert_not_awaited'): 276*cda5da8dSAndroid Build Coastguard Worker 277*cda5da8dSAndroid Build Coastguard Worker # setattr(mock, attribute, wrapper) causes late binding 278*cda5da8dSAndroid Build Coastguard Worker # hence attribute will always be the last value in the loop 279*cda5da8dSAndroid Build Coastguard Worker # Use partial(wrapper, attribute) to ensure the attribute is bound 280*cda5da8dSAndroid Build Coastguard Worker # correctly. 281*cda5da8dSAndroid Build Coastguard Worker setattr(mock, attribute, partial(wrapper, attribute)) 282*cda5da8dSAndroid Build Coastguard Worker 283*cda5da8dSAndroid Build Coastguard Worker 284*cda5da8dSAndroid Build Coastguard Workerdef _is_magic(name): 285*cda5da8dSAndroid Build Coastguard Worker return '__%s__' % name[2:-2] == name 286*cda5da8dSAndroid Build Coastguard Worker 287*cda5da8dSAndroid Build Coastguard Worker 288*cda5da8dSAndroid Build Coastguard Workerclass _SentinelObject(object): 289*cda5da8dSAndroid Build Coastguard Worker "A unique, named, sentinel object." 290*cda5da8dSAndroid Build Coastguard Worker def __init__(self, name): 291*cda5da8dSAndroid Build Coastguard Worker self.name = name 292*cda5da8dSAndroid Build Coastguard Worker 293*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 294*cda5da8dSAndroid Build Coastguard Worker return 'sentinel.%s' % self.name 295*cda5da8dSAndroid Build Coastguard Worker 296*cda5da8dSAndroid Build Coastguard Worker def __reduce__(self): 297*cda5da8dSAndroid Build Coastguard Worker return 'sentinel.%s' % self.name 298*cda5da8dSAndroid Build Coastguard Worker 299*cda5da8dSAndroid Build Coastguard Worker 300*cda5da8dSAndroid Build Coastguard Workerclass _Sentinel(object): 301*cda5da8dSAndroid Build Coastguard Worker """Access attributes to return a named object, usable as a sentinel.""" 302*cda5da8dSAndroid Build Coastguard Worker def __init__(self): 303*cda5da8dSAndroid Build Coastguard Worker self._sentinels = {} 304*cda5da8dSAndroid Build Coastguard Worker 305*cda5da8dSAndroid Build Coastguard Worker def __getattr__(self, name): 306*cda5da8dSAndroid Build Coastguard Worker if name == '__bases__': 307*cda5da8dSAndroid Build Coastguard Worker # Without this help(unittest.mock) raises an exception 308*cda5da8dSAndroid Build Coastguard Worker raise AttributeError 309*cda5da8dSAndroid Build Coastguard Worker return self._sentinels.setdefault(name, _SentinelObject(name)) 310*cda5da8dSAndroid Build Coastguard Worker 311*cda5da8dSAndroid Build Coastguard Worker def __reduce__(self): 312*cda5da8dSAndroid Build Coastguard Worker return 'sentinel' 313*cda5da8dSAndroid Build Coastguard Worker 314*cda5da8dSAndroid Build Coastguard Worker 315*cda5da8dSAndroid Build Coastguard Workersentinel = _Sentinel() 316*cda5da8dSAndroid Build Coastguard Worker 317*cda5da8dSAndroid Build Coastguard WorkerDEFAULT = sentinel.DEFAULT 318*cda5da8dSAndroid Build Coastguard Worker_missing = sentinel.MISSING 319*cda5da8dSAndroid Build Coastguard Worker_deleted = sentinel.DELETED 320*cda5da8dSAndroid Build Coastguard Worker 321*cda5da8dSAndroid Build Coastguard Worker 322*cda5da8dSAndroid Build Coastguard Worker_allowed_names = { 323*cda5da8dSAndroid Build Coastguard Worker 'return_value', '_mock_return_value', 'side_effect', 324*cda5da8dSAndroid Build Coastguard Worker '_mock_side_effect', '_mock_parent', '_mock_new_parent', 325*cda5da8dSAndroid Build Coastguard Worker '_mock_name', '_mock_new_name' 326*cda5da8dSAndroid Build Coastguard Worker} 327*cda5da8dSAndroid Build Coastguard Worker 328*cda5da8dSAndroid Build Coastguard Worker 329*cda5da8dSAndroid Build Coastguard Workerdef _delegating_property(name): 330*cda5da8dSAndroid Build Coastguard Worker _allowed_names.add(name) 331*cda5da8dSAndroid Build Coastguard Worker _the_name = '_mock_' + name 332*cda5da8dSAndroid Build Coastguard Worker def _get(self, name=name, _the_name=_the_name): 333*cda5da8dSAndroid Build Coastguard Worker sig = self._mock_delegate 334*cda5da8dSAndroid Build Coastguard Worker if sig is None: 335*cda5da8dSAndroid Build Coastguard Worker return getattr(self, _the_name) 336*cda5da8dSAndroid Build Coastguard Worker return getattr(sig, name) 337*cda5da8dSAndroid Build Coastguard Worker def _set(self, value, name=name, _the_name=_the_name): 338*cda5da8dSAndroid Build Coastguard Worker sig = self._mock_delegate 339*cda5da8dSAndroid Build Coastguard Worker if sig is None: 340*cda5da8dSAndroid Build Coastguard Worker self.__dict__[_the_name] = value 341*cda5da8dSAndroid Build Coastguard Worker else: 342*cda5da8dSAndroid Build Coastguard Worker setattr(sig, name, value) 343*cda5da8dSAndroid Build Coastguard Worker 344*cda5da8dSAndroid Build Coastguard Worker return property(_get, _set) 345*cda5da8dSAndroid Build Coastguard Worker 346*cda5da8dSAndroid Build Coastguard Worker 347*cda5da8dSAndroid Build Coastguard Worker 348*cda5da8dSAndroid Build Coastguard Workerclass _CallList(list): 349*cda5da8dSAndroid Build Coastguard Worker 350*cda5da8dSAndroid Build Coastguard Worker def __contains__(self, value): 351*cda5da8dSAndroid Build Coastguard Worker if not isinstance(value, list): 352*cda5da8dSAndroid Build Coastguard Worker return list.__contains__(self, value) 353*cda5da8dSAndroid Build Coastguard Worker len_value = len(value) 354*cda5da8dSAndroid Build Coastguard Worker len_self = len(self) 355*cda5da8dSAndroid Build Coastguard Worker if len_value > len_self: 356*cda5da8dSAndroid Build Coastguard Worker return False 357*cda5da8dSAndroid Build Coastguard Worker 358*cda5da8dSAndroid Build Coastguard Worker for i in range(0, len_self - len_value + 1): 359*cda5da8dSAndroid Build Coastguard Worker sub_list = self[i:i+len_value] 360*cda5da8dSAndroid Build Coastguard Worker if sub_list == value: 361*cda5da8dSAndroid Build Coastguard Worker return True 362*cda5da8dSAndroid Build Coastguard Worker return False 363*cda5da8dSAndroid Build Coastguard Worker 364*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 365*cda5da8dSAndroid Build Coastguard Worker return pprint.pformat(list(self)) 366*cda5da8dSAndroid Build Coastguard Worker 367*cda5da8dSAndroid Build Coastguard Worker 368*cda5da8dSAndroid Build Coastguard Workerdef _check_and_set_parent(parent, value, name, new_name): 369*cda5da8dSAndroid Build Coastguard Worker value = _extract_mock(value) 370*cda5da8dSAndroid Build Coastguard Worker 371*cda5da8dSAndroid Build Coastguard Worker if not _is_instance_mock(value): 372*cda5da8dSAndroid Build Coastguard Worker return False 373*cda5da8dSAndroid Build Coastguard Worker if ((value._mock_name or value._mock_new_name) or 374*cda5da8dSAndroid Build Coastguard Worker (value._mock_parent is not None) or 375*cda5da8dSAndroid Build Coastguard Worker (value._mock_new_parent is not None)): 376*cda5da8dSAndroid Build Coastguard Worker return False 377*cda5da8dSAndroid Build Coastguard Worker 378*cda5da8dSAndroid Build Coastguard Worker _parent = parent 379*cda5da8dSAndroid Build Coastguard Worker while _parent is not None: 380*cda5da8dSAndroid Build Coastguard Worker # setting a mock (value) as a child or return value of itself 381*cda5da8dSAndroid Build Coastguard Worker # should not modify the mock 382*cda5da8dSAndroid Build Coastguard Worker if _parent is value: 383*cda5da8dSAndroid Build Coastguard Worker return False 384*cda5da8dSAndroid Build Coastguard Worker _parent = _parent._mock_new_parent 385*cda5da8dSAndroid Build Coastguard Worker 386*cda5da8dSAndroid Build Coastguard Worker if new_name: 387*cda5da8dSAndroid Build Coastguard Worker value._mock_new_parent = parent 388*cda5da8dSAndroid Build Coastguard Worker value._mock_new_name = new_name 389*cda5da8dSAndroid Build Coastguard Worker if name: 390*cda5da8dSAndroid Build Coastguard Worker value._mock_parent = parent 391*cda5da8dSAndroid Build Coastguard Worker value._mock_name = name 392*cda5da8dSAndroid Build Coastguard Worker return True 393*cda5da8dSAndroid Build Coastguard Worker 394*cda5da8dSAndroid Build Coastguard Worker# Internal class to identify if we wrapped an iterator object or not. 395*cda5da8dSAndroid Build Coastguard Workerclass _MockIter(object): 396*cda5da8dSAndroid Build Coastguard Worker def __init__(self, obj): 397*cda5da8dSAndroid Build Coastguard Worker self.obj = iter(obj) 398*cda5da8dSAndroid Build Coastguard Worker def __next__(self): 399*cda5da8dSAndroid Build Coastguard Worker return next(self.obj) 400*cda5da8dSAndroid Build Coastguard Worker 401*cda5da8dSAndroid Build Coastguard Workerclass Base(object): 402*cda5da8dSAndroid Build Coastguard Worker _mock_return_value = DEFAULT 403*cda5da8dSAndroid Build Coastguard Worker _mock_side_effect = None 404*cda5da8dSAndroid Build Coastguard Worker def __init__(self, /, *args, **kwargs): 405*cda5da8dSAndroid Build Coastguard Worker pass 406*cda5da8dSAndroid Build Coastguard Worker 407*cda5da8dSAndroid Build Coastguard Worker 408*cda5da8dSAndroid Build Coastguard Worker 409*cda5da8dSAndroid Build Coastguard Workerclass NonCallableMock(Base): 410*cda5da8dSAndroid Build Coastguard Worker """A non-callable version of `Mock`""" 411*cda5da8dSAndroid Build Coastguard Worker 412*cda5da8dSAndroid Build Coastguard Worker # Store a mutex as a class attribute in order to protect concurrent access 413*cda5da8dSAndroid Build Coastguard Worker # to mock attributes. Using a class attribute allows all NonCallableMock 414*cda5da8dSAndroid Build Coastguard Worker # instances to share the mutex for simplicity. 415*cda5da8dSAndroid Build Coastguard Worker # 416*cda5da8dSAndroid Build Coastguard Worker # See https://github.com/python/cpython/issues/98624 for why this is 417*cda5da8dSAndroid Build Coastguard Worker # necessary. 418*cda5da8dSAndroid Build Coastguard Worker _lock = RLock() 419*cda5da8dSAndroid Build Coastguard Worker 420*cda5da8dSAndroid Build Coastguard Worker def __new__(cls, /, *args, **kw): 421*cda5da8dSAndroid Build Coastguard Worker # every instance has its own class 422*cda5da8dSAndroid Build Coastguard Worker # so we can create magic methods on the 423*cda5da8dSAndroid Build Coastguard Worker # class without stomping on other mocks 424*cda5da8dSAndroid Build Coastguard Worker bases = (cls,) 425*cda5da8dSAndroid Build Coastguard Worker if not issubclass(cls, AsyncMockMixin): 426*cda5da8dSAndroid Build Coastguard Worker # Check if spec is an async object or function 427*cda5da8dSAndroid Build Coastguard Worker bound_args = _MOCK_SIG.bind_partial(cls, *args, **kw).arguments 428*cda5da8dSAndroid Build Coastguard Worker spec_arg = bound_args.get('spec_set', bound_args.get('spec')) 429*cda5da8dSAndroid Build Coastguard Worker if spec_arg is not None and _is_async_obj(spec_arg): 430*cda5da8dSAndroid Build Coastguard Worker bases = (AsyncMockMixin, cls) 431*cda5da8dSAndroid Build Coastguard Worker new = type(cls.__name__, bases, {'__doc__': cls.__doc__}) 432*cda5da8dSAndroid Build Coastguard Worker instance = _safe_super(NonCallableMock, cls).__new__(new) 433*cda5da8dSAndroid Build Coastguard Worker return instance 434*cda5da8dSAndroid Build Coastguard Worker 435*cda5da8dSAndroid Build Coastguard Worker 436*cda5da8dSAndroid Build Coastguard Worker def __init__( 437*cda5da8dSAndroid Build Coastguard Worker self, spec=None, wraps=None, name=None, spec_set=None, 438*cda5da8dSAndroid Build Coastguard Worker parent=None, _spec_state=None, _new_name='', _new_parent=None, 439*cda5da8dSAndroid Build Coastguard Worker _spec_as_instance=False, _eat_self=None, unsafe=False, **kwargs 440*cda5da8dSAndroid Build Coastguard Worker ): 441*cda5da8dSAndroid Build Coastguard Worker if _new_parent is None: 442*cda5da8dSAndroid Build Coastguard Worker _new_parent = parent 443*cda5da8dSAndroid Build Coastguard Worker 444*cda5da8dSAndroid Build Coastguard Worker __dict__ = self.__dict__ 445*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_parent'] = parent 446*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_name'] = name 447*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_new_name'] = _new_name 448*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_new_parent'] = _new_parent 449*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_sealed'] = False 450*cda5da8dSAndroid Build Coastguard Worker 451*cda5da8dSAndroid Build Coastguard Worker if spec_set is not None: 452*cda5da8dSAndroid Build Coastguard Worker spec = spec_set 453*cda5da8dSAndroid Build Coastguard Worker spec_set = True 454*cda5da8dSAndroid Build Coastguard Worker if _eat_self is None: 455*cda5da8dSAndroid Build Coastguard Worker _eat_self = parent is not None 456*cda5da8dSAndroid Build Coastguard Worker 457*cda5da8dSAndroid Build Coastguard Worker self._mock_add_spec(spec, spec_set, _spec_as_instance, _eat_self) 458*cda5da8dSAndroid Build Coastguard Worker 459*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_children'] = {} 460*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_wraps'] = wraps 461*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_delegate'] = None 462*cda5da8dSAndroid Build Coastguard Worker 463*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_called'] = False 464*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_call_args'] = None 465*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_call_count'] = 0 466*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_call_args_list'] = _CallList() 467*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_mock_calls'] = _CallList() 468*cda5da8dSAndroid Build Coastguard Worker 469*cda5da8dSAndroid Build Coastguard Worker __dict__['method_calls'] = _CallList() 470*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_unsafe'] = unsafe 471*cda5da8dSAndroid Build Coastguard Worker 472*cda5da8dSAndroid Build Coastguard Worker if kwargs: 473*cda5da8dSAndroid Build Coastguard Worker self.configure_mock(**kwargs) 474*cda5da8dSAndroid Build Coastguard Worker 475*cda5da8dSAndroid Build Coastguard Worker _safe_super(NonCallableMock, self).__init__( 476*cda5da8dSAndroid Build Coastguard Worker spec, wraps, name, spec_set, parent, 477*cda5da8dSAndroid Build Coastguard Worker _spec_state 478*cda5da8dSAndroid Build Coastguard Worker ) 479*cda5da8dSAndroid Build Coastguard Worker 480*cda5da8dSAndroid Build Coastguard Worker 481*cda5da8dSAndroid Build Coastguard Worker def attach_mock(self, mock, attribute): 482*cda5da8dSAndroid Build Coastguard Worker """ 483*cda5da8dSAndroid Build Coastguard Worker Attach a mock as an attribute of this one, replacing its name and 484*cda5da8dSAndroid Build Coastguard Worker parent. Calls to the attached mock will be recorded in the 485*cda5da8dSAndroid Build Coastguard Worker `method_calls` and `mock_calls` attributes of this one.""" 486*cda5da8dSAndroid Build Coastguard Worker inner_mock = _extract_mock(mock) 487*cda5da8dSAndroid Build Coastguard Worker 488*cda5da8dSAndroid Build Coastguard Worker inner_mock._mock_parent = None 489*cda5da8dSAndroid Build Coastguard Worker inner_mock._mock_new_parent = None 490*cda5da8dSAndroid Build Coastguard Worker inner_mock._mock_name = '' 491*cda5da8dSAndroid Build Coastguard Worker inner_mock._mock_new_name = None 492*cda5da8dSAndroid Build Coastguard Worker 493*cda5da8dSAndroid Build Coastguard Worker setattr(self, attribute, mock) 494*cda5da8dSAndroid Build Coastguard Worker 495*cda5da8dSAndroid Build Coastguard Worker 496*cda5da8dSAndroid Build Coastguard Worker def mock_add_spec(self, spec, spec_set=False): 497*cda5da8dSAndroid Build Coastguard Worker """Add a spec to a mock. `spec` can either be an object or a 498*cda5da8dSAndroid Build Coastguard Worker list of strings. Only attributes on the `spec` can be fetched as 499*cda5da8dSAndroid Build Coastguard Worker attributes from the mock. 500*cda5da8dSAndroid Build Coastguard Worker 501*cda5da8dSAndroid Build Coastguard Worker If `spec_set` is True then only attributes on the spec can be set.""" 502*cda5da8dSAndroid Build Coastguard Worker self._mock_add_spec(spec, spec_set) 503*cda5da8dSAndroid Build Coastguard Worker 504*cda5da8dSAndroid Build Coastguard Worker 505*cda5da8dSAndroid Build Coastguard Worker def _mock_add_spec(self, spec, spec_set, _spec_as_instance=False, 506*cda5da8dSAndroid Build Coastguard Worker _eat_self=False): 507*cda5da8dSAndroid Build Coastguard Worker if _is_instance_mock(spec): 508*cda5da8dSAndroid Build Coastguard Worker raise InvalidSpecError(f'Cannot spec a Mock object. [object={spec!r}]') 509*cda5da8dSAndroid Build Coastguard Worker 510*cda5da8dSAndroid Build Coastguard Worker _spec_class = None 511*cda5da8dSAndroid Build Coastguard Worker _spec_signature = None 512*cda5da8dSAndroid Build Coastguard Worker _spec_asyncs = [] 513*cda5da8dSAndroid Build Coastguard Worker 514*cda5da8dSAndroid Build Coastguard Worker for attr in dir(spec): 515*cda5da8dSAndroid Build Coastguard Worker if iscoroutinefunction(getattr(spec, attr, None)): 516*cda5da8dSAndroid Build Coastguard Worker _spec_asyncs.append(attr) 517*cda5da8dSAndroid Build Coastguard Worker 518*cda5da8dSAndroid Build Coastguard Worker if spec is not None and not _is_list(spec): 519*cda5da8dSAndroid Build Coastguard Worker if isinstance(spec, type): 520*cda5da8dSAndroid Build Coastguard Worker _spec_class = spec 521*cda5da8dSAndroid Build Coastguard Worker else: 522*cda5da8dSAndroid Build Coastguard Worker _spec_class = type(spec) 523*cda5da8dSAndroid Build Coastguard Worker res = _get_signature_object(spec, 524*cda5da8dSAndroid Build Coastguard Worker _spec_as_instance, _eat_self) 525*cda5da8dSAndroid Build Coastguard Worker _spec_signature = res and res[1] 526*cda5da8dSAndroid Build Coastguard Worker 527*cda5da8dSAndroid Build Coastguard Worker spec = dir(spec) 528*cda5da8dSAndroid Build Coastguard Worker 529*cda5da8dSAndroid Build Coastguard Worker __dict__ = self.__dict__ 530*cda5da8dSAndroid Build Coastguard Worker __dict__['_spec_class'] = _spec_class 531*cda5da8dSAndroid Build Coastguard Worker __dict__['_spec_set'] = spec_set 532*cda5da8dSAndroid Build Coastguard Worker __dict__['_spec_signature'] = _spec_signature 533*cda5da8dSAndroid Build Coastguard Worker __dict__['_mock_methods'] = spec 534*cda5da8dSAndroid Build Coastguard Worker __dict__['_spec_asyncs'] = _spec_asyncs 535*cda5da8dSAndroid Build Coastguard Worker 536*cda5da8dSAndroid Build Coastguard Worker def __get_return_value(self): 537*cda5da8dSAndroid Build Coastguard Worker ret = self._mock_return_value 538*cda5da8dSAndroid Build Coastguard Worker if self._mock_delegate is not None: 539*cda5da8dSAndroid Build Coastguard Worker ret = self._mock_delegate.return_value 540*cda5da8dSAndroid Build Coastguard Worker 541*cda5da8dSAndroid Build Coastguard Worker if ret is DEFAULT: 542*cda5da8dSAndroid Build Coastguard Worker ret = self._get_child_mock( 543*cda5da8dSAndroid Build Coastguard Worker _new_parent=self, _new_name='()' 544*cda5da8dSAndroid Build Coastguard Worker ) 545*cda5da8dSAndroid Build Coastguard Worker self.return_value = ret 546*cda5da8dSAndroid Build Coastguard Worker return ret 547*cda5da8dSAndroid Build Coastguard Worker 548*cda5da8dSAndroid Build Coastguard Worker 549*cda5da8dSAndroid Build Coastguard Worker def __set_return_value(self, value): 550*cda5da8dSAndroid Build Coastguard Worker if self._mock_delegate is not None: 551*cda5da8dSAndroid Build Coastguard Worker self._mock_delegate.return_value = value 552*cda5da8dSAndroid Build Coastguard Worker else: 553*cda5da8dSAndroid Build Coastguard Worker self._mock_return_value = value 554*cda5da8dSAndroid Build Coastguard Worker _check_and_set_parent(self, value, None, '()') 555*cda5da8dSAndroid Build Coastguard Worker 556*cda5da8dSAndroid Build Coastguard Worker __return_value_doc = "The value to be returned when the mock is called." 557*cda5da8dSAndroid Build Coastguard Worker return_value = property(__get_return_value, __set_return_value, 558*cda5da8dSAndroid Build Coastguard Worker __return_value_doc) 559*cda5da8dSAndroid Build Coastguard Worker 560*cda5da8dSAndroid Build Coastguard Worker 561*cda5da8dSAndroid Build Coastguard Worker @property 562*cda5da8dSAndroid Build Coastguard Worker def __class__(self): 563*cda5da8dSAndroid Build Coastguard Worker if self._spec_class is None: 564*cda5da8dSAndroid Build Coastguard Worker return type(self) 565*cda5da8dSAndroid Build Coastguard Worker return self._spec_class 566*cda5da8dSAndroid Build Coastguard Worker 567*cda5da8dSAndroid Build Coastguard Worker called = _delegating_property('called') 568*cda5da8dSAndroid Build Coastguard Worker call_count = _delegating_property('call_count') 569*cda5da8dSAndroid Build Coastguard Worker call_args = _delegating_property('call_args') 570*cda5da8dSAndroid Build Coastguard Worker call_args_list = _delegating_property('call_args_list') 571*cda5da8dSAndroid Build Coastguard Worker mock_calls = _delegating_property('mock_calls') 572*cda5da8dSAndroid Build Coastguard Worker 573*cda5da8dSAndroid Build Coastguard Worker 574*cda5da8dSAndroid Build Coastguard Worker def __get_side_effect(self): 575*cda5da8dSAndroid Build Coastguard Worker delegated = self._mock_delegate 576*cda5da8dSAndroid Build Coastguard Worker if delegated is None: 577*cda5da8dSAndroid Build Coastguard Worker return self._mock_side_effect 578*cda5da8dSAndroid Build Coastguard Worker sf = delegated.side_effect 579*cda5da8dSAndroid Build Coastguard Worker if (sf is not None and not callable(sf) 580*cda5da8dSAndroid Build Coastguard Worker and not isinstance(sf, _MockIter) and not _is_exception(sf)): 581*cda5da8dSAndroid Build Coastguard Worker sf = _MockIter(sf) 582*cda5da8dSAndroid Build Coastguard Worker delegated.side_effect = sf 583*cda5da8dSAndroid Build Coastguard Worker return sf 584*cda5da8dSAndroid Build Coastguard Worker 585*cda5da8dSAndroid Build Coastguard Worker def __set_side_effect(self, value): 586*cda5da8dSAndroid Build Coastguard Worker value = _try_iter(value) 587*cda5da8dSAndroid Build Coastguard Worker delegated = self._mock_delegate 588*cda5da8dSAndroid Build Coastguard Worker if delegated is None: 589*cda5da8dSAndroid Build Coastguard Worker self._mock_side_effect = value 590*cda5da8dSAndroid Build Coastguard Worker else: 591*cda5da8dSAndroid Build Coastguard Worker delegated.side_effect = value 592*cda5da8dSAndroid Build Coastguard Worker 593*cda5da8dSAndroid Build Coastguard Worker side_effect = property(__get_side_effect, __set_side_effect) 594*cda5da8dSAndroid Build Coastguard Worker 595*cda5da8dSAndroid Build Coastguard Worker 596*cda5da8dSAndroid Build Coastguard Worker def reset_mock(self, visited=None,*, return_value=False, side_effect=False): 597*cda5da8dSAndroid Build Coastguard Worker "Restore the mock object to its initial state." 598*cda5da8dSAndroid Build Coastguard Worker if visited is None: 599*cda5da8dSAndroid Build Coastguard Worker visited = [] 600*cda5da8dSAndroid Build Coastguard Worker if id(self) in visited: 601*cda5da8dSAndroid Build Coastguard Worker return 602*cda5da8dSAndroid Build Coastguard Worker visited.append(id(self)) 603*cda5da8dSAndroid Build Coastguard Worker 604*cda5da8dSAndroid Build Coastguard Worker self.called = False 605*cda5da8dSAndroid Build Coastguard Worker self.call_args = None 606*cda5da8dSAndroid Build Coastguard Worker self.call_count = 0 607*cda5da8dSAndroid Build Coastguard Worker self.mock_calls = _CallList() 608*cda5da8dSAndroid Build Coastguard Worker self.call_args_list = _CallList() 609*cda5da8dSAndroid Build Coastguard Worker self.method_calls = _CallList() 610*cda5da8dSAndroid Build Coastguard Worker 611*cda5da8dSAndroid Build Coastguard Worker if return_value: 612*cda5da8dSAndroid Build Coastguard Worker self._mock_return_value = DEFAULT 613*cda5da8dSAndroid Build Coastguard Worker if side_effect: 614*cda5da8dSAndroid Build Coastguard Worker self._mock_side_effect = None 615*cda5da8dSAndroid Build Coastguard Worker 616*cda5da8dSAndroid Build Coastguard Worker for child in self._mock_children.values(): 617*cda5da8dSAndroid Build Coastguard Worker if isinstance(child, _SpecState) or child is _deleted: 618*cda5da8dSAndroid Build Coastguard Worker continue 619*cda5da8dSAndroid Build Coastguard Worker child.reset_mock(visited, return_value=return_value, side_effect=side_effect) 620*cda5da8dSAndroid Build Coastguard Worker 621*cda5da8dSAndroid Build Coastguard Worker ret = self._mock_return_value 622*cda5da8dSAndroid Build Coastguard Worker if _is_instance_mock(ret) and ret is not self: 623*cda5da8dSAndroid Build Coastguard Worker ret.reset_mock(visited) 624*cda5da8dSAndroid Build Coastguard Worker 625*cda5da8dSAndroid Build Coastguard Worker 626*cda5da8dSAndroid Build Coastguard Worker def configure_mock(self, /, **kwargs): 627*cda5da8dSAndroid Build Coastguard Worker """Set attributes on the mock through keyword arguments. 628*cda5da8dSAndroid Build Coastguard Worker 629*cda5da8dSAndroid Build Coastguard Worker Attributes plus return values and side effects can be set on child 630*cda5da8dSAndroid Build Coastguard Worker mocks using standard dot notation and unpacking a dictionary in the 631*cda5da8dSAndroid Build Coastguard Worker method call: 632*cda5da8dSAndroid Build Coastguard Worker 633*cda5da8dSAndroid Build Coastguard Worker >>> attrs = {'method.return_value': 3, 'other.side_effect': KeyError} 634*cda5da8dSAndroid Build Coastguard Worker >>> mock.configure_mock(**attrs)""" 635*cda5da8dSAndroid Build Coastguard Worker for arg, val in sorted(kwargs.items(), 636*cda5da8dSAndroid Build Coastguard Worker # we sort on the number of dots so that 637*cda5da8dSAndroid Build Coastguard Worker # attributes are set before we set attributes on 638*cda5da8dSAndroid Build Coastguard Worker # attributes 639*cda5da8dSAndroid Build Coastguard Worker key=lambda entry: entry[0].count('.')): 640*cda5da8dSAndroid Build Coastguard Worker args = arg.split('.') 641*cda5da8dSAndroid Build Coastguard Worker final = args.pop() 642*cda5da8dSAndroid Build Coastguard Worker obj = self 643*cda5da8dSAndroid Build Coastguard Worker for entry in args: 644*cda5da8dSAndroid Build Coastguard Worker obj = getattr(obj, entry) 645*cda5da8dSAndroid Build Coastguard Worker setattr(obj, final, val) 646*cda5da8dSAndroid Build Coastguard Worker 647*cda5da8dSAndroid Build Coastguard Worker 648*cda5da8dSAndroid Build Coastguard Worker def __getattr__(self, name): 649*cda5da8dSAndroid Build Coastguard Worker if name in {'_mock_methods', '_mock_unsafe'}: 650*cda5da8dSAndroid Build Coastguard Worker raise AttributeError(name) 651*cda5da8dSAndroid Build Coastguard Worker elif self._mock_methods is not None: 652*cda5da8dSAndroid Build Coastguard Worker if name not in self._mock_methods or name in _all_magics: 653*cda5da8dSAndroid Build Coastguard Worker raise AttributeError("Mock object has no attribute %r" % name) 654*cda5da8dSAndroid Build Coastguard Worker elif _is_magic(name): 655*cda5da8dSAndroid Build Coastguard Worker raise AttributeError(name) 656*cda5da8dSAndroid Build Coastguard Worker if not self._mock_unsafe and (not self._mock_methods or name not in self._mock_methods): 657*cda5da8dSAndroid Build Coastguard Worker if name.startswith(('assert', 'assret', 'asert', 'aseert', 'assrt')): 658*cda5da8dSAndroid Build Coastguard Worker raise AttributeError( 659*cda5da8dSAndroid Build Coastguard Worker f"{name!r} is not a valid assertion. Use a spec " 660*cda5da8dSAndroid Build Coastguard Worker f"for the mock if {name!r} is meant to be an attribute.") 661*cda5da8dSAndroid Build Coastguard Worker 662*cda5da8dSAndroid Build Coastguard Worker with NonCallableMock._lock: 663*cda5da8dSAndroid Build Coastguard Worker result = self._mock_children.get(name) 664*cda5da8dSAndroid Build Coastguard Worker if result is _deleted: 665*cda5da8dSAndroid Build Coastguard Worker raise AttributeError(name) 666*cda5da8dSAndroid Build Coastguard Worker elif result is None: 667*cda5da8dSAndroid Build Coastguard Worker wraps = None 668*cda5da8dSAndroid Build Coastguard Worker if self._mock_wraps is not None: 669*cda5da8dSAndroid Build Coastguard Worker # XXXX should we get the attribute without triggering code 670*cda5da8dSAndroid Build Coastguard Worker # execution? 671*cda5da8dSAndroid Build Coastguard Worker wraps = getattr(self._mock_wraps, name) 672*cda5da8dSAndroid Build Coastguard Worker 673*cda5da8dSAndroid Build Coastguard Worker result = self._get_child_mock( 674*cda5da8dSAndroid Build Coastguard Worker parent=self, name=name, wraps=wraps, _new_name=name, 675*cda5da8dSAndroid Build Coastguard Worker _new_parent=self 676*cda5da8dSAndroid Build Coastguard Worker ) 677*cda5da8dSAndroid Build Coastguard Worker self._mock_children[name] = result 678*cda5da8dSAndroid Build Coastguard Worker 679*cda5da8dSAndroid Build Coastguard Worker elif isinstance(result, _SpecState): 680*cda5da8dSAndroid Build Coastguard Worker try: 681*cda5da8dSAndroid Build Coastguard Worker result = create_autospec( 682*cda5da8dSAndroid Build Coastguard Worker result.spec, result.spec_set, result.instance, 683*cda5da8dSAndroid Build Coastguard Worker result.parent, result.name 684*cda5da8dSAndroid Build Coastguard Worker ) 685*cda5da8dSAndroid Build Coastguard Worker except InvalidSpecError: 686*cda5da8dSAndroid Build Coastguard Worker target_name = self.__dict__['_mock_name'] or self 687*cda5da8dSAndroid Build Coastguard Worker raise InvalidSpecError( 688*cda5da8dSAndroid Build Coastguard Worker f'Cannot autospec attr {name!r} from target ' 689*cda5da8dSAndroid Build Coastguard Worker f'{target_name!r} as it has already been mocked out. ' 690*cda5da8dSAndroid Build Coastguard Worker f'[target={self!r}, attr={result.spec!r}]') 691*cda5da8dSAndroid Build Coastguard Worker self._mock_children[name] = result 692*cda5da8dSAndroid Build Coastguard Worker 693*cda5da8dSAndroid Build Coastguard Worker return result 694*cda5da8dSAndroid Build Coastguard Worker 695*cda5da8dSAndroid Build Coastguard Worker 696*cda5da8dSAndroid Build Coastguard Worker def _extract_mock_name(self): 697*cda5da8dSAndroid Build Coastguard Worker _name_list = [self._mock_new_name] 698*cda5da8dSAndroid Build Coastguard Worker _parent = self._mock_new_parent 699*cda5da8dSAndroid Build Coastguard Worker last = self 700*cda5da8dSAndroid Build Coastguard Worker 701*cda5da8dSAndroid Build Coastguard Worker dot = '.' 702*cda5da8dSAndroid Build Coastguard Worker if _name_list == ['()']: 703*cda5da8dSAndroid Build Coastguard Worker dot = '' 704*cda5da8dSAndroid Build Coastguard Worker 705*cda5da8dSAndroid Build Coastguard Worker while _parent is not None: 706*cda5da8dSAndroid Build Coastguard Worker last = _parent 707*cda5da8dSAndroid Build Coastguard Worker 708*cda5da8dSAndroid Build Coastguard Worker _name_list.append(_parent._mock_new_name + dot) 709*cda5da8dSAndroid Build Coastguard Worker dot = '.' 710*cda5da8dSAndroid Build Coastguard Worker if _parent._mock_new_name == '()': 711*cda5da8dSAndroid Build Coastguard Worker dot = '' 712*cda5da8dSAndroid Build Coastguard Worker 713*cda5da8dSAndroid Build Coastguard Worker _parent = _parent._mock_new_parent 714*cda5da8dSAndroid Build Coastguard Worker 715*cda5da8dSAndroid Build Coastguard Worker _name_list = list(reversed(_name_list)) 716*cda5da8dSAndroid Build Coastguard Worker _first = last._mock_name or 'mock' 717*cda5da8dSAndroid Build Coastguard Worker if len(_name_list) > 1: 718*cda5da8dSAndroid Build Coastguard Worker if _name_list[1] not in ('()', '().'): 719*cda5da8dSAndroid Build Coastguard Worker _first += '.' 720*cda5da8dSAndroid Build Coastguard Worker _name_list[0] = _first 721*cda5da8dSAndroid Build Coastguard Worker return ''.join(_name_list) 722*cda5da8dSAndroid Build Coastguard Worker 723*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 724*cda5da8dSAndroid Build Coastguard Worker name = self._extract_mock_name() 725*cda5da8dSAndroid Build Coastguard Worker 726*cda5da8dSAndroid Build Coastguard Worker name_string = '' 727*cda5da8dSAndroid Build Coastguard Worker if name not in ('mock', 'mock.'): 728*cda5da8dSAndroid Build Coastguard Worker name_string = ' name=%r' % name 729*cda5da8dSAndroid Build Coastguard Worker 730*cda5da8dSAndroid Build Coastguard Worker spec_string = '' 731*cda5da8dSAndroid Build Coastguard Worker if self._spec_class is not None: 732*cda5da8dSAndroid Build Coastguard Worker spec_string = ' spec=%r' 733*cda5da8dSAndroid Build Coastguard Worker if self._spec_set: 734*cda5da8dSAndroid Build Coastguard Worker spec_string = ' spec_set=%r' 735*cda5da8dSAndroid Build Coastguard Worker spec_string = spec_string % self._spec_class.__name__ 736*cda5da8dSAndroid Build Coastguard Worker return "<%s%s%s id='%s'>" % ( 737*cda5da8dSAndroid Build Coastguard Worker type(self).__name__, 738*cda5da8dSAndroid Build Coastguard Worker name_string, 739*cda5da8dSAndroid Build Coastguard Worker spec_string, 740*cda5da8dSAndroid Build Coastguard Worker id(self) 741*cda5da8dSAndroid Build Coastguard Worker ) 742*cda5da8dSAndroid Build Coastguard Worker 743*cda5da8dSAndroid Build Coastguard Worker 744*cda5da8dSAndroid Build Coastguard Worker def __dir__(self): 745*cda5da8dSAndroid Build Coastguard Worker """Filter the output of `dir(mock)` to only useful members.""" 746*cda5da8dSAndroid Build Coastguard Worker if not FILTER_DIR: 747*cda5da8dSAndroid Build Coastguard Worker return object.__dir__(self) 748*cda5da8dSAndroid Build Coastguard Worker 749*cda5da8dSAndroid Build Coastguard Worker extras = self._mock_methods or [] 750*cda5da8dSAndroid Build Coastguard Worker from_type = dir(type(self)) 751*cda5da8dSAndroid Build Coastguard Worker from_dict = list(self.__dict__) 752*cda5da8dSAndroid Build Coastguard Worker from_child_mocks = [ 753*cda5da8dSAndroid Build Coastguard Worker m_name for m_name, m_value in self._mock_children.items() 754*cda5da8dSAndroid Build Coastguard Worker if m_value is not _deleted] 755*cda5da8dSAndroid Build Coastguard Worker 756*cda5da8dSAndroid Build Coastguard Worker from_type = [e for e in from_type if not e.startswith('_')] 757*cda5da8dSAndroid Build Coastguard Worker from_dict = [e for e in from_dict if not e.startswith('_') or 758*cda5da8dSAndroid Build Coastguard Worker _is_magic(e)] 759*cda5da8dSAndroid Build Coastguard Worker return sorted(set(extras + from_type + from_dict + from_child_mocks)) 760*cda5da8dSAndroid Build Coastguard Worker 761*cda5da8dSAndroid Build Coastguard Worker 762*cda5da8dSAndroid Build Coastguard Worker def __setattr__(self, name, value): 763*cda5da8dSAndroid Build Coastguard Worker if name in _allowed_names: 764*cda5da8dSAndroid Build Coastguard Worker # property setters go through here 765*cda5da8dSAndroid Build Coastguard Worker return object.__setattr__(self, name, value) 766*cda5da8dSAndroid Build Coastguard Worker elif (self._spec_set and self._mock_methods is not None and 767*cda5da8dSAndroid Build Coastguard Worker name not in self._mock_methods and 768*cda5da8dSAndroid Build Coastguard Worker name not in self.__dict__): 769*cda5da8dSAndroid Build Coastguard Worker raise AttributeError("Mock object has no attribute '%s'" % name) 770*cda5da8dSAndroid Build Coastguard Worker elif name in _unsupported_magics: 771*cda5da8dSAndroid Build Coastguard Worker msg = 'Attempting to set unsupported magic method %r.' % name 772*cda5da8dSAndroid Build Coastguard Worker raise AttributeError(msg) 773*cda5da8dSAndroid Build Coastguard Worker elif name in _all_magics: 774*cda5da8dSAndroid Build Coastguard Worker if self._mock_methods is not None and name not in self._mock_methods: 775*cda5da8dSAndroid Build Coastguard Worker raise AttributeError("Mock object has no attribute '%s'" % name) 776*cda5da8dSAndroid Build Coastguard Worker 777*cda5da8dSAndroid Build Coastguard Worker if not _is_instance_mock(value): 778*cda5da8dSAndroid Build Coastguard Worker setattr(type(self), name, _get_method(name, value)) 779*cda5da8dSAndroid Build Coastguard Worker original = value 780*cda5da8dSAndroid Build Coastguard Worker value = lambda *args, **kw: original(self, *args, **kw) 781*cda5da8dSAndroid Build Coastguard Worker else: 782*cda5da8dSAndroid Build Coastguard Worker # only set _new_name and not name so that mock_calls is tracked 783*cda5da8dSAndroid Build Coastguard Worker # but not method calls 784*cda5da8dSAndroid Build Coastguard Worker _check_and_set_parent(self, value, None, name) 785*cda5da8dSAndroid Build Coastguard Worker setattr(type(self), name, value) 786*cda5da8dSAndroid Build Coastguard Worker self._mock_children[name] = value 787*cda5da8dSAndroid Build Coastguard Worker elif name == '__class__': 788*cda5da8dSAndroid Build Coastguard Worker self._spec_class = value 789*cda5da8dSAndroid Build Coastguard Worker return 790*cda5da8dSAndroid Build Coastguard Worker else: 791*cda5da8dSAndroid Build Coastguard Worker if _check_and_set_parent(self, value, name, name): 792*cda5da8dSAndroid Build Coastguard Worker self._mock_children[name] = value 793*cda5da8dSAndroid Build Coastguard Worker 794*cda5da8dSAndroid Build Coastguard Worker if self._mock_sealed and not hasattr(self, name): 795*cda5da8dSAndroid Build Coastguard Worker mock_name = f'{self._extract_mock_name()}.{name}' 796*cda5da8dSAndroid Build Coastguard Worker raise AttributeError(f'Cannot set {mock_name}') 797*cda5da8dSAndroid Build Coastguard Worker 798*cda5da8dSAndroid Build Coastguard Worker return object.__setattr__(self, name, value) 799*cda5da8dSAndroid Build Coastguard Worker 800*cda5da8dSAndroid Build Coastguard Worker 801*cda5da8dSAndroid Build Coastguard Worker def __delattr__(self, name): 802*cda5da8dSAndroid Build Coastguard Worker if name in _all_magics and name in type(self).__dict__: 803*cda5da8dSAndroid Build Coastguard Worker delattr(type(self), name) 804*cda5da8dSAndroid Build Coastguard Worker if name not in self.__dict__: 805*cda5da8dSAndroid Build Coastguard Worker # for magic methods that are still MagicProxy objects and 806*cda5da8dSAndroid Build Coastguard Worker # not set on the instance itself 807*cda5da8dSAndroid Build Coastguard Worker return 808*cda5da8dSAndroid Build Coastguard Worker 809*cda5da8dSAndroid Build Coastguard Worker obj = self._mock_children.get(name, _missing) 810*cda5da8dSAndroid Build Coastguard Worker if name in self.__dict__: 811*cda5da8dSAndroid Build Coastguard Worker _safe_super(NonCallableMock, self).__delattr__(name) 812*cda5da8dSAndroid Build Coastguard Worker elif obj is _deleted: 813*cda5da8dSAndroid Build Coastguard Worker raise AttributeError(name) 814*cda5da8dSAndroid Build Coastguard Worker if obj is not _missing: 815*cda5da8dSAndroid Build Coastguard Worker del self._mock_children[name] 816*cda5da8dSAndroid Build Coastguard Worker self._mock_children[name] = _deleted 817*cda5da8dSAndroid Build Coastguard Worker 818*cda5da8dSAndroid Build Coastguard Worker 819*cda5da8dSAndroid Build Coastguard Worker def _format_mock_call_signature(self, args, kwargs): 820*cda5da8dSAndroid Build Coastguard Worker name = self._mock_name or 'mock' 821*cda5da8dSAndroid Build Coastguard Worker return _format_call_signature(name, args, kwargs) 822*cda5da8dSAndroid Build Coastguard Worker 823*cda5da8dSAndroid Build Coastguard Worker 824*cda5da8dSAndroid Build Coastguard Worker def _format_mock_failure_message(self, args, kwargs, action='call'): 825*cda5da8dSAndroid Build Coastguard Worker message = 'expected %s not found.\nExpected: %s\nActual: %s' 826*cda5da8dSAndroid Build Coastguard Worker expected_string = self._format_mock_call_signature(args, kwargs) 827*cda5da8dSAndroid Build Coastguard Worker call_args = self.call_args 828*cda5da8dSAndroid Build Coastguard Worker actual_string = self._format_mock_call_signature(*call_args) 829*cda5da8dSAndroid Build Coastguard Worker return message % (action, expected_string, actual_string) 830*cda5da8dSAndroid Build Coastguard Worker 831*cda5da8dSAndroid Build Coastguard Worker 832*cda5da8dSAndroid Build Coastguard Worker def _get_call_signature_from_name(self, name): 833*cda5da8dSAndroid Build Coastguard Worker """ 834*cda5da8dSAndroid Build Coastguard Worker * If call objects are asserted against a method/function like obj.meth1 835*cda5da8dSAndroid Build Coastguard Worker then there could be no name for the call object to lookup. Hence just 836*cda5da8dSAndroid Build Coastguard Worker return the spec_signature of the method/function being asserted against. 837*cda5da8dSAndroid Build Coastguard Worker * If the name is not empty then remove () and split by '.' to get 838*cda5da8dSAndroid Build Coastguard Worker list of names to iterate through the children until a potential 839*cda5da8dSAndroid Build Coastguard Worker match is found. A child mock is created only during attribute access 840*cda5da8dSAndroid Build Coastguard Worker so if we get a _SpecState then no attributes of the spec were accessed 841*cda5da8dSAndroid Build Coastguard Worker and can be safely exited. 842*cda5da8dSAndroid Build Coastguard Worker """ 843*cda5da8dSAndroid Build Coastguard Worker if not name: 844*cda5da8dSAndroid Build Coastguard Worker return self._spec_signature 845*cda5da8dSAndroid Build Coastguard Worker 846*cda5da8dSAndroid Build Coastguard Worker sig = None 847*cda5da8dSAndroid Build Coastguard Worker names = name.replace('()', '').split('.') 848*cda5da8dSAndroid Build Coastguard Worker children = self._mock_children 849*cda5da8dSAndroid Build Coastguard Worker 850*cda5da8dSAndroid Build Coastguard Worker for name in names: 851*cda5da8dSAndroid Build Coastguard Worker child = children.get(name) 852*cda5da8dSAndroid Build Coastguard Worker if child is None or isinstance(child, _SpecState): 853*cda5da8dSAndroid Build Coastguard Worker break 854*cda5da8dSAndroid Build Coastguard Worker else: 855*cda5da8dSAndroid Build Coastguard Worker # If an autospecced object is attached using attach_mock the 856*cda5da8dSAndroid Build Coastguard Worker # child would be a function with mock object as attribute from 857*cda5da8dSAndroid Build Coastguard Worker # which signature has to be derived. 858*cda5da8dSAndroid Build Coastguard Worker child = _extract_mock(child) 859*cda5da8dSAndroid Build Coastguard Worker children = child._mock_children 860*cda5da8dSAndroid Build Coastguard Worker sig = child._spec_signature 861*cda5da8dSAndroid Build Coastguard Worker 862*cda5da8dSAndroid Build Coastguard Worker return sig 863*cda5da8dSAndroid Build Coastguard Worker 864*cda5da8dSAndroid Build Coastguard Worker 865*cda5da8dSAndroid Build Coastguard Worker def _call_matcher(self, _call): 866*cda5da8dSAndroid Build Coastguard Worker """ 867*cda5da8dSAndroid Build Coastguard Worker Given a call (or simply an (args, kwargs) tuple), return a 868*cda5da8dSAndroid Build Coastguard Worker comparison key suitable for matching with other calls. 869*cda5da8dSAndroid Build Coastguard Worker This is a best effort method which relies on the spec's signature, 870*cda5da8dSAndroid Build Coastguard Worker if available, or falls back on the arguments themselves. 871*cda5da8dSAndroid Build Coastguard Worker """ 872*cda5da8dSAndroid Build Coastguard Worker 873*cda5da8dSAndroid Build Coastguard Worker if isinstance(_call, tuple) and len(_call) > 2: 874*cda5da8dSAndroid Build Coastguard Worker sig = self._get_call_signature_from_name(_call[0]) 875*cda5da8dSAndroid Build Coastguard Worker else: 876*cda5da8dSAndroid Build Coastguard Worker sig = self._spec_signature 877*cda5da8dSAndroid Build Coastguard Worker 878*cda5da8dSAndroid Build Coastguard Worker if sig is not None: 879*cda5da8dSAndroid Build Coastguard Worker if len(_call) == 2: 880*cda5da8dSAndroid Build Coastguard Worker name = '' 881*cda5da8dSAndroid Build Coastguard Worker args, kwargs = _call 882*cda5da8dSAndroid Build Coastguard Worker else: 883*cda5da8dSAndroid Build Coastguard Worker name, args, kwargs = _call 884*cda5da8dSAndroid Build Coastguard Worker try: 885*cda5da8dSAndroid Build Coastguard Worker bound_call = sig.bind(*args, **kwargs) 886*cda5da8dSAndroid Build Coastguard Worker return call(name, bound_call.args, bound_call.kwargs) 887*cda5da8dSAndroid Build Coastguard Worker except TypeError as e: 888*cda5da8dSAndroid Build Coastguard Worker return e.with_traceback(None) 889*cda5da8dSAndroid Build Coastguard Worker else: 890*cda5da8dSAndroid Build Coastguard Worker return _call 891*cda5da8dSAndroid Build Coastguard Worker 892*cda5da8dSAndroid Build Coastguard Worker def assert_not_called(self): 893*cda5da8dSAndroid Build Coastguard Worker """assert that the mock was never called. 894*cda5da8dSAndroid Build Coastguard Worker """ 895*cda5da8dSAndroid Build Coastguard Worker if self.call_count != 0: 896*cda5da8dSAndroid Build Coastguard Worker msg = ("Expected '%s' to not have been called. Called %s times.%s" 897*cda5da8dSAndroid Build Coastguard Worker % (self._mock_name or 'mock', 898*cda5da8dSAndroid Build Coastguard Worker self.call_count, 899*cda5da8dSAndroid Build Coastguard Worker self._calls_repr())) 900*cda5da8dSAndroid Build Coastguard Worker raise AssertionError(msg) 901*cda5da8dSAndroid Build Coastguard Worker 902*cda5da8dSAndroid Build Coastguard Worker def assert_called(self): 903*cda5da8dSAndroid Build Coastguard Worker """assert that the mock was called at least once 904*cda5da8dSAndroid Build Coastguard Worker """ 905*cda5da8dSAndroid Build Coastguard Worker if self.call_count == 0: 906*cda5da8dSAndroid Build Coastguard Worker msg = ("Expected '%s' to have been called." % 907*cda5da8dSAndroid Build Coastguard Worker (self._mock_name or 'mock')) 908*cda5da8dSAndroid Build Coastguard Worker raise AssertionError(msg) 909*cda5da8dSAndroid Build Coastguard Worker 910*cda5da8dSAndroid Build Coastguard Worker def assert_called_once(self): 911*cda5da8dSAndroid Build Coastguard Worker """assert that the mock was called only once. 912*cda5da8dSAndroid Build Coastguard Worker """ 913*cda5da8dSAndroid Build Coastguard Worker if not self.call_count == 1: 914*cda5da8dSAndroid Build Coastguard Worker msg = ("Expected '%s' to have been called once. Called %s times.%s" 915*cda5da8dSAndroid Build Coastguard Worker % (self._mock_name or 'mock', 916*cda5da8dSAndroid Build Coastguard Worker self.call_count, 917*cda5da8dSAndroid Build Coastguard Worker self._calls_repr())) 918*cda5da8dSAndroid Build Coastguard Worker raise AssertionError(msg) 919*cda5da8dSAndroid Build Coastguard Worker 920*cda5da8dSAndroid Build Coastguard Worker def assert_called_with(self, /, *args, **kwargs): 921*cda5da8dSAndroid Build Coastguard Worker """assert that the last call was made with the specified arguments. 922*cda5da8dSAndroid Build Coastguard Worker 923*cda5da8dSAndroid Build Coastguard Worker Raises an AssertionError if the args and keyword args passed in are 924*cda5da8dSAndroid Build Coastguard Worker different to the last call to the mock.""" 925*cda5da8dSAndroid Build Coastguard Worker if self.call_args is None: 926*cda5da8dSAndroid Build Coastguard Worker expected = self._format_mock_call_signature(args, kwargs) 927*cda5da8dSAndroid Build Coastguard Worker actual = 'not called.' 928*cda5da8dSAndroid Build Coastguard Worker error_message = ('expected call not found.\nExpected: %s\nActual: %s' 929*cda5da8dSAndroid Build Coastguard Worker % (expected, actual)) 930*cda5da8dSAndroid Build Coastguard Worker raise AssertionError(error_message) 931*cda5da8dSAndroid Build Coastguard Worker 932*cda5da8dSAndroid Build Coastguard Worker def _error_message(): 933*cda5da8dSAndroid Build Coastguard Worker msg = self._format_mock_failure_message(args, kwargs) 934*cda5da8dSAndroid Build Coastguard Worker return msg 935*cda5da8dSAndroid Build Coastguard Worker expected = self._call_matcher(_Call((args, kwargs), two=True)) 936*cda5da8dSAndroid Build Coastguard Worker actual = self._call_matcher(self.call_args) 937*cda5da8dSAndroid Build Coastguard Worker if actual != expected: 938*cda5da8dSAndroid Build Coastguard Worker cause = expected if isinstance(expected, Exception) else None 939*cda5da8dSAndroid Build Coastguard Worker raise AssertionError(_error_message()) from cause 940*cda5da8dSAndroid Build Coastguard Worker 941*cda5da8dSAndroid Build Coastguard Worker 942*cda5da8dSAndroid Build Coastguard Worker def assert_called_once_with(self, /, *args, **kwargs): 943*cda5da8dSAndroid Build Coastguard Worker """assert that the mock was called exactly once and that that call was 944*cda5da8dSAndroid Build Coastguard Worker with the specified arguments.""" 945*cda5da8dSAndroid Build Coastguard Worker if not self.call_count == 1: 946*cda5da8dSAndroid Build Coastguard Worker msg = ("Expected '%s' to be called once. Called %s times.%s" 947*cda5da8dSAndroid Build Coastguard Worker % (self._mock_name or 'mock', 948*cda5da8dSAndroid Build Coastguard Worker self.call_count, 949*cda5da8dSAndroid Build Coastguard Worker self._calls_repr())) 950*cda5da8dSAndroid Build Coastguard Worker raise AssertionError(msg) 951*cda5da8dSAndroid Build Coastguard Worker return self.assert_called_with(*args, **kwargs) 952*cda5da8dSAndroid Build Coastguard Worker 953*cda5da8dSAndroid Build Coastguard Worker 954*cda5da8dSAndroid Build Coastguard Worker def assert_has_calls(self, calls, any_order=False): 955*cda5da8dSAndroid Build Coastguard Worker """assert the mock has been called with the specified calls. 956*cda5da8dSAndroid Build Coastguard Worker The `mock_calls` list is checked for the calls. 957*cda5da8dSAndroid Build Coastguard Worker 958*cda5da8dSAndroid Build Coastguard Worker If `any_order` is False (the default) then the calls must be 959*cda5da8dSAndroid Build Coastguard Worker sequential. There can be extra calls before or after the 960*cda5da8dSAndroid Build Coastguard Worker specified calls. 961*cda5da8dSAndroid Build Coastguard Worker 962*cda5da8dSAndroid Build Coastguard Worker If `any_order` is True then the calls can be in any order, but 963*cda5da8dSAndroid Build Coastguard Worker they must all appear in `mock_calls`.""" 964*cda5da8dSAndroid Build Coastguard Worker expected = [self._call_matcher(c) for c in calls] 965*cda5da8dSAndroid Build Coastguard Worker cause = next((e for e in expected if isinstance(e, Exception)), None) 966*cda5da8dSAndroid Build Coastguard Worker all_calls = _CallList(self._call_matcher(c) for c in self.mock_calls) 967*cda5da8dSAndroid Build Coastguard Worker if not any_order: 968*cda5da8dSAndroid Build Coastguard Worker if expected not in all_calls: 969*cda5da8dSAndroid Build Coastguard Worker if cause is None: 970*cda5da8dSAndroid Build Coastguard Worker problem = 'Calls not found.' 971*cda5da8dSAndroid Build Coastguard Worker else: 972*cda5da8dSAndroid Build Coastguard Worker problem = ('Error processing expected calls.\n' 973*cda5da8dSAndroid Build Coastguard Worker 'Errors: {}').format( 974*cda5da8dSAndroid Build Coastguard Worker [e if isinstance(e, Exception) else None 975*cda5da8dSAndroid Build Coastguard Worker for e in expected]) 976*cda5da8dSAndroid Build Coastguard Worker raise AssertionError( 977*cda5da8dSAndroid Build Coastguard Worker f'{problem}\n' 978*cda5da8dSAndroid Build Coastguard Worker f'Expected: {_CallList(calls)}' 979*cda5da8dSAndroid Build Coastguard Worker f'{self._calls_repr(prefix="Actual").rstrip(".")}' 980*cda5da8dSAndroid Build Coastguard Worker ) from cause 981*cda5da8dSAndroid Build Coastguard Worker return 982*cda5da8dSAndroid Build Coastguard Worker 983*cda5da8dSAndroid Build Coastguard Worker all_calls = list(all_calls) 984*cda5da8dSAndroid Build Coastguard Worker 985*cda5da8dSAndroid Build Coastguard Worker not_found = [] 986*cda5da8dSAndroid Build Coastguard Worker for kall in expected: 987*cda5da8dSAndroid Build Coastguard Worker try: 988*cda5da8dSAndroid Build Coastguard Worker all_calls.remove(kall) 989*cda5da8dSAndroid Build Coastguard Worker except ValueError: 990*cda5da8dSAndroid Build Coastguard Worker not_found.append(kall) 991*cda5da8dSAndroid Build Coastguard Worker if not_found: 992*cda5da8dSAndroid Build Coastguard Worker raise AssertionError( 993*cda5da8dSAndroid Build Coastguard Worker '%r does not contain all of %r in its call list, ' 994*cda5da8dSAndroid Build Coastguard Worker 'found %r instead' % (self._mock_name or 'mock', 995*cda5da8dSAndroid Build Coastguard Worker tuple(not_found), all_calls) 996*cda5da8dSAndroid Build Coastguard Worker ) from cause 997*cda5da8dSAndroid Build Coastguard Worker 998*cda5da8dSAndroid Build Coastguard Worker 999*cda5da8dSAndroid Build Coastguard Worker def assert_any_call(self, /, *args, **kwargs): 1000*cda5da8dSAndroid Build Coastguard Worker """assert the mock has been called with the specified arguments. 1001*cda5da8dSAndroid Build Coastguard Worker 1002*cda5da8dSAndroid Build Coastguard Worker The assert passes if the mock has *ever* been called, unlike 1003*cda5da8dSAndroid Build Coastguard Worker `assert_called_with` and `assert_called_once_with` that only pass if 1004*cda5da8dSAndroid Build Coastguard Worker the call is the most recent one.""" 1005*cda5da8dSAndroid Build Coastguard Worker expected = self._call_matcher(_Call((args, kwargs), two=True)) 1006*cda5da8dSAndroid Build Coastguard Worker cause = expected if isinstance(expected, Exception) else None 1007*cda5da8dSAndroid Build Coastguard Worker actual = [self._call_matcher(c) for c in self.call_args_list] 1008*cda5da8dSAndroid Build Coastguard Worker if cause or expected not in _AnyComparer(actual): 1009*cda5da8dSAndroid Build Coastguard Worker expected_string = self._format_mock_call_signature(args, kwargs) 1010*cda5da8dSAndroid Build Coastguard Worker raise AssertionError( 1011*cda5da8dSAndroid Build Coastguard Worker '%s call not found' % expected_string 1012*cda5da8dSAndroid Build Coastguard Worker ) from cause 1013*cda5da8dSAndroid Build Coastguard Worker 1014*cda5da8dSAndroid Build Coastguard Worker 1015*cda5da8dSAndroid Build Coastguard Worker def _get_child_mock(self, /, **kw): 1016*cda5da8dSAndroid Build Coastguard Worker """Create the child mocks for attributes and return value. 1017*cda5da8dSAndroid Build Coastguard Worker By default child mocks will be the same type as the parent. 1018*cda5da8dSAndroid Build Coastguard Worker Subclasses of Mock may want to override this to customize the way 1019*cda5da8dSAndroid Build Coastguard Worker child mocks are made. 1020*cda5da8dSAndroid Build Coastguard Worker 1021*cda5da8dSAndroid Build Coastguard Worker For non-callable mocks the callable variant will be used (rather than 1022*cda5da8dSAndroid Build Coastguard Worker any custom subclass).""" 1023*cda5da8dSAndroid Build Coastguard Worker if self._mock_sealed: 1024*cda5da8dSAndroid Build Coastguard Worker attribute = f".{kw['name']}" if "name" in kw else "()" 1025*cda5da8dSAndroid Build Coastguard Worker mock_name = self._extract_mock_name() + attribute 1026*cda5da8dSAndroid Build Coastguard Worker raise AttributeError(mock_name) 1027*cda5da8dSAndroid Build Coastguard Worker 1028*cda5da8dSAndroid Build Coastguard Worker _new_name = kw.get("_new_name") 1029*cda5da8dSAndroid Build Coastguard Worker if _new_name in self.__dict__['_spec_asyncs']: 1030*cda5da8dSAndroid Build Coastguard Worker return AsyncMock(**kw) 1031*cda5da8dSAndroid Build Coastguard Worker 1032*cda5da8dSAndroid Build Coastguard Worker _type = type(self) 1033*cda5da8dSAndroid Build Coastguard Worker if issubclass(_type, MagicMock) and _new_name in _async_method_magics: 1034*cda5da8dSAndroid Build Coastguard Worker # Any asynchronous magic becomes an AsyncMock 1035*cda5da8dSAndroid Build Coastguard Worker klass = AsyncMock 1036*cda5da8dSAndroid Build Coastguard Worker elif issubclass(_type, AsyncMockMixin): 1037*cda5da8dSAndroid Build Coastguard Worker if (_new_name in _all_sync_magics or 1038*cda5da8dSAndroid Build Coastguard Worker self._mock_methods and _new_name in self._mock_methods): 1039*cda5da8dSAndroid Build Coastguard Worker # Any synchronous method on AsyncMock becomes a MagicMock 1040*cda5da8dSAndroid Build Coastguard Worker klass = MagicMock 1041*cda5da8dSAndroid Build Coastguard Worker else: 1042*cda5da8dSAndroid Build Coastguard Worker klass = AsyncMock 1043*cda5da8dSAndroid Build Coastguard Worker elif not issubclass(_type, CallableMixin): 1044*cda5da8dSAndroid Build Coastguard Worker if issubclass(_type, NonCallableMagicMock): 1045*cda5da8dSAndroid Build Coastguard Worker klass = MagicMock 1046*cda5da8dSAndroid Build Coastguard Worker elif issubclass(_type, NonCallableMock): 1047*cda5da8dSAndroid Build Coastguard Worker klass = Mock 1048*cda5da8dSAndroid Build Coastguard Worker else: 1049*cda5da8dSAndroid Build Coastguard Worker klass = _type.__mro__[1] 1050*cda5da8dSAndroid Build Coastguard Worker return klass(**kw) 1051*cda5da8dSAndroid Build Coastguard Worker 1052*cda5da8dSAndroid Build Coastguard Worker 1053*cda5da8dSAndroid Build Coastguard Worker def _calls_repr(self, prefix="Calls"): 1054*cda5da8dSAndroid Build Coastguard Worker """Renders self.mock_calls as a string. 1055*cda5da8dSAndroid Build Coastguard Worker 1056*cda5da8dSAndroid Build Coastguard Worker Example: "\nCalls: [call(1), call(2)]." 1057*cda5da8dSAndroid Build Coastguard Worker 1058*cda5da8dSAndroid Build Coastguard Worker If self.mock_calls is empty, an empty string is returned. The 1059*cda5da8dSAndroid Build Coastguard Worker output will be truncated if very long. 1060*cda5da8dSAndroid Build Coastguard Worker """ 1061*cda5da8dSAndroid Build Coastguard Worker if not self.mock_calls: 1062*cda5da8dSAndroid Build Coastguard Worker return "" 1063*cda5da8dSAndroid Build Coastguard Worker return f"\n{prefix}: {safe_repr(self.mock_calls)}." 1064*cda5da8dSAndroid Build Coastguard Worker 1065*cda5da8dSAndroid Build Coastguard Worker 1066*cda5da8dSAndroid Build Coastguard Worker_MOCK_SIG = inspect.signature(NonCallableMock.__init__) 1067*cda5da8dSAndroid Build Coastguard Worker 1068*cda5da8dSAndroid Build Coastguard Worker 1069*cda5da8dSAndroid Build Coastguard Workerclass _AnyComparer(list): 1070*cda5da8dSAndroid Build Coastguard Worker """A list which checks if it contains a call which may have an 1071*cda5da8dSAndroid Build Coastguard Worker argument of ANY, flipping the components of item and self from 1072*cda5da8dSAndroid Build Coastguard Worker their traditional locations so that ANY is guaranteed to be on 1073*cda5da8dSAndroid Build Coastguard Worker the left.""" 1074*cda5da8dSAndroid Build Coastguard Worker def __contains__(self, item): 1075*cda5da8dSAndroid Build Coastguard Worker for _call in self: 1076*cda5da8dSAndroid Build Coastguard Worker assert len(item) == len(_call) 1077*cda5da8dSAndroid Build Coastguard Worker if all([ 1078*cda5da8dSAndroid Build Coastguard Worker expected == actual 1079*cda5da8dSAndroid Build Coastguard Worker for expected, actual in zip(item, _call) 1080*cda5da8dSAndroid Build Coastguard Worker ]): 1081*cda5da8dSAndroid Build Coastguard Worker return True 1082*cda5da8dSAndroid Build Coastguard Worker return False 1083*cda5da8dSAndroid Build Coastguard Worker 1084*cda5da8dSAndroid Build Coastguard Worker 1085*cda5da8dSAndroid Build Coastguard Workerdef _try_iter(obj): 1086*cda5da8dSAndroid Build Coastguard Worker if obj is None: 1087*cda5da8dSAndroid Build Coastguard Worker return obj 1088*cda5da8dSAndroid Build Coastguard Worker if _is_exception(obj): 1089*cda5da8dSAndroid Build Coastguard Worker return obj 1090*cda5da8dSAndroid Build Coastguard Worker if _callable(obj): 1091*cda5da8dSAndroid Build Coastguard Worker return obj 1092*cda5da8dSAndroid Build Coastguard Worker try: 1093*cda5da8dSAndroid Build Coastguard Worker return iter(obj) 1094*cda5da8dSAndroid Build Coastguard Worker except TypeError: 1095*cda5da8dSAndroid Build Coastguard Worker # XXXX backwards compatibility 1096*cda5da8dSAndroid Build Coastguard Worker # but this will blow up on first call - so maybe we should fail early? 1097*cda5da8dSAndroid Build Coastguard Worker return obj 1098*cda5da8dSAndroid Build Coastguard Worker 1099*cda5da8dSAndroid Build Coastguard Worker 1100*cda5da8dSAndroid Build Coastguard Workerclass CallableMixin(Base): 1101*cda5da8dSAndroid Build Coastguard Worker 1102*cda5da8dSAndroid Build Coastguard Worker def __init__(self, spec=None, side_effect=None, return_value=DEFAULT, 1103*cda5da8dSAndroid Build Coastguard Worker wraps=None, name=None, spec_set=None, parent=None, 1104*cda5da8dSAndroid Build Coastguard Worker _spec_state=None, _new_name='', _new_parent=None, **kwargs): 1105*cda5da8dSAndroid Build Coastguard Worker self.__dict__['_mock_return_value'] = return_value 1106*cda5da8dSAndroid Build Coastguard Worker _safe_super(CallableMixin, self).__init__( 1107*cda5da8dSAndroid Build Coastguard Worker spec, wraps, name, spec_set, parent, 1108*cda5da8dSAndroid Build Coastguard Worker _spec_state, _new_name, _new_parent, **kwargs 1109*cda5da8dSAndroid Build Coastguard Worker ) 1110*cda5da8dSAndroid Build Coastguard Worker 1111*cda5da8dSAndroid Build Coastguard Worker self.side_effect = side_effect 1112*cda5da8dSAndroid Build Coastguard Worker 1113*cda5da8dSAndroid Build Coastguard Worker 1114*cda5da8dSAndroid Build Coastguard Worker def _mock_check_sig(self, /, *args, **kwargs): 1115*cda5da8dSAndroid Build Coastguard Worker # stub method that can be replaced with one with a specific signature 1116*cda5da8dSAndroid Build Coastguard Worker pass 1117*cda5da8dSAndroid Build Coastguard Worker 1118*cda5da8dSAndroid Build Coastguard Worker 1119*cda5da8dSAndroid Build Coastguard Worker def __call__(self, /, *args, **kwargs): 1120*cda5da8dSAndroid Build Coastguard Worker # can't use self in-case a function / method we are mocking uses self 1121*cda5da8dSAndroid Build Coastguard Worker # in the signature 1122*cda5da8dSAndroid Build Coastguard Worker self._mock_check_sig(*args, **kwargs) 1123*cda5da8dSAndroid Build Coastguard Worker self._increment_mock_call(*args, **kwargs) 1124*cda5da8dSAndroid Build Coastguard Worker return self._mock_call(*args, **kwargs) 1125*cda5da8dSAndroid Build Coastguard Worker 1126*cda5da8dSAndroid Build Coastguard Worker 1127*cda5da8dSAndroid Build Coastguard Worker def _mock_call(self, /, *args, **kwargs): 1128*cda5da8dSAndroid Build Coastguard Worker return self._execute_mock_call(*args, **kwargs) 1129*cda5da8dSAndroid Build Coastguard Worker 1130*cda5da8dSAndroid Build Coastguard Worker def _increment_mock_call(self, /, *args, **kwargs): 1131*cda5da8dSAndroid Build Coastguard Worker self.called = True 1132*cda5da8dSAndroid Build Coastguard Worker self.call_count += 1 1133*cda5da8dSAndroid Build Coastguard Worker 1134*cda5da8dSAndroid Build Coastguard Worker # handle call_args 1135*cda5da8dSAndroid Build Coastguard Worker # needs to be set here so assertions on call arguments pass before 1136*cda5da8dSAndroid Build Coastguard Worker # execution in the case of awaited calls 1137*cda5da8dSAndroid Build Coastguard Worker _call = _Call((args, kwargs), two=True) 1138*cda5da8dSAndroid Build Coastguard Worker self.call_args = _call 1139*cda5da8dSAndroid Build Coastguard Worker self.call_args_list.append(_call) 1140*cda5da8dSAndroid Build Coastguard Worker 1141*cda5da8dSAndroid Build Coastguard Worker # initial stuff for method_calls: 1142*cda5da8dSAndroid Build Coastguard Worker do_method_calls = self._mock_parent is not None 1143*cda5da8dSAndroid Build Coastguard Worker method_call_name = self._mock_name 1144*cda5da8dSAndroid Build Coastguard Worker 1145*cda5da8dSAndroid Build Coastguard Worker # initial stuff for mock_calls: 1146*cda5da8dSAndroid Build Coastguard Worker mock_call_name = self._mock_new_name 1147*cda5da8dSAndroid Build Coastguard Worker is_a_call = mock_call_name == '()' 1148*cda5da8dSAndroid Build Coastguard Worker self.mock_calls.append(_Call(('', args, kwargs))) 1149*cda5da8dSAndroid Build Coastguard Worker 1150*cda5da8dSAndroid Build Coastguard Worker # follow up the chain of mocks: 1151*cda5da8dSAndroid Build Coastguard Worker _new_parent = self._mock_new_parent 1152*cda5da8dSAndroid Build Coastguard Worker while _new_parent is not None: 1153*cda5da8dSAndroid Build Coastguard Worker 1154*cda5da8dSAndroid Build Coastguard Worker # handle method_calls: 1155*cda5da8dSAndroid Build Coastguard Worker if do_method_calls: 1156*cda5da8dSAndroid Build Coastguard Worker _new_parent.method_calls.append(_Call((method_call_name, args, kwargs))) 1157*cda5da8dSAndroid Build Coastguard Worker do_method_calls = _new_parent._mock_parent is not None 1158*cda5da8dSAndroid Build Coastguard Worker if do_method_calls: 1159*cda5da8dSAndroid Build Coastguard Worker method_call_name = _new_parent._mock_name + '.' + method_call_name 1160*cda5da8dSAndroid Build Coastguard Worker 1161*cda5da8dSAndroid Build Coastguard Worker # handle mock_calls: 1162*cda5da8dSAndroid Build Coastguard Worker this_mock_call = _Call((mock_call_name, args, kwargs)) 1163*cda5da8dSAndroid Build Coastguard Worker _new_parent.mock_calls.append(this_mock_call) 1164*cda5da8dSAndroid Build Coastguard Worker 1165*cda5da8dSAndroid Build Coastguard Worker if _new_parent._mock_new_name: 1166*cda5da8dSAndroid Build Coastguard Worker if is_a_call: 1167*cda5da8dSAndroid Build Coastguard Worker dot = '' 1168*cda5da8dSAndroid Build Coastguard Worker else: 1169*cda5da8dSAndroid Build Coastguard Worker dot = '.' 1170*cda5da8dSAndroid Build Coastguard Worker is_a_call = _new_parent._mock_new_name == '()' 1171*cda5da8dSAndroid Build Coastguard Worker mock_call_name = _new_parent._mock_new_name + dot + mock_call_name 1172*cda5da8dSAndroid Build Coastguard Worker 1173*cda5da8dSAndroid Build Coastguard Worker # follow the parental chain: 1174*cda5da8dSAndroid Build Coastguard Worker _new_parent = _new_parent._mock_new_parent 1175*cda5da8dSAndroid Build Coastguard Worker 1176*cda5da8dSAndroid Build Coastguard Worker def _execute_mock_call(self, /, *args, **kwargs): 1177*cda5da8dSAndroid Build Coastguard Worker # separate from _increment_mock_call so that awaited functions are 1178*cda5da8dSAndroid Build Coastguard Worker # executed separately from their call, also AsyncMock overrides this method 1179*cda5da8dSAndroid Build Coastguard Worker 1180*cda5da8dSAndroid Build Coastguard Worker effect = self.side_effect 1181*cda5da8dSAndroid Build Coastguard Worker if effect is not None: 1182*cda5da8dSAndroid Build Coastguard Worker if _is_exception(effect): 1183*cda5da8dSAndroid Build Coastguard Worker raise effect 1184*cda5da8dSAndroid Build Coastguard Worker elif not _callable(effect): 1185*cda5da8dSAndroid Build Coastguard Worker result = next(effect) 1186*cda5da8dSAndroid Build Coastguard Worker if _is_exception(result): 1187*cda5da8dSAndroid Build Coastguard Worker raise result 1188*cda5da8dSAndroid Build Coastguard Worker else: 1189*cda5da8dSAndroid Build Coastguard Worker result = effect(*args, **kwargs) 1190*cda5da8dSAndroid Build Coastguard Worker 1191*cda5da8dSAndroid Build Coastguard Worker if result is not DEFAULT: 1192*cda5da8dSAndroid Build Coastguard Worker return result 1193*cda5da8dSAndroid Build Coastguard Worker 1194*cda5da8dSAndroid Build Coastguard Worker if self._mock_return_value is not DEFAULT: 1195*cda5da8dSAndroid Build Coastguard Worker return self.return_value 1196*cda5da8dSAndroid Build Coastguard Worker 1197*cda5da8dSAndroid Build Coastguard Worker if self._mock_wraps is not None: 1198*cda5da8dSAndroid Build Coastguard Worker return self._mock_wraps(*args, **kwargs) 1199*cda5da8dSAndroid Build Coastguard Worker 1200*cda5da8dSAndroid Build Coastguard Worker return self.return_value 1201*cda5da8dSAndroid Build Coastguard Worker 1202*cda5da8dSAndroid Build Coastguard Worker 1203*cda5da8dSAndroid Build Coastguard Worker 1204*cda5da8dSAndroid Build Coastguard Workerclass Mock(CallableMixin, NonCallableMock): 1205*cda5da8dSAndroid Build Coastguard Worker """ 1206*cda5da8dSAndroid Build Coastguard Worker Create a new `Mock` object. `Mock` takes several optional arguments 1207*cda5da8dSAndroid Build Coastguard Worker that specify the behaviour of the Mock object: 1208*cda5da8dSAndroid Build Coastguard Worker 1209*cda5da8dSAndroid Build Coastguard Worker * `spec`: This can be either a list of strings or an existing object (a 1210*cda5da8dSAndroid Build Coastguard Worker class or instance) that acts as the specification for the mock object. If 1211*cda5da8dSAndroid Build Coastguard Worker you pass in an object then a list of strings is formed by calling dir on 1212*cda5da8dSAndroid Build Coastguard Worker the object (excluding unsupported magic attributes and methods). Accessing 1213*cda5da8dSAndroid Build Coastguard Worker any attribute not in this list will raise an `AttributeError`. 1214*cda5da8dSAndroid Build Coastguard Worker 1215*cda5da8dSAndroid Build Coastguard Worker If `spec` is an object (rather than a list of strings) then 1216*cda5da8dSAndroid Build Coastguard Worker `mock.__class__` returns the class of the spec object. This allows mocks 1217*cda5da8dSAndroid Build Coastguard Worker to pass `isinstance` tests. 1218*cda5da8dSAndroid Build Coastguard Worker 1219*cda5da8dSAndroid Build Coastguard Worker * `spec_set`: A stricter variant of `spec`. If used, attempting to *set* 1220*cda5da8dSAndroid Build Coastguard Worker or get an attribute on the mock that isn't on the object passed as 1221*cda5da8dSAndroid Build Coastguard Worker `spec_set` will raise an `AttributeError`. 1222*cda5da8dSAndroid Build Coastguard Worker 1223*cda5da8dSAndroid Build Coastguard Worker * `side_effect`: A function to be called whenever the Mock is called. See 1224*cda5da8dSAndroid Build Coastguard Worker the `side_effect` attribute. Useful for raising exceptions or 1225*cda5da8dSAndroid Build Coastguard Worker dynamically changing return values. The function is called with the same 1226*cda5da8dSAndroid Build Coastguard Worker arguments as the mock, and unless it returns `DEFAULT`, the return 1227*cda5da8dSAndroid Build Coastguard Worker value of this function is used as the return value. 1228*cda5da8dSAndroid Build Coastguard Worker 1229*cda5da8dSAndroid Build Coastguard Worker If `side_effect` is an iterable then each call to the mock will return 1230*cda5da8dSAndroid Build Coastguard Worker the next value from the iterable. If any of the members of the iterable 1231*cda5da8dSAndroid Build Coastguard Worker are exceptions they will be raised instead of returned. 1232*cda5da8dSAndroid Build Coastguard Worker 1233*cda5da8dSAndroid Build Coastguard Worker * `return_value`: The value returned when the mock is called. By default 1234*cda5da8dSAndroid Build Coastguard Worker this is a new Mock (created on first access). See the 1235*cda5da8dSAndroid Build Coastguard Worker `return_value` attribute. 1236*cda5da8dSAndroid Build Coastguard Worker 1237*cda5da8dSAndroid Build Coastguard Worker * `unsafe`: By default, accessing any attribute whose name starts with 1238*cda5da8dSAndroid Build Coastguard Worker *assert*, *assret*, *asert*, *aseert* or *assrt* will raise an 1239*cda5da8dSAndroid Build Coastguard Worker AttributeError. Passing `unsafe=True` will allow access to 1240*cda5da8dSAndroid Build Coastguard Worker these attributes. 1241*cda5da8dSAndroid Build Coastguard Worker 1242*cda5da8dSAndroid Build Coastguard Worker * `wraps`: Item for the mock object to wrap. If `wraps` is not None then 1243*cda5da8dSAndroid Build Coastguard Worker calling the Mock will pass the call through to the wrapped object 1244*cda5da8dSAndroid Build Coastguard Worker (returning the real result). Attribute access on the mock will return a 1245*cda5da8dSAndroid Build Coastguard Worker Mock object that wraps the corresponding attribute of the wrapped object 1246*cda5da8dSAndroid Build Coastguard Worker (so attempting to access an attribute that doesn't exist will raise an 1247*cda5da8dSAndroid Build Coastguard Worker `AttributeError`). 1248*cda5da8dSAndroid Build Coastguard Worker 1249*cda5da8dSAndroid Build Coastguard Worker If the mock has an explicit `return_value` set then calls are not passed 1250*cda5da8dSAndroid Build Coastguard Worker to the wrapped object and the `return_value` is returned instead. 1251*cda5da8dSAndroid Build Coastguard Worker 1252*cda5da8dSAndroid Build Coastguard Worker * `name`: If the mock has a name then it will be used in the repr of the 1253*cda5da8dSAndroid Build Coastguard Worker mock. This can be useful for debugging. The name is propagated to child 1254*cda5da8dSAndroid Build Coastguard Worker mocks. 1255*cda5da8dSAndroid Build Coastguard Worker 1256*cda5da8dSAndroid Build Coastguard Worker Mocks can also be called with arbitrary keyword arguments. These will be 1257*cda5da8dSAndroid Build Coastguard Worker used to set attributes on the mock after it is created. 1258*cda5da8dSAndroid Build Coastguard Worker """ 1259*cda5da8dSAndroid Build Coastguard Worker 1260*cda5da8dSAndroid Build Coastguard Worker 1261*cda5da8dSAndroid Build Coastguard Worker# _check_spec_arg_typos takes kwargs from commands like patch and checks that 1262*cda5da8dSAndroid Build Coastguard Worker# they don't contain common misspellings of arguments related to autospeccing. 1263*cda5da8dSAndroid Build Coastguard Workerdef _check_spec_arg_typos(kwargs_to_check): 1264*cda5da8dSAndroid Build Coastguard Worker typos = ("autospect", "auto_spec", "set_spec") 1265*cda5da8dSAndroid Build Coastguard Worker for typo in typos: 1266*cda5da8dSAndroid Build Coastguard Worker if typo in kwargs_to_check: 1267*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError( 1268*cda5da8dSAndroid Build Coastguard Worker f"{typo!r} might be a typo; use unsafe=True if this is intended" 1269*cda5da8dSAndroid Build Coastguard Worker ) 1270*cda5da8dSAndroid Build Coastguard Worker 1271*cda5da8dSAndroid Build Coastguard Worker 1272*cda5da8dSAndroid Build Coastguard Workerclass _patch(object): 1273*cda5da8dSAndroid Build Coastguard Worker 1274*cda5da8dSAndroid Build Coastguard Worker attribute_name = None 1275*cda5da8dSAndroid Build Coastguard Worker _active_patches = [] 1276*cda5da8dSAndroid Build Coastguard Worker 1277*cda5da8dSAndroid Build Coastguard Worker def __init__( 1278*cda5da8dSAndroid Build Coastguard Worker self, getter, attribute, new, spec, create, 1279*cda5da8dSAndroid Build Coastguard Worker spec_set, autospec, new_callable, kwargs, *, unsafe=False 1280*cda5da8dSAndroid Build Coastguard Worker ): 1281*cda5da8dSAndroid Build Coastguard Worker if new_callable is not None: 1282*cda5da8dSAndroid Build Coastguard Worker if new is not DEFAULT: 1283*cda5da8dSAndroid Build Coastguard Worker raise ValueError( 1284*cda5da8dSAndroid Build Coastguard Worker "Cannot use 'new' and 'new_callable' together" 1285*cda5da8dSAndroid Build Coastguard Worker ) 1286*cda5da8dSAndroid Build Coastguard Worker if autospec is not None: 1287*cda5da8dSAndroid Build Coastguard Worker raise ValueError( 1288*cda5da8dSAndroid Build Coastguard Worker "Cannot use 'autospec' and 'new_callable' together" 1289*cda5da8dSAndroid Build Coastguard Worker ) 1290*cda5da8dSAndroid Build Coastguard Worker if not unsafe: 1291*cda5da8dSAndroid Build Coastguard Worker _check_spec_arg_typos(kwargs) 1292*cda5da8dSAndroid Build Coastguard Worker if _is_instance_mock(spec): 1293*cda5da8dSAndroid Build Coastguard Worker raise InvalidSpecError( 1294*cda5da8dSAndroid Build Coastguard Worker f'Cannot spec attr {attribute!r} as the spec ' 1295*cda5da8dSAndroid Build Coastguard Worker f'has already been mocked out. [spec={spec!r}]') 1296*cda5da8dSAndroid Build Coastguard Worker if _is_instance_mock(spec_set): 1297*cda5da8dSAndroid Build Coastguard Worker raise InvalidSpecError( 1298*cda5da8dSAndroid Build Coastguard Worker f'Cannot spec attr {attribute!r} as the spec_set ' 1299*cda5da8dSAndroid Build Coastguard Worker f'target has already been mocked out. [spec_set={spec_set!r}]') 1300*cda5da8dSAndroid Build Coastguard Worker 1301*cda5da8dSAndroid Build Coastguard Worker self.getter = getter 1302*cda5da8dSAndroid Build Coastguard Worker self.attribute = attribute 1303*cda5da8dSAndroid Build Coastguard Worker self.new = new 1304*cda5da8dSAndroid Build Coastguard Worker self.new_callable = new_callable 1305*cda5da8dSAndroid Build Coastguard Worker self.spec = spec 1306*cda5da8dSAndroid Build Coastguard Worker self.create = create 1307*cda5da8dSAndroid Build Coastguard Worker self.has_local = False 1308*cda5da8dSAndroid Build Coastguard Worker self.spec_set = spec_set 1309*cda5da8dSAndroid Build Coastguard Worker self.autospec = autospec 1310*cda5da8dSAndroid Build Coastguard Worker self.kwargs = kwargs 1311*cda5da8dSAndroid Build Coastguard Worker self.additional_patchers = [] 1312*cda5da8dSAndroid Build Coastguard Worker 1313*cda5da8dSAndroid Build Coastguard Worker 1314*cda5da8dSAndroid Build Coastguard Worker def copy(self): 1315*cda5da8dSAndroid Build Coastguard Worker patcher = _patch( 1316*cda5da8dSAndroid Build Coastguard Worker self.getter, self.attribute, self.new, self.spec, 1317*cda5da8dSAndroid Build Coastguard Worker self.create, self.spec_set, 1318*cda5da8dSAndroid Build Coastguard Worker self.autospec, self.new_callable, self.kwargs 1319*cda5da8dSAndroid Build Coastguard Worker ) 1320*cda5da8dSAndroid Build Coastguard Worker patcher.attribute_name = self.attribute_name 1321*cda5da8dSAndroid Build Coastguard Worker patcher.additional_patchers = [ 1322*cda5da8dSAndroid Build Coastguard Worker p.copy() for p in self.additional_patchers 1323*cda5da8dSAndroid Build Coastguard Worker ] 1324*cda5da8dSAndroid Build Coastguard Worker return patcher 1325*cda5da8dSAndroid Build Coastguard Worker 1326*cda5da8dSAndroid Build Coastguard Worker 1327*cda5da8dSAndroid Build Coastguard Worker def __call__(self, func): 1328*cda5da8dSAndroid Build Coastguard Worker if isinstance(func, type): 1329*cda5da8dSAndroid Build Coastguard Worker return self.decorate_class(func) 1330*cda5da8dSAndroid Build Coastguard Worker if inspect.iscoroutinefunction(func): 1331*cda5da8dSAndroid Build Coastguard Worker return self.decorate_async_callable(func) 1332*cda5da8dSAndroid Build Coastguard Worker return self.decorate_callable(func) 1333*cda5da8dSAndroid Build Coastguard Worker 1334*cda5da8dSAndroid Build Coastguard Worker 1335*cda5da8dSAndroid Build Coastguard Worker def decorate_class(self, klass): 1336*cda5da8dSAndroid Build Coastguard Worker for attr in dir(klass): 1337*cda5da8dSAndroid Build Coastguard Worker if not attr.startswith(patch.TEST_PREFIX): 1338*cda5da8dSAndroid Build Coastguard Worker continue 1339*cda5da8dSAndroid Build Coastguard Worker 1340*cda5da8dSAndroid Build Coastguard Worker attr_value = getattr(klass, attr) 1341*cda5da8dSAndroid Build Coastguard Worker if not hasattr(attr_value, "__call__"): 1342*cda5da8dSAndroid Build Coastguard Worker continue 1343*cda5da8dSAndroid Build Coastguard Worker 1344*cda5da8dSAndroid Build Coastguard Worker patcher = self.copy() 1345*cda5da8dSAndroid Build Coastguard Worker setattr(klass, attr, patcher(attr_value)) 1346*cda5da8dSAndroid Build Coastguard Worker return klass 1347*cda5da8dSAndroid Build Coastguard Worker 1348*cda5da8dSAndroid Build Coastguard Worker 1349*cda5da8dSAndroid Build Coastguard Worker @contextlib.contextmanager 1350*cda5da8dSAndroid Build Coastguard Worker def decoration_helper(self, patched, args, keywargs): 1351*cda5da8dSAndroid Build Coastguard Worker extra_args = [] 1352*cda5da8dSAndroid Build Coastguard Worker with contextlib.ExitStack() as exit_stack: 1353*cda5da8dSAndroid Build Coastguard Worker for patching in patched.patchings: 1354*cda5da8dSAndroid Build Coastguard Worker arg = exit_stack.enter_context(patching) 1355*cda5da8dSAndroid Build Coastguard Worker if patching.attribute_name is not None: 1356*cda5da8dSAndroid Build Coastguard Worker keywargs.update(arg) 1357*cda5da8dSAndroid Build Coastguard Worker elif patching.new is DEFAULT: 1358*cda5da8dSAndroid Build Coastguard Worker extra_args.append(arg) 1359*cda5da8dSAndroid Build Coastguard Worker 1360*cda5da8dSAndroid Build Coastguard Worker args += tuple(extra_args) 1361*cda5da8dSAndroid Build Coastguard Worker yield (args, keywargs) 1362*cda5da8dSAndroid Build Coastguard Worker 1363*cda5da8dSAndroid Build Coastguard Worker 1364*cda5da8dSAndroid Build Coastguard Worker def decorate_callable(self, func): 1365*cda5da8dSAndroid Build Coastguard Worker # NB. Keep the method in sync with decorate_async_callable() 1366*cda5da8dSAndroid Build Coastguard Worker if hasattr(func, 'patchings'): 1367*cda5da8dSAndroid Build Coastguard Worker func.patchings.append(self) 1368*cda5da8dSAndroid Build Coastguard Worker return func 1369*cda5da8dSAndroid Build Coastguard Worker 1370*cda5da8dSAndroid Build Coastguard Worker @wraps(func) 1371*cda5da8dSAndroid Build Coastguard Worker def patched(*args, **keywargs): 1372*cda5da8dSAndroid Build Coastguard Worker with self.decoration_helper(patched, 1373*cda5da8dSAndroid Build Coastguard Worker args, 1374*cda5da8dSAndroid Build Coastguard Worker keywargs) as (newargs, newkeywargs): 1375*cda5da8dSAndroid Build Coastguard Worker return func(*newargs, **newkeywargs) 1376*cda5da8dSAndroid Build Coastguard Worker 1377*cda5da8dSAndroid Build Coastguard Worker patched.patchings = [self] 1378*cda5da8dSAndroid Build Coastguard Worker return patched 1379*cda5da8dSAndroid Build Coastguard Worker 1380*cda5da8dSAndroid Build Coastguard Worker 1381*cda5da8dSAndroid Build Coastguard Worker def decorate_async_callable(self, func): 1382*cda5da8dSAndroid Build Coastguard Worker # NB. Keep the method in sync with decorate_callable() 1383*cda5da8dSAndroid Build Coastguard Worker if hasattr(func, 'patchings'): 1384*cda5da8dSAndroid Build Coastguard Worker func.patchings.append(self) 1385*cda5da8dSAndroid Build Coastguard Worker return func 1386*cda5da8dSAndroid Build Coastguard Worker 1387*cda5da8dSAndroid Build Coastguard Worker @wraps(func) 1388*cda5da8dSAndroid Build Coastguard Worker async def patched(*args, **keywargs): 1389*cda5da8dSAndroid Build Coastguard Worker with self.decoration_helper(patched, 1390*cda5da8dSAndroid Build Coastguard Worker args, 1391*cda5da8dSAndroid Build Coastguard Worker keywargs) as (newargs, newkeywargs): 1392*cda5da8dSAndroid Build Coastguard Worker return await func(*newargs, **newkeywargs) 1393*cda5da8dSAndroid Build Coastguard Worker 1394*cda5da8dSAndroid Build Coastguard Worker patched.patchings = [self] 1395*cda5da8dSAndroid Build Coastguard Worker return patched 1396*cda5da8dSAndroid Build Coastguard Worker 1397*cda5da8dSAndroid Build Coastguard Worker 1398*cda5da8dSAndroid Build Coastguard Worker def get_original(self): 1399*cda5da8dSAndroid Build Coastguard Worker target = self.getter() 1400*cda5da8dSAndroid Build Coastguard Worker name = self.attribute 1401*cda5da8dSAndroid Build Coastguard Worker 1402*cda5da8dSAndroid Build Coastguard Worker original = DEFAULT 1403*cda5da8dSAndroid Build Coastguard Worker local = False 1404*cda5da8dSAndroid Build Coastguard Worker 1405*cda5da8dSAndroid Build Coastguard Worker try: 1406*cda5da8dSAndroid Build Coastguard Worker original = target.__dict__[name] 1407*cda5da8dSAndroid Build Coastguard Worker except (AttributeError, KeyError): 1408*cda5da8dSAndroid Build Coastguard Worker original = getattr(target, name, DEFAULT) 1409*cda5da8dSAndroid Build Coastguard Worker else: 1410*cda5da8dSAndroid Build Coastguard Worker local = True 1411*cda5da8dSAndroid Build Coastguard Worker 1412*cda5da8dSAndroid Build Coastguard Worker if name in _builtins and isinstance(target, ModuleType): 1413*cda5da8dSAndroid Build Coastguard Worker self.create = True 1414*cda5da8dSAndroid Build Coastguard Worker 1415*cda5da8dSAndroid Build Coastguard Worker if not self.create and original is DEFAULT: 1416*cda5da8dSAndroid Build Coastguard Worker raise AttributeError( 1417*cda5da8dSAndroid Build Coastguard Worker "%s does not have the attribute %r" % (target, name) 1418*cda5da8dSAndroid Build Coastguard Worker ) 1419*cda5da8dSAndroid Build Coastguard Worker return original, local 1420*cda5da8dSAndroid Build Coastguard Worker 1421*cda5da8dSAndroid Build Coastguard Worker 1422*cda5da8dSAndroid Build Coastguard Worker def __enter__(self): 1423*cda5da8dSAndroid Build Coastguard Worker """Perform the patch.""" 1424*cda5da8dSAndroid Build Coastguard Worker new, spec, spec_set = self.new, self.spec, self.spec_set 1425*cda5da8dSAndroid Build Coastguard Worker autospec, kwargs = self.autospec, self.kwargs 1426*cda5da8dSAndroid Build Coastguard Worker new_callable = self.new_callable 1427*cda5da8dSAndroid Build Coastguard Worker self.target = self.getter() 1428*cda5da8dSAndroid Build Coastguard Worker 1429*cda5da8dSAndroid Build Coastguard Worker # normalise False to None 1430*cda5da8dSAndroid Build Coastguard Worker if spec is False: 1431*cda5da8dSAndroid Build Coastguard Worker spec = None 1432*cda5da8dSAndroid Build Coastguard Worker if spec_set is False: 1433*cda5da8dSAndroid Build Coastguard Worker spec_set = None 1434*cda5da8dSAndroid Build Coastguard Worker if autospec is False: 1435*cda5da8dSAndroid Build Coastguard Worker autospec = None 1436*cda5da8dSAndroid Build Coastguard Worker 1437*cda5da8dSAndroid Build Coastguard Worker if spec is not None and autospec is not None: 1438*cda5da8dSAndroid Build Coastguard Worker raise TypeError("Can't specify spec and autospec") 1439*cda5da8dSAndroid Build Coastguard Worker if ((spec is not None or autospec is not None) and 1440*cda5da8dSAndroid Build Coastguard Worker spec_set not in (True, None)): 1441*cda5da8dSAndroid Build Coastguard Worker raise TypeError("Can't provide explicit spec_set *and* spec or autospec") 1442*cda5da8dSAndroid Build Coastguard Worker 1443*cda5da8dSAndroid Build Coastguard Worker original, local = self.get_original() 1444*cda5da8dSAndroid Build Coastguard Worker 1445*cda5da8dSAndroid Build Coastguard Worker if new is DEFAULT and autospec is None: 1446*cda5da8dSAndroid Build Coastguard Worker inherit = False 1447*cda5da8dSAndroid Build Coastguard Worker if spec is True: 1448*cda5da8dSAndroid Build Coastguard Worker # set spec to the object we are replacing 1449*cda5da8dSAndroid Build Coastguard Worker spec = original 1450*cda5da8dSAndroid Build Coastguard Worker if spec_set is True: 1451*cda5da8dSAndroid Build Coastguard Worker spec_set = original 1452*cda5da8dSAndroid Build Coastguard Worker spec = None 1453*cda5da8dSAndroid Build Coastguard Worker elif spec is not None: 1454*cda5da8dSAndroid Build Coastguard Worker if spec_set is True: 1455*cda5da8dSAndroid Build Coastguard Worker spec_set = spec 1456*cda5da8dSAndroid Build Coastguard Worker spec = None 1457*cda5da8dSAndroid Build Coastguard Worker elif spec_set is True: 1458*cda5da8dSAndroid Build Coastguard Worker spec_set = original 1459*cda5da8dSAndroid Build Coastguard Worker 1460*cda5da8dSAndroid Build Coastguard Worker if spec is not None or spec_set is not None: 1461*cda5da8dSAndroid Build Coastguard Worker if original is DEFAULT: 1462*cda5da8dSAndroid Build Coastguard Worker raise TypeError("Can't use 'spec' with create=True") 1463*cda5da8dSAndroid Build Coastguard Worker if isinstance(original, type): 1464*cda5da8dSAndroid Build Coastguard Worker # If we're patching out a class and there is a spec 1465*cda5da8dSAndroid Build Coastguard Worker inherit = True 1466*cda5da8dSAndroid Build Coastguard Worker if spec is None and _is_async_obj(original): 1467*cda5da8dSAndroid Build Coastguard Worker Klass = AsyncMock 1468*cda5da8dSAndroid Build Coastguard Worker else: 1469*cda5da8dSAndroid Build Coastguard Worker Klass = MagicMock 1470*cda5da8dSAndroid Build Coastguard Worker _kwargs = {} 1471*cda5da8dSAndroid Build Coastguard Worker if new_callable is not None: 1472*cda5da8dSAndroid Build Coastguard Worker Klass = new_callable 1473*cda5da8dSAndroid Build Coastguard Worker elif spec is not None or spec_set is not None: 1474*cda5da8dSAndroid Build Coastguard Worker this_spec = spec 1475*cda5da8dSAndroid Build Coastguard Worker if spec_set is not None: 1476*cda5da8dSAndroid Build Coastguard Worker this_spec = spec_set 1477*cda5da8dSAndroid Build Coastguard Worker if _is_list(this_spec): 1478*cda5da8dSAndroid Build Coastguard Worker not_callable = '__call__' not in this_spec 1479*cda5da8dSAndroid Build Coastguard Worker else: 1480*cda5da8dSAndroid Build Coastguard Worker not_callable = not callable(this_spec) 1481*cda5da8dSAndroid Build Coastguard Worker if _is_async_obj(this_spec): 1482*cda5da8dSAndroid Build Coastguard Worker Klass = AsyncMock 1483*cda5da8dSAndroid Build Coastguard Worker elif not_callable: 1484*cda5da8dSAndroid Build Coastguard Worker Klass = NonCallableMagicMock 1485*cda5da8dSAndroid Build Coastguard Worker 1486*cda5da8dSAndroid Build Coastguard Worker if spec is not None: 1487*cda5da8dSAndroid Build Coastguard Worker _kwargs['spec'] = spec 1488*cda5da8dSAndroid Build Coastguard Worker if spec_set is not None: 1489*cda5da8dSAndroid Build Coastguard Worker _kwargs['spec_set'] = spec_set 1490*cda5da8dSAndroid Build Coastguard Worker 1491*cda5da8dSAndroid Build Coastguard Worker # add a name to mocks 1492*cda5da8dSAndroid Build Coastguard Worker if (isinstance(Klass, type) and 1493*cda5da8dSAndroid Build Coastguard Worker issubclass(Klass, NonCallableMock) and self.attribute): 1494*cda5da8dSAndroid Build Coastguard Worker _kwargs['name'] = self.attribute 1495*cda5da8dSAndroid Build Coastguard Worker 1496*cda5da8dSAndroid Build Coastguard Worker _kwargs.update(kwargs) 1497*cda5da8dSAndroid Build Coastguard Worker new = Klass(**_kwargs) 1498*cda5da8dSAndroid Build Coastguard Worker 1499*cda5da8dSAndroid Build Coastguard Worker if inherit and _is_instance_mock(new): 1500*cda5da8dSAndroid Build Coastguard Worker # we can only tell if the instance should be callable if the 1501*cda5da8dSAndroid Build Coastguard Worker # spec is not a list 1502*cda5da8dSAndroid Build Coastguard Worker this_spec = spec 1503*cda5da8dSAndroid Build Coastguard Worker if spec_set is not None: 1504*cda5da8dSAndroid Build Coastguard Worker this_spec = spec_set 1505*cda5da8dSAndroid Build Coastguard Worker if (not _is_list(this_spec) and not 1506*cda5da8dSAndroid Build Coastguard Worker _instance_callable(this_spec)): 1507*cda5da8dSAndroid Build Coastguard Worker Klass = NonCallableMagicMock 1508*cda5da8dSAndroid Build Coastguard Worker 1509*cda5da8dSAndroid Build Coastguard Worker _kwargs.pop('name') 1510*cda5da8dSAndroid Build Coastguard Worker new.return_value = Klass(_new_parent=new, _new_name='()', 1511*cda5da8dSAndroid Build Coastguard Worker **_kwargs) 1512*cda5da8dSAndroid Build Coastguard Worker elif autospec is not None: 1513*cda5da8dSAndroid Build Coastguard Worker # spec is ignored, new *must* be default, spec_set is treated 1514*cda5da8dSAndroid Build Coastguard Worker # as a boolean. Should we check spec is not None and that spec_set 1515*cda5da8dSAndroid Build Coastguard Worker # is a bool? 1516*cda5da8dSAndroid Build Coastguard Worker if new is not DEFAULT: 1517*cda5da8dSAndroid Build Coastguard Worker raise TypeError( 1518*cda5da8dSAndroid Build Coastguard Worker "autospec creates the mock for you. Can't specify " 1519*cda5da8dSAndroid Build Coastguard Worker "autospec and new." 1520*cda5da8dSAndroid Build Coastguard Worker ) 1521*cda5da8dSAndroid Build Coastguard Worker if original is DEFAULT: 1522*cda5da8dSAndroid Build Coastguard Worker raise TypeError("Can't use 'autospec' with create=True") 1523*cda5da8dSAndroid Build Coastguard Worker spec_set = bool(spec_set) 1524*cda5da8dSAndroid Build Coastguard Worker if autospec is True: 1525*cda5da8dSAndroid Build Coastguard Worker autospec = original 1526*cda5da8dSAndroid Build Coastguard Worker 1527*cda5da8dSAndroid Build Coastguard Worker if _is_instance_mock(self.target): 1528*cda5da8dSAndroid Build Coastguard Worker raise InvalidSpecError( 1529*cda5da8dSAndroid Build Coastguard Worker f'Cannot autospec attr {self.attribute!r} as the patch ' 1530*cda5da8dSAndroid Build Coastguard Worker f'target has already been mocked out. ' 1531*cda5da8dSAndroid Build Coastguard Worker f'[target={self.target!r}, attr={autospec!r}]') 1532*cda5da8dSAndroid Build Coastguard Worker if _is_instance_mock(autospec): 1533*cda5da8dSAndroid Build Coastguard Worker target_name = getattr(self.target, '__name__', self.target) 1534*cda5da8dSAndroid Build Coastguard Worker raise InvalidSpecError( 1535*cda5da8dSAndroid Build Coastguard Worker f'Cannot autospec attr {self.attribute!r} from target ' 1536*cda5da8dSAndroid Build Coastguard Worker f'{target_name!r} as it has already been mocked out. ' 1537*cda5da8dSAndroid Build Coastguard Worker f'[target={self.target!r}, attr={autospec!r}]') 1538*cda5da8dSAndroid Build Coastguard Worker 1539*cda5da8dSAndroid Build Coastguard Worker new = create_autospec(autospec, spec_set=spec_set, 1540*cda5da8dSAndroid Build Coastguard Worker _name=self.attribute, **kwargs) 1541*cda5da8dSAndroid Build Coastguard Worker elif kwargs: 1542*cda5da8dSAndroid Build Coastguard Worker # can't set keyword args when we aren't creating the mock 1543*cda5da8dSAndroid Build Coastguard Worker # XXXX If new is a Mock we could call new.configure_mock(**kwargs) 1544*cda5da8dSAndroid Build Coastguard Worker raise TypeError("Can't pass kwargs to a mock we aren't creating") 1545*cda5da8dSAndroid Build Coastguard Worker 1546*cda5da8dSAndroid Build Coastguard Worker new_attr = new 1547*cda5da8dSAndroid Build Coastguard Worker 1548*cda5da8dSAndroid Build Coastguard Worker self.temp_original = original 1549*cda5da8dSAndroid Build Coastguard Worker self.is_local = local 1550*cda5da8dSAndroid Build Coastguard Worker self._exit_stack = contextlib.ExitStack() 1551*cda5da8dSAndroid Build Coastguard Worker try: 1552*cda5da8dSAndroid Build Coastguard Worker setattr(self.target, self.attribute, new_attr) 1553*cda5da8dSAndroid Build Coastguard Worker if self.attribute_name is not None: 1554*cda5da8dSAndroid Build Coastguard Worker extra_args = {} 1555*cda5da8dSAndroid Build Coastguard Worker if self.new is DEFAULT: 1556*cda5da8dSAndroid Build Coastguard Worker extra_args[self.attribute_name] = new 1557*cda5da8dSAndroid Build Coastguard Worker for patching in self.additional_patchers: 1558*cda5da8dSAndroid Build Coastguard Worker arg = self._exit_stack.enter_context(patching) 1559*cda5da8dSAndroid Build Coastguard Worker if patching.new is DEFAULT: 1560*cda5da8dSAndroid Build Coastguard Worker extra_args.update(arg) 1561*cda5da8dSAndroid Build Coastguard Worker return extra_args 1562*cda5da8dSAndroid Build Coastguard Worker 1563*cda5da8dSAndroid Build Coastguard Worker return new 1564*cda5da8dSAndroid Build Coastguard Worker except: 1565*cda5da8dSAndroid Build Coastguard Worker if not self.__exit__(*sys.exc_info()): 1566*cda5da8dSAndroid Build Coastguard Worker raise 1567*cda5da8dSAndroid Build Coastguard Worker 1568*cda5da8dSAndroid Build Coastguard Worker def __exit__(self, *exc_info): 1569*cda5da8dSAndroid Build Coastguard Worker """Undo the patch.""" 1570*cda5da8dSAndroid Build Coastguard Worker if self.is_local and self.temp_original is not DEFAULT: 1571*cda5da8dSAndroid Build Coastguard Worker setattr(self.target, self.attribute, self.temp_original) 1572*cda5da8dSAndroid Build Coastguard Worker else: 1573*cda5da8dSAndroid Build Coastguard Worker delattr(self.target, self.attribute) 1574*cda5da8dSAndroid Build Coastguard Worker if not self.create and (not hasattr(self.target, self.attribute) or 1575*cda5da8dSAndroid Build Coastguard Worker self.attribute in ('__doc__', '__module__', 1576*cda5da8dSAndroid Build Coastguard Worker '__defaults__', '__annotations__', 1577*cda5da8dSAndroid Build Coastguard Worker '__kwdefaults__')): 1578*cda5da8dSAndroid Build Coastguard Worker # needed for proxy objects like django settings 1579*cda5da8dSAndroid Build Coastguard Worker setattr(self.target, self.attribute, self.temp_original) 1580*cda5da8dSAndroid Build Coastguard Worker 1581*cda5da8dSAndroid Build Coastguard Worker del self.temp_original 1582*cda5da8dSAndroid Build Coastguard Worker del self.is_local 1583*cda5da8dSAndroid Build Coastguard Worker del self.target 1584*cda5da8dSAndroid Build Coastguard Worker exit_stack = self._exit_stack 1585*cda5da8dSAndroid Build Coastguard Worker del self._exit_stack 1586*cda5da8dSAndroid Build Coastguard Worker return exit_stack.__exit__(*exc_info) 1587*cda5da8dSAndroid Build Coastguard Worker 1588*cda5da8dSAndroid Build Coastguard Worker 1589*cda5da8dSAndroid Build Coastguard Worker def start(self): 1590*cda5da8dSAndroid Build Coastguard Worker """Activate a patch, returning any created mock.""" 1591*cda5da8dSAndroid Build Coastguard Worker result = self.__enter__() 1592*cda5da8dSAndroid Build Coastguard Worker self._active_patches.append(self) 1593*cda5da8dSAndroid Build Coastguard Worker return result 1594*cda5da8dSAndroid Build Coastguard Worker 1595*cda5da8dSAndroid Build Coastguard Worker 1596*cda5da8dSAndroid Build Coastguard Worker def stop(self): 1597*cda5da8dSAndroid Build Coastguard Worker """Stop an active patch.""" 1598*cda5da8dSAndroid Build Coastguard Worker try: 1599*cda5da8dSAndroid Build Coastguard Worker self._active_patches.remove(self) 1600*cda5da8dSAndroid Build Coastguard Worker except ValueError: 1601*cda5da8dSAndroid Build Coastguard Worker # If the patch hasn't been started this will fail 1602*cda5da8dSAndroid Build Coastguard Worker return None 1603*cda5da8dSAndroid Build Coastguard Worker 1604*cda5da8dSAndroid Build Coastguard Worker return self.__exit__(None, None, None) 1605*cda5da8dSAndroid Build Coastguard Worker 1606*cda5da8dSAndroid Build Coastguard Worker 1607*cda5da8dSAndroid Build Coastguard Worker 1608*cda5da8dSAndroid Build Coastguard Workerdef _get_target(target): 1609*cda5da8dSAndroid Build Coastguard Worker try: 1610*cda5da8dSAndroid Build Coastguard Worker target, attribute = target.rsplit('.', 1) 1611*cda5da8dSAndroid Build Coastguard Worker except (TypeError, ValueError, AttributeError): 1612*cda5da8dSAndroid Build Coastguard Worker raise TypeError( 1613*cda5da8dSAndroid Build Coastguard Worker f"Need a valid target to patch. You supplied: {target!r}") 1614*cda5da8dSAndroid Build Coastguard Worker return partial(pkgutil.resolve_name, target), attribute 1615*cda5da8dSAndroid Build Coastguard Worker 1616*cda5da8dSAndroid Build Coastguard Worker 1617*cda5da8dSAndroid Build Coastguard Workerdef _patch_object( 1618*cda5da8dSAndroid Build Coastguard Worker target, attribute, new=DEFAULT, spec=None, 1619*cda5da8dSAndroid Build Coastguard Worker create=False, spec_set=None, autospec=None, 1620*cda5da8dSAndroid Build Coastguard Worker new_callable=None, *, unsafe=False, **kwargs 1621*cda5da8dSAndroid Build Coastguard Worker ): 1622*cda5da8dSAndroid Build Coastguard Worker """ 1623*cda5da8dSAndroid Build Coastguard Worker patch the named member (`attribute`) on an object (`target`) with a mock 1624*cda5da8dSAndroid Build Coastguard Worker object. 1625*cda5da8dSAndroid Build Coastguard Worker 1626*cda5da8dSAndroid Build Coastguard Worker `patch.object` can be used as a decorator, class decorator or a context 1627*cda5da8dSAndroid Build Coastguard Worker manager. Arguments `new`, `spec`, `create`, `spec_set`, 1628*cda5da8dSAndroid Build Coastguard Worker `autospec` and `new_callable` have the same meaning as for `patch`. Like 1629*cda5da8dSAndroid Build Coastguard Worker `patch`, `patch.object` takes arbitrary keyword arguments for configuring 1630*cda5da8dSAndroid Build Coastguard Worker the mock object it creates. 1631*cda5da8dSAndroid Build Coastguard Worker 1632*cda5da8dSAndroid Build Coastguard Worker When used as a class decorator `patch.object` honours `patch.TEST_PREFIX` 1633*cda5da8dSAndroid Build Coastguard Worker for choosing which methods to wrap. 1634*cda5da8dSAndroid Build Coastguard Worker """ 1635*cda5da8dSAndroid Build Coastguard Worker if type(target) is str: 1636*cda5da8dSAndroid Build Coastguard Worker raise TypeError( 1637*cda5da8dSAndroid Build Coastguard Worker f"{target!r} must be the actual object to be patched, not a str" 1638*cda5da8dSAndroid Build Coastguard Worker ) 1639*cda5da8dSAndroid Build Coastguard Worker getter = lambda: target 1640*cda5da8dSAndroid Build Coastguard Worker return _patch( 1641*cda5da8dSAndroid Build Coastguard Worker getter, attribute, new, spec, create, 1642*cda5da8dSAndroid Build Coastguard Worker spec_set, autospec, new_callable, kwargs, unsafe=unsafe 1643*cda5da8dSAndroid Build Coastguard Worker ) 1644*cda5da8dSAndroid Build Coastguard Worker 1645*cda5da8dSAndroid Build Coastguard Worker 1646*cda5da8dSAndroid Build Coastguard Workerdef _patch_multiple(target, spec=None, create=False, spec_set=None, 1647*cda5da8dSAndroid Build Coastguard Worker autospec=None, new_callable=None, **kwargs): 1648*cda5da8dSAndroid Build Coastguard Worker """Perform multiple patches in a single call. It takes the object to be 1649*cda5da8dSAndroid Build Coastguard Worker patched (either as an object or a string to fetch the object by importing) 1650*cda5da8dSAndroid Build Coastguard Worker and keyword arguments for the patches:: 1651*cda5da8dSAndroid Build Coastguard Worker 1652*cda5da8dSAndroid Build Coastguard Worker with patch.multiple(settings, FIRST_PATCH='one', SECOND_PATCH='two'): 1653*cda5da8dSAndroid Build Coastguard Worker ... 1654*cda5da8dSAndroid Build Coastguard Worker 1655*cda5da8dSAndroid Build Coastguard Worker Use `DEFAULT` as the value if you want `patch.multiple` to create 1656*cda5da8dSAndroid Build Coastguard Worker mocks for you. In this case the created mocks are passed into a decorated 1657*cda5da8dSAndroid Build Coastguard Worker function by keyword, and a dictionary is returned when `patch.multiple` is 1658*cda5da8dSAndroid Build Coastguard Worker used as a context manager. 1659*cda5da8dSAndroid Build Coastguard Worker 1660*cda5da8dSAndroid Build Coastguard Worker `patch.multiple` can be used as a decorator, class decorator or a context 1661*cda5da8dSAndroid Build Coastguard Worker manager. The arguments `spec`, `spec_set`, `create`, 1662*cda5da8dSAndroid Build Coastguard Worker `autospec` and `new_callable` have the same meaning as for `patch`. These 1663*cda5da8dSAndroid Build Coastguard Worker arguments will be applied to *all* patches done by `patch.multiple`. 1664*cda5da8dSAndroid Build Coastguard Worker 1665*cda5da8dSAndroid Build Coastguard Worker When used as a class decorator `patch.multiple` honours `patch.TEST_PREFIX` 1666*cda5da8dSAndroid Build Coastguard Worker for choosing which methods to wrap. 1667*cda5da8dSAndroid Build Coastguard Worker """ 1668*cda5da8dSAndroid Build Coastguard Worker if type(target) is str: 1669*cda5da8dSAndroid Build Coastguard Worker getter = partial(pkgutil.resolve_name, target) 1670*cda5da8dSAndroid Build Coastguard Worker else: 1671*cda5da8dSAndroid Build Coastguard Worker getter = lambda: target 1672*cda5da8dSAndroid Build Coastguard Worker 1673*cda5da8dSAndroid Build Coastguard Worker if not kwargs: 1674*cda5da8dSAndroid Build Coastguard Worker raise ValueError( 1675*cda5da8dSAndroid Build Coastguard Worker 'Must supply at least one keyword argument with patch.multiple' 1676*cda5da8dSAndroid Build Coastguard Worker ) 1677*cda5da8dSAndroid Build Coastguard Worker # need to wrap in a list for python 3, where items is a view 1678*cda5da8dSAndroid Build Coastguard Worker items = list(kwargs.items()) 1679*cda5da8dSAndroid Build Coastguard Worker attribute, new = items[0] 1680*cda5da8dSAndroid Build Coastguard Worker patcher = _patch( 1681*cda5da8dSAndroid Build Coastguard Worker getter, attribute, new, spec, create, spec_set, 1682*cda5da8dSAndroid Build Coastguard Worker autospec, new_callable, {} 1683*cda5da8dSAndroid Build Coastguard Worker ) 1684*cda5da8dSAndroid Build Coastguard Worker patcher.attribute_name = attribute 1685*cda5da8dSAndroid Build Coastguard Worker for attribute, new in items[1:]: 1686*cda5da8dSAndroid Build Coastguard Worker this_patcher = _patch( 1687*cda5da8dSAndroid Build Coastguard Worker getter, attribute, new, spec, create, spec_set, 1688*cda5da8dSAndroid Build Coastguard Worker autospec, new_callable, {} 1689*cda5da8dSAndroid Build Coastguard Worker ) 1690*cda5da8dSAndroid Build Coastguard Worker this_patcher.attribute_name = attribute 1691*cda5da8dSAndroid Build Coastguard Worker patcher.additional_patchers.append(this_patcher) 1692*cda5da8dSAndroid Build Coastguard Worker return patcher 1693*cda5da8dSAndroid Build Coastguard Worker 1694*cda5da8dSAndroid Build Coastguard Worker 1695*cda5da8dSAndroid Build Coastguard Workerdef patch( 1696*cda5da8dSAndroid Build Coastguard Worker target, new=DEFAULT, spec=None, create=False, 1697*cda5da8dSAndroid Build Coastguard Worker spec_set=None, autospec=None, new_callable=None, *, unsafe=False, **kwargs 1698*cda5da8dSAndroid Build Coastguard Worker ): 1699*cda5da8dSAndroid Build Coastguard Worker """ 1700*cda5da8dSAndroid Build Coastguard Worker `patch` acts as a function decorator, class decorator or a context 1701*cda5da8dSAndroid Build Coastguard Worker manager. Inside the body of the function or with statement, the `target` 1702*cda5da8dSAndroid Build Coastguard Worker is patched with a `new` object. When the function/with statement exits 1703*cda5da8dSAndroid Build Coastguard Worker the patch is undone. 1704*cda5da8dSAndroid Build Coastguard Worker 1705*cda5da8dSAndroid Build Coastguard Worker If `new` is omitted, then the target is replaced with an 1706*cda5da8dSAndroid Build Coastguard Worker `AsyncMock if the patched object is an async function or a 1707*cda5da8dSAndroid Build Coastguard Worker `MagicMock` otherwise. If `patch` is used as a decorator and `new` is 1708*cda5da8dSAndroid Build Coastguard Worker omitted, the created mock is passed in as an extra argument to the 1709*cda5da8dSAndroid Build Coastguard Worker decorated function. If `patch` is used as a context manager the created 1710*cda5da8dSAndroid Build Coastguard Worker mock is returned by the context manager. 1711*cda5da8dSAndroid Build Coastguard Worker 1712*cda5da8dSAndroid Build Coastguard Worker `target` should be a string in the form `'package.module.ClassName'`. The 1713*cda5da8dSAndroid Build Coastguard Worker `target` is imported and the specified object replaced with the `new` 1714*cda5da8dSAndroid Build Coastguard Worker object, so the `target` must be importable from the environment you are 1715*cda5da8dSAndroid Build Coastguard Worker calling `patch` from. The target is imported when the decorated function 1716*cda5da8dSAndroid Build Coastguard Worker is executed, not at decoration time. 1717*cda5da8dSAndroid Build Coastguard Worker 1718*cda5da8dSAndroid Build Coastguard Worker The `spec` and `spec_set` keyword arguments are passed to the `MagicMock` 1719*cda5da8dSAndroid Build Coastguard Worker if patch is creating one for you. 1720*cda5da8dSAndroid Build Coastguard Worker 1721*cda5da8dSAndroid Build Coastguard Worker In addition you can pass `spec=True` or `spec_set=True`, which causes 1722*cda5da8dSAndroid Build Coastguard Worker patch to pass in the object being mocked as the spec/spec_set object. 1723*cda5da8dSAndroid Build Coastguard Worker 1724*cda5da8dSAndroid Build Coastguard Worker `new_callable` allows you to specify a different class, or callable object, 1725*cda5da8dSAndroid Build Coastguard Worker that will be called to create the `new` object. By default `AsyncMock` is 1726*cda5da8dSAndroid Build Coastguard Worker used for async functions and `MagicMock` for the rest. 1727*cda5da8dSAndroid Build Coastguard Worker 1728*cda5da8dSAndroid Build Coastguard Worker A more powerful form of `spec` is `autospec`. If you set `autospec=True` 1729*cda5da8dSAndroid Build Coastguard Worker then the mock will be created with a spec from the object being replaced. 1730*cda5da8dSAndroid Build Coastguard Worker All attributes of the mock will also have the spec of the corresponding 1731*cda5da8dSAndroid Build Coastguard Worker attribute of the object being replaced. Methods and functions being 1732*cda5da8dSAndroid Build Coastguard Worker mocked will have their arguments checked and will raise a `TypeError` if 1733*cda5da8dSAndroid Build Coastguard Worker they are called with the wrong signature. For mocks replacing a class, 1734*cda5da8dSAndroid Build Coastguard Worker their return value (the 'instance') will have the same spec as the class. 1735*cda5da8dSAndroid Build Coastguard Worker 1736*cda5da8dSAndroid Build Coastguard Worker Instead of `autospec=True` you can pass `autospec=some_object` to use an 1737*cda5da8dSAndroid Build Coastguard Worker arbitrary object as the spec instead of the one being replaced. 1738*cda5da8dSAndroid Build Coastguard Worker 1739*cda5da8dSAndroid Build Coastguard Worker By default `patch` will fail to replace attributes that don't exist. If 1740*cda5da8dSAndroid Build Coastguard Worker you pass in `create=True`, and the attribute doesn't exist, patch will 1741*cda5da8dSAndroid Build Coastguard Worker create the attribute for you when the patched function is called, and 1742*cda5da8dSAndroid Build Coastguard Worker delete it again afterwards. This is useful for writing tests against 1743*cda5da8dSAndroid Build Coastguard Worker attributes that your production code creates at runtime. It is off by 1744*cda5da8dSAndroid Build Coastguard Worker default because it can be dangerous. With it switched on you can write 1745*cda5da8dSAndroid Build Coastguard Worker passing tests against APIs that don't actually exist! 1746*cda5da8dSAndroid Build Coastguard Worker 1747*cda5da8dSAndroid Build Coastguard Worker Patch can be used as a `TestCase` class decorator. It works by 1748*cda5da8dSAndroid Build Coastguard Worker decorating each test method in the class. This reduces the boilerplate 1749*cda5da8dSAndroid Build Coastguard Worker code when your test methods share a common patchings set. `patch` finds 1750*cda5da8dSAndroid Build Coastguard Worker tests by looking for method names that start with `patch.TEST_PREFIX`. 1751*cda5da8dSAndroid Build Coastguard Worker By default this is `test`, which matches the way `unittest` finds tests. 1752*cda5da8dSAndroid Build Coastguard Worker You can specify an alternative prefix by setting `patch.TEST_PREFIX`. 1753*cda5da8dSAndroid Build Coastguard Worker 1754*cda5da8dSAndroid Build Coastguard Worker Patch can be used as a context manager, with the with statement. Here the 1755*cda5da8dSAndroid Build Coastguard Worker patching applies to the indented block after the with statement. If you 1756*cda5da8dSAndroid Build Coastguard Worker use "as" then the patched object will be bound to the name after the 1757*cda5da8dSAndroid Build Coastguard Worker "as"; very useful if `patch` is creating a mock object for you. 1758*cda5da8dSAndroid Build Coastguard Worker 1759*cda5da8dSAndroid Build Coastguard Worker Patch will raise a `RuntimeError` if passed some common misspellings of 1760*cda5da8dSAndroid Build Coastguard Worker the arguments autospec and spec_set. Pass the argument `unsafe` with the 1761*cda5da8dSAndroid Build Coastguard Worker value True to disable that check. 1762*cda5da8dSAndroid Build Coastguard Worker 1763*cda5da8dSAndroid Build Coastguard Worker `patch` takes arbitrary keyword arguments. These will be passed to 1764*cda5da8dSAndroid Build Coastguard Worker `AsyncMock` if the patched object is asynchronous, to `MagicMock` 1765*cda5da8dSAndroid Build Coastguard Worker otherwise or to `new_callable` if specified. 1766*cda5da8dSAndroid Build Coastguard Worker 1767*cda5da8dSAndroid Build Coastguard Worker `patch.dict(...)`, `patch.multiple(...)` and `patch.object(...)` are 1768*cda5da8dSAndroid Build Coastguard Worker available for alternate use-cases. 1769*cda5da8dSAndroid Build Coastguard Worker """ 1770*cda5da8dSAndroid Build Coastguard Worker getter, attribute = _get_target(target) 1771*cda5da8dSAndroid Build Coastguard Worker return _patch( 1772*cda5da8dSAndroid Build Coastguard Worker getter, attribute, new, spec, create, 1773*cda5da8dSAndroid Build Coastguard Worker spec_set, autospec, new_callable, kwargs, unsafe=unsafe 1774*cda5da8dSAndroid Build Coastguard Worker ) 1775*cda5da8dSAndroid Build Coastguard Worker 1776*cda5da8dSAndroid Build Coastguard Worker 1777*cda5da8dSAndroid Build Coastguard Workerclass _patch_dict(object): 1778*cda5da8dSAndroid Build Coastguard Worker """ 1779*cda5da8dSAndroid Build Coastguard Worker Patch a dictionary, or dictionary like object, and restore the dictionary 1780*cda5da8dSAndroid Build Coastguard Worker to its original state after the test. 1781*cda5da8dSAndroid Build Coastguard Worker 1782*cda5da8dSAndroid Build Coastguard Worker `in_dict` can be a dictionary or a mapping like container. If it is a 1783*cda5da8dSAndroid Build Coastguard Worker mapping then it must at least support getting, setting and deleting items 1784*cda5da8dSAndroid Build Coastguard Worker plus iterating over keys. 1785*cda5da8dSAndroid Build Coastguard Worker 1786*cda5da8dSAndroid Build Coastguard Worker `in_dict` can also be a string specifying the name of the dictionary, which 1787*cda5da8dSAndroid Build Coastguard Worker will then be fetched by importing it. 1788*cda5da8dSAndroid Build Coastguard Worker 1789*cda5da8dSAndroid Build Coastguard Worker `values` can be a dictionary of values to set in the dictionary. `values` 1790*cda5da8dSAndroid Build Coastguard Worker can also be an iterable of `(key, value)` pairs. 1791*cda5da8dSAndroid Build Coastguard Worker 1792*cda5da8dSAndroid Build Coastguard Worker If `clear` is True then the dictionary will be cleared before the new 1793*cda5da8dSAndroid Build Coastguard Worker values are set. 1794*cda5da8dSAndroid Build Coastguard Worker 1795*cda5da8dSAndroid Build Coastguard Worker `patch.dict` can also be called with arbitrary keyword arguments to set 1796*cda5da8dSAndroid Build Coastguard Worker values in the dictionary:: 1797*cda5da8dSAndroid Build Coastguard Worker 1798*cda5da8dSAndroid Build Coastguard Worker with patch.dict('sys.modules', mymodule=Mock(), other_module=Mock()): 1799*cda5da8dSAndroid Build Coastguard Worker ... 1800*cda5da8dSAndroid Build Coastguard Worker 1801*cda5da8dSAndroid Build Coastguard Worker `patch.dict` can be used as a context manager, decorator or class 1802*cda5da8dSAndroid Build Coastguard Worker decorator. When used as a class decorator `patch.dict` honours 1803*cda5da8dSAndroid Build Coastguard Worker `patch.TEST_PREFIX` for choosing which methods to wrap. 1804*cda5da8dSAndroid Build Coastguard Worker """ 1805*cda5da8dSAndroid Build Coastguard Worker 1806*cda5da8dSAndroid Build Coastguard Worker def __init__(self, in_dict, values=(), clear=False, **kwargs): 1807*cda5da8dSAndroid Build Coastguard Worker self.in_dict = in_dict 1808*cda5da8dSAndroid Build Coastguard Worker # support any argument supported by dict(...) constructor 1809*cda5da8dSAndroid Build Coastguard Worker self.values = dict(values) 1810*cda5da8dSAndroid Build Coastguard Worker self.values.update(kwargs) 1811*cda5da8dSAndroid Build Coastguard Worker self.clear = clear 1812*cda5da8dSAndroid Build Coastguard Worker self._original = None 1813*cda5da8dSAndroid Build Coastguard Worker 1814*cda5da8dSAndroid Build Coastguard Worker 1815*cda5da8dSAndroid Build Coastguard Worker def __call__(self, f): 1816*cda5da8dSAndroid Build Coastguard Worker if isinstance(f, type): 1817*cda5da8dSAndroid Build Coastguard Worker return self.decorate_class(f) 1818*cda5da8dSAndroid Build Coastguard Worker if inspect.iscoroutinefunction(f): 1819*cda5da8dSAndroid Build Coastguard Worker return self.decorate_async_callable(f) 1820*cda5da8dSAndroid Build Coastguard Worker return self.decorate_callable(f) 1821*cda5da8dSAndroid Build Coastguard Worker 1822*cda5da8dSAndroid Build Coastguard Worker 1823*cda5da8dSAndroid Build Coastguard Worker def decorate_callable(self, f): 1824*cda5da8dSAndroid Build Coastguard Worker @wraps(f) 1825*cda5da8dSAndroid Build Coastguard Worker def _inner(*args, **kw): 1826*cda5da8dSAndroid Build Coastguard Worker self._patch_dict() 1827*cda5da8dSAndroid Build Coastguard Worker try: 1828*cda5da8dSAndroid Build Coastguard Worker return f(*args, **kw) 1829*cda5da8dSAndroid Build Coastguard Worker finally: 1830*cda5da8dSAndroid Build Coastguard Worker self._unpatch_dict() 1831*cda5da8dSAndroid Build Coastguard Worker 1832*cda5da8dSAndroid Build Coastguard Worker return _inner 1833*cda5da8dSAndroid Build Coastguard Worker 1834*cda5da8dSAndroid Build Coastguard Worker 1835*cda5da8dSAndroid Build Coastguard Worker def decorate_async_callable(self, f): 1836*cda5da8dSAndroid Build Coastguard Worker @wraps(f) 1837*cda5da8dSAndroid Build Coastguard Worker async def _inner(*args, **kw): 1838*cda5da8dSAndroid Build Coastguard Worker self._patch_dict() 1839*cda5da8dSAndroid Build Coastguard Worker try: 1840*cda5da8dSAndroid Build Coastguard Worker return await f(*args, **kw) 1841*cda5da8dSAndroid Build Coastguard Worker finally: 1842*cda5da8dSAndroid Build Coastguard Worker self._unpatch_dict() 1843*cda5da8dSAndroid Build Coastguard Worker 1844*cda5da8dSAndroid Build Coastguard Worker return _inner 1845*cda5da8dSAndroid Build Coastguard Worker 1846*cda5da8dSAndroid Build Coastguard Worker 1847*cda5da8dSAndroid Build Coastguard Worker def decorate_class(self, klass): 1848*cda5da8dSAndroid Build Coastguard Worker for attr in dir(klass): 1849*cda5da8dSAndroid Build Coastguard Worker attr_value = getattr(klass, attr) 1850*cda5da8dSAndroid Build Coastguard Worker if (attr.startswith(patch.TEST_PREFIX) and 1851*cda5da8dSAndroid Build Coastguard Worker hasattr(attr_value, "__call__")): 1852*cda5da8dSAndroid Build Coastguard Worker decorator = _patch_dict(self.in_dict, self.values, self.clear) 1853*cda5da8dSAndroid Build Coastguard Worker decorated = decorator(attr_value) 1854*cda5da8dSAndroid Build Coastguard Worker setattr(klass, attr, decorated) 1855*cda5da8dSAndroid Build Coastguard Worker return klass 1856*cda5da8dSAndroid Build Coastguard Worker 1857*cda5da8dSAndroid Build Coastguard Worker 1858*cda5da8dSAndroid Build Coastguard Worker def __enter__(self): 1859*cda5da8dSAndroid Build Coastguard Worker """Patch the dict.""" 1860*cda5da8dSAndroid Build Coastguard Worker self._patch_dict() 1861*cda5da8dSAndroid Build Coastguard Worker return self.in_dict 1862*cda5da8dSAndroid Build Coastguard Worker 1863*cda5da8dSAndroid Build Coastguard Worker 1864*cda5da8dSAndroid Build Coastguard Worker def _patch_dict(self): 1865*cda5da8dSAndroid Build Coastguard Worker values = self.values 1866*cda5da8dSAndroid Build Coastguard Worker if isinstance(self.in_dict, str): 1867*cda5da8dSAndroid Build Coastguard Worker self.in_dict = pkgutil.resolve_name(self.in_dict) 1868*cda5da8dSAndroid Build Coastguard Worker in_dict = self.in_dict 1869*cda5da8dSAndroid Build Coastguard Worker clear = self.clear 1870*cda5da8dSAndroid Build Coastguard Worker 1871*cda5da8dSAndroid Build Coastguard Worker try: 1872*cda5da8dSAndroid Build Coastguard Worker original = in_dict.copy() 1873*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 1874*cda5da8dSAndroid Build Coastguard Worker # dict like object with no copy method 1875*cda5da8dSAndroid Build Coastguard Worker # must support iteration over keys 1876*cda5da8dSAndroid Build Coastguard Worker original = {} 1877*cda5da8dSAndroid Build Coastguard Worker for key in in_dict: 1878*cda5da8dSAndroid Build Coastguard Worker original[key] = in_dict[key] 1879*cda5da8dSAndroid Build Coastguard Worker self._original = original 1880*cda5da8dSAndroid Build Coastguard Worker 1881*cda5da8dSAndroid Build Coastguard Worker if clear: 1882*cda5da8dSAndroid Build Coastguard Worker _clear_dict(in_dict) 1883*cda5da8dSAndroid Build Coastguard Worker 1884*cda5da8dSAndroid Build Coastguard Worker try: 1885*cda5da8dSAndroid Build Coastguard Worker in_dict.update(values) 1886*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 1887*cda5da8dSAndroid Build Coastguard Worker # dict like object with no update method 1888*cda5da8dSAndroid Build Coastguard Worker for key in values: 1889*cda5da8dSAndroid Build Coastguard Worker in_dict[key] = values[key] 1890*cda5da8dSAndroid Build Coastguard Worker 1891*cda5da8dSAndroid Build Coastguard Worker 1892*cda5da8dSAndroid Build Coastguard Worker def _unpatch_dict(self): 1893*cda5da8dSAndroid Build Coastguard Worker in_dict = self.in_dict 1894*cda5da8dSAndroid Build Coastguard Worker original = self._original 1895*cda5da8dSAndroid Build Coastguard Worker 1896*cda5da8dSAndroid Build Coastguard Worker _clear_dict(in_dict) 1897*cda5da8dSAndroid Build Coastguard Worker 1898*cda5da8dSAndroid Build Coastguard Worker try: 1899*cda5da8dSAndroid Build Coastguard Worker in_dict.update(original) 1900*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 1901*cda5da8dSAndroid Build Coastguard Worker for key in original: 1902*cda5da8dSAndroid Build Coastguard Worker in_dict[key] = original[key] 1903*cda5da8dSAndroid Build Coastguard Worker 1904*cda5da8dSAndroid Build Coastguard Worker 1905*cda5da8dSAndroid Build Coastguard Worker def __exit__(self, *args): 1906*cda5da8dSAndroid Build Coastguard Worker """Unpatch the dict.""" 1907*cda5da8dSAndroid Build Coastguard Worker if self._original is not None: 1908*cda5da8dSAndroid Build Coastguard Worker self._unpatch_dict() 1909*cda5da8dSAndroid Build Coastguard Worker return False 1910*cda5da8dSAndroid Build Coastguard Worker 1911*cda5da8dSAndroid Build Coastguard Worker 1912*cda5da8dSAndroid Build Coastguard Worker def start(self): 1913*cda5da8dSAndroid Build Coastguard Worker """Activate a patch, returning any created mock.""" 1914*cda5da8dSAndroid Build Coastguard Worker result = self.__enter__() 1915*cda5da8dSAndroid Build Coastguard Worker _patch._active_patches.append(self) 1916*cda5da8dSAndroid Build Coastguard Worker return result 1917*cda5da8dSAndroid Build Coastguard Worker 1918*cda5da8dSAndroid Build Coastguard Worker 1919*cda5da8dSAndroid Build Coastguard Worker def stop(self): 1920*cda5da8dSAndroid Build Coastguard Worker """Stop an active patch.""" 1921*cda5da8dSAndroid Build Coastguard Worker try: 1922*cda5da8dSAndroid Build Coastguard Worker _patch._active_patches.remove(self) 1923*cda5da8dSAndroid Build Coastguard Worker except ValueError: 1924*cda5da8dSAndroid Build Coastguard Worker # If the patch hasn't been started this will fail 1925*cda5da8dSAndroid Build Coastguard Worker return None 1926*cda5da8dSAndroid Build Coastguard Worker 1927*cda5da8dSAndroid Build Coastguard Worker return self.__exit__(None, None, None) 1928*cda5da8dSAndroid Build Coastguard Worker 1929*cda5da8dSAndroid Build Coastguard Worker 1930*cda5da8dSAndroid Build Coastguard Workerdef _clear_dict(in_dict): 1931*cda5da8dSAndroid Build Coastguard Worker try: 1932*cda5da8dSAndroid Build Coastguard Worker in_dict.clear() 1933*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 1934*cda5da8dSAndroid Build Coastguard Worker keys = list(in_dict) 1935*cda5da8dSAndroid Build Coastguard Worker for key in keys: 1936*cda5da8dSAndroid Build Coastguard Worker del in_dict[key] 1937*cda5da8dSAndroid Build Coastguard Worker 1938*cda5da8dSAndroid Build Coastguard Worker 1939*cda5da8dSAndroid Build Coastguard Workerdef _patch_stopall(): 1940*cda5da8dSAndroid Build Coastguard Worker """Stop all active patches. LIFO to unroll nested patches.""" 1941*cda5da8dSAndroid Build Coastguard Worker for patch in reversed(_patch._active_patches): 1942*cda5da8dSAndroid Build Coastguard Worker patch.stop() 1943*cda5da8dSAndroid Build Coastguard Worker 1944*cda5da8dSAndroid Build Coastguard Worker 1945*cda5da8dSAndroid Build Coastguard Workerpatch.object = _patch_object 1946*cda5da8dSAndroid Build Coastguard Workerpatch.dict = _patch_dict 1947*cda5da8dSAndroid Build Coastguard Workerpatch.multiple = _patch_multiple 1948*cda5da8dSAndroid Build Coastguard Workerpatch.stopall = _patch_stopall 1949*cda5da8dSAndroid Build Coastguard Workerpatch.TEST_PREFIX = 'test' 1950*cda5da8dSAndroid Build Coastguard Worker 1951*cda5da8dSAndroid Build Coastguard Workermagic_methods = ( 1952*cda5da8dSAndroid Build Coastguard Worker "lt le gt ge eq ne " 1953*cda5da8dSAndroid Build Coastguard Worker "getitem setitem delitem " 1954*cda5da8dSAndroid Build Coastguard Worker "len contains iter " 1955*cda5da8dSAndroid Build Coastguard Worker "hash str sizeof " 1956*cda5da8dSAndroid Build Coastguard Worker "enter exit " 1957*cda5da8dSAndroid Build Coastguard Worker # we added divmod and rdivmod here instead of numerics 1958*cda5da8dSAndroid Build Coastguard Worker # because there is no idivmod 1959*cda5da8dSAndroid Build Coastguard Worker "divmod rdivmod neg pos abs invert " 1960*cda5da8dSAndroid Build Coastguard Worker "complex int float index " 1961*cda5da8dSAndroid Build Coastguard Worker "round trunc floor ceil " 1962*cda5da8dSAndroid Build Coastguard Worker "bool next " 1963*cda5da8dSAndroid Build Coastguard Worker "fspath " 1964*cda5da8dSAndroid Build Coastguard Worker "aiter " 1965*cda5da8dSAndroid Build Coastguard Worker) 1966*cda5da8dSAndroid Build Coastguard Worker 1967*cda5da8dSAndroid Build Coastguard Workernumerics = ( 1968*cda5da8dSAndroid Build Coastguard Worker "add sub mul matmul truediv floordiv mod lshift rshift and xor or pow" 1969*cda5da8dSAndroid Build Coastguard Worker) 1970*cda5da8dSAndroid Build Coastguard Workerinplace = ' '.join('i%s' % n for n in numerics.split()) 1971*cda5da8dSAndroid Build Coastguard Workerright = ' '.join('r%s' % n for n in numerics.split()) 1972*cda5da8dSAndroid Build Coastguard Worker 1973*cda5da8dSAndroid Build Coastguard Worker# not including __prepare__, __instancecheck__, __subclasscheck__ 1974*cda5da8dSAndroid Build Coastguard Worker# (as they are metaclass methods) 1975*cda5da8dSAndroid Build Coastguard Worker# __del__ is not supported at all as it causes problems if it exists 1976*cda5da8dSAndroid Build Coastguard Worker 1977*cda5da8dSAndroid Build Coastguard Worker_non_defaults = { 1978*cda5da8dSAndroid Build Coastguard Worker '__get__', '__set__', '__delete__', '__reversed__', '__missing__', 1979*cda5da8dSAndroid Build Coastguard Worker '__reduce__', '__reduce_ex__', '__getinitargs__', '__getnewargs__', 1980*cda5da8dSAndroid Build Coastguard Worker '__getstate__', '__setstate__', '__getformat__', 1981*cda5da8dSAndroid Build Coastguard Worker '__repr__', '__dir__', '__subclasses__', '__format__', 1982*cda5da8dSAndroid Build Coastguard Worker '__getnewargs_ex__', 1983*cda5da8dSAndroid Build Coastguard Worker} 1984*cda5da8dSAndroid Build Coastguard Worker 1985*cda5da8dSAndroid Build Coastguard Worker 1986*cda5da8dSAndroid Build Coastguard Workerdef _get_method(name, func): 1987*cda5da8dSAndroid Build Coastguard Worker "Turns a callable object (like a mock) into a real function" 1988*cda5da8dSAndroid Build Coastguard Worker def method(self, /, *args, **kw): 1989*cda5da8dSAndroid Build Coastguard Worker return func(self, *args, **kw) 1990*cda5da8dSAndroid Build Coastguard Worker method.__name__ = name 1991*cda5da8dSAndroid Build Coastguard Worker return method 1992*cda5da8dSAndroid Build Coastguard Worker 1993*cda5da8dSAndroid Build Coastguard Worker 1994*cda5da8dSAndroid Build Coastguard Worker_magics = { 1995*cda5da8dSAndroid Build Coastguard Worker '__%s__' % method for method in 1996*cda5da8dSAndroid Build Coastguard Worker ' '.join([magic_methods, numerics, inplace, right]).split() 1997*cda5da8dSAndroid Build Coastguard Worker} 1998*cda5da8dSAndroid Build Coastguard Worker 1999*cda5da8dSAndroid Build Coastguard Worker# Magic methods used for async `with` statements 2000*cda5da8dSAndroid Build Coastguard Worker_async_method_magics = {"__aenter__", "__aexit__", "__anext__"} 2001*cda5da8dSAndroid Build Coastguard Worker# Magic methods that are only used with async calls but are synchronous functions themselves 2002*cda5da8dSAndroid Build Coastguard Worker_sync_async_magics = {"__aiter__"} 2003*cda5da8dSAndroid Build Coastguard Worker_async_magics = _async_method_magics | _sync_async_magics 2004*cda5da8dSAndroid Build Coastguard Worker 2005*cda5da8dSAndroid Build Coastguard Worker_all_sync_magics = _magics | _non_defaults 2006*cda5da8dSAndroid Build Coastguard Worker_all_magics = _all_sync_magics | _async_magics 2007*cda5da8dSAndroid Build Coastguard Worker 2008*cda5da8dSAndroid Build Coastguard Worker_unsupported_magics = { 2009*cda5da8dSAndroid Build Coastguard Worker '__getattr__', '__setattr__', 2010*cda5da8dSAndroid Build Coastguard Worker '__init__', '__new__', '__prepare__', 2011*cda5da8dSAndroid Build Coastguard Worker '__instancecheck__', '__subclasscheck__', 2012*cda5da8dSAndroid Build Coastguard Worker '__del__' 2013*cda5da8dSAndroid Build Coastguard Worker} 2014*cda5da8dSAndroid Build Coastguard Worker 2015*cda5da8dSAndroid Build Coastguard Worker_calculate_return_value = { 2016*cda5da8dSAndroid Build Coastguard Worker '__hash__': lambda self: object.__hash__(self), 2017*cda5da8dSAndroid Build Coastguard Worker '__str__': lambda self: object.__str__(self), 2018*cda5da8dSAndroid Build Coastguard Worker '__sizeof__': lambda self: object.__sizeof__(self), 2019*cda5da8dSAndroid Build Coastguard Worker '__fspath__': lambda self: f"{type(self).__name__}/{self._extract_mock_name()}/{id(self)}", 2020*cda5da8dSAndroid Build Coastguard Worker} 2021*cda5da8dSAndroid Build Coastguard Worker 2022*cda5da8dSAndroid Build Coastguard Worker_return_values = { 2023*cda5da8dSAndroid Build Coastguard Worker '__lt__': NotImplemented, 2024*cda5da8dSAndroid Build Coastguard Worker '__gt__': NotImplemented, 2025*cda5da8dSAndroid Build Coastguard Worker '__le__': NotImplemented, 2026*cda5da8dSAndroid Build Coastguard Worker '__ge__': NotImplemented, 2027*cda5da8dSAndroid Build Coastguard Worker '__int__': 1, 2028*cda5da8dSAndroid Build Coastguard Worker '__contains__': False, 2029*cda5da8dSAndroid Build Coastguard Worker '__len__': 0, 2030*cda5da8dSAndroid Build Coastguard Worker '__exit__': False, 2031*cda5da8dSAndroid Build Coastguard Worker '__complex__': 1j, 2032*cda5da8dSAndroid Build Coastguard Worker '__float__': 1.0, 2033*cda5da8dSAndroid Build Coastguard Worker '__bool__': True, 2034*cda5da8dSAndroid Build Coastguard Worker '__index__': 1, 2035*cda5da8dSAndroid Build Coastguard Worker '__aexit__': False, 2036*cda5da8dSAndroid Build Coastguard Worker} 2037*cda5da8dSAndroid Build Coastguard Worker 2038*cda5da8dSAndroid Build Coastguard Worker 2039*cda5da8dSAndroid Build Coastguard Workerdef _get_eq(self): 2040*cda5da8dSAndroid Build Coastguard Worker def __eq__(other): 2041*cda5da8dSAndroid Build Coastguard Worker ret_val = self.__eq__._mock_return_value 2042*cda5da8dSAndroid Build Coastguard Worker if ret_val is not DEFAULT: 2043*cda5da8dSAndroid Build Coastguard Worker return ret_val 2044*cda5da8dSAndroid Build Coastguard Worker if self is other: 2045*cda5da8dSAndroid Build Coastguard Worker return True 2046*cda5da8dSAndroid Build Coastguard Worker return NotImplemented 2047*cda5da8dSAndroid Build Coastguard Worker return __eq__ 2048*cda5da8dSAndroid Build Coastguard Worker 2049*cda5da8dSAndroid Build Coastguard Workerdef _get_ne(self): 2050*cda5da8dSAndroid Build Coastguard Worker def __ne__(other): 2051*cda5da8dSAndroid Build Coastguard Worker if self.__ne__._mock_return_value is not DEFAULT: 2052*cda5da8dSAndroid Build Coastguard Worker return DEFAULT 2053*cda5da8dSAndroid Build Coastguard Worker if self is other: 2054*cda5da8dSAndroid Build Coastguard Worker return False 2055*cda5da8dSAndroid Build Coastguard Worker return NotImplemented 2056*cda5da8dSAndroid Build Coastguard Worker return __ne__ 2057*cda5da8dSAndroid Build Coastguard Worker 2058*cda5da8dSAndroid Build Coastguard Workerdef _get_iter(self): 2059*cda5da8dSAndroid Build Coastguard Worker def __iter__(): 2060*cda5da8dSAndroid Build Coastguard Worker ret_val = self.__iter__._mock_return_value 2061*cda5da8dSAndroid Build Coastguard Worker if ret_val is DEFAULT: 2062*cda5da8dSAndroid Build Coastguard Worker return iter([]) 2063*cda5da8dSAndroid Build Coastguard Worker # if ret_val was already an iterator, then calling iter on it should 2064*cda5da8dSAndroid Build Coastguard Worker # return the iterator unchanged 2065*cda5da8dSAndroid Build Coastguard Worker return iter(ret_val) 2066*cda5da8dSAndroid Build Coastguard Worker return __iter__ 2067*cda5da8dSAndroid Build Coastguard Worker 2068*cda5da8dSAndroid Build Coastguard Workerdef _get_async_iter(self): 2069*cda5da8dSAndroid Build Coastguard Worker def __aiter__(): 2070*cda5da8dSAndroid Build Coastguard Worker ret_val = self.__aiter__._mock_return_value 2071*cda5da8dSAndroid Build Coastguard Worker if ret_val is DEFAULT: 2072*cda5da8dSAndroid Build Coastguard Worker return _AsyncIterator(iter([])) 2073*cda5da8dSAndroid Build Coastguard Worker return _AsyncIterator(iter(ret_val)) 2074*cda5da8dSAndroid Build Coastguard Worker return __aiter__ 2075*cda5da8dSAndroid Build Coastguard Worker 2076*cda5da8dSAndroid Build Coastguard Worker_side_effect_methods = { 2077*cda5da8dSAndroid Build Coastguard Worker '__eq__': _get_eq, 2078*cda5da8dSAndroid Build Coastguard Worker '__ne__': _get_ne, 2079*cda5da8dSAndroid Build Coastguard Worker '__iter__': _get_iter, 2080*cda5da8dSAndroid Build Coastguard Worker '__aiter__': _get_async_iter 2081*cda5da8dSAndroid Build Coastguard Worker} 2082*cda5da8dSAndroid Build Coastguard Worker 2083*cda5da8dSAndroid Build Coastguard Worker 2084*cda5da8dSAndroid Build Coastguard Worker 2085*cda5da8dSAndroid Build Coastguard Workerdef _set_return_value(mock, method, name): 2086*cda5da8dSAndroid Build Coastguard Worker fixed = _return_values.get(name, DEFAULT) 2087*cda5da8dSAndroid Build Coastguard Worker if fixed is not DEFAULT: 2088*cda5da8dSAndroid Build Coastguard Worker method.return_value = fixed 2089*cda5da8dSAndroid Build Coastguard Worker return 2090*cda5da8dSAndroid Build Coastguard Worker 2091*cda5da8dSAndroid Build Coastguard Worker return_calculator = _calculate_return_value.get(name) 2092*cda5da8dSAndroid Build Coastguard Worker if return_calculator is not None: 2093*cda5da8dSAndroid Build Coastguard Worker return_value = return_calculator(mock) 2094*cda5da8dSAndroid Build Coastguard Worker method.return_value = return_value 2095*cda5da8dSAndroid Build Coastguard Worker return 2096*cda5da8dSAndroid Build Coastguard Worker 2097*cda5da8dSAndroid Build Coastguard Worker side_effector = _side_effect_methods.get(name) 2098*cda5da8dSAndroid Build Coastguard Worker if side_effector is not None: 2099*cda5da8dSAndroid Build Coastguard Worker method.side_effect = side_effector(mock) 2100*cda5da8dSAndroid Build Coastguard Worker 2101*cda5da8dSAndroid Build Coastguard Worker 2102*cda5da8dSAndroid Build Coastguard Worker 2103*cda5da8dSAndroid Build Coastguard Workerclass MagicMixin(Base): 2104*cda5da8dSAndroid Build Coastguard Worker def __init__(self, /, *args, **kw): 2105*cda5da8dSAndroid Build Coastguard Worker self._mock_set_magics() # make magic work for kwargs in init 2106*cda5da8dSAndroid Build Coastguard Worker _safe_super(MagicMixin, self).__init__(*args, **kw) 2107*cda5da8dSAndroid Build Coastguard Worker self._mock_set_magics() # fix magic broken by upper level init 2108*cda5da8dSAndroid Build Coastguard Worker 2109*cda5da8dSAndroid Build Coastguard Worker 2110*cda5da8dSAndroid Build Coastguard Worker def _mock_set_magics(self): 2111*cda5da8dSAndroid Build Coastguard Worker orig_magics = _magics | _async_method_magics 2112*cda5da8dSAndroid Build Coastguard Worker these_magics = orig_magics 2113*cda5da8dSAndroid Build Coastguard Worker 2114*cda5da8dSAndroid Build Coastguard Worker if getattr(self, "_mock_methods", None) is not None: 2115*cda5da8dSAndroid Build Coastguard Worker these_magics = orig_magics.intersection(self._mock_methods) 2116*cda5da8dSAndroid Build Coastguard Worker 2117*cda5da8dSAndroid Build Coastguard Worker remove_magics = set() 2118*cda5da8dSAndroid Build Coastguard Worker remove_magics = orig_magics - these_magics 2119*cda5da8dSAndroid Build Coastguard Worker 2120*cda5da8dSAndroid Build Coastguard Worker for entry in remove_magics: 2121*cda5da8dSAndroid Build Coastguard Worker if entry in type(self).__dict__: 2122*cda5da8dSAndroid Build Coastguard Worker # remove unneeded magic methods 2123*cda5da8dSAndroid Build Coastguard Worker delattr(self, entry) 2124*cda5da8dSAndroid Build Coastguard Worker 2125*cda5da8dSAndroid Build Coastguard Worker # don't overwrite existing attributes if called a second time 2126*cda5da8dSAndroid Build Coastguard Worker these_magics = these_magics - set(type(self).__dict__) 2127*cda5da8dSAndroid Build Coastguard Worker 2128*cda5da8dSAndroid Build Coastguard Worker _type = type(self) 2129*cda5da8dSAndroid Build Coastguard Worker for entry in these_magics: 2130*cda5da8dSAndroid Build Coastguard Worker setattr(_type, entry, MagicProxy(entry, self)) 2131*cda5da8dSAndroid Build Coastguard Worker 2132*cda5da8dSAndroid Build Coastguard Worker 2133*cda5da8dSAndroid Build Coastguard Worker 2134*cda5da8dSAndroid Build Coastguard Workerclass NonCallableMagicMock(MagicMixin, NonCallableMock): 2135*cda5da8dSAndroid Build Coastguard Worker """A version of `MagicMock` that isn't callable.""" 2136*cda5da8dSAndroid Build Coastguard Worker def mock_add_spec(self, spec, spec_set=False): 2137*cda5da8dSAndroid Build Coastguard Worker """Add a spec to a mock. `spec` can either be an object or a 2138*cda5da8dSAndroid Build Coastguard Worker list of strings. Only attributes on the `spec` can be fetched as 2139*cda5da8dSAndroid Build Coastguard Worker attributes from the mock. 2140*cda5da8dSAndroid Build Coastguard Worker 2141*cda5da8dSAndroid Build Coastguard Worker If `spec_set` is True then only attributes on the spec can be set.""" 2142*cda5da8dSAndroid Build Coastguard Worker self._mock_add_spec(spec, spec_set) 2143*cda5da8dSAndroid Build Coastguard Worker self._mock_set_magics() 2144*cda5da8dSAndroid Build Coastguard Worker 2145*cda5da8dSAndroid Build Coastguard Worker 2146*cda5da8dSAndroid Build Coastguard Workerclass AsyncMagicMixin(MagicMixin): 2147*cda5da8dSAndroid Build Coastguard Worker def __init__(self, /, *args, **kw): 2148*cda5da8dSAndroid Build Coastguard Worker self._mock_set_magics() # make magic work for kwargs in init 2149*cda5da8dSAndroid Build Coastguard Worker _safe_super(AsyncMagicMixin, self).__init__(*args, **kw) 2150*cda5da8dSAndroid Build Coastguard Worker self._mock_set_magics() # fix magic broken by upper level init 2151*cda5da8dSAndroid Build Coastguard Worker 2152*cda5da8dSAndroid Build Coastguard Workerclass MagicMock(MagicMixin, Mock): 2153*cda5da8dSAndroid Build Coastguard Worker """ 2154*cda5da8dSAndroid Build Coastguard Worker MagicMock is a subclass of Mock with default implementations 2155*cda5da8dSAndroid Build Coastguard Worker of most of the magic methods. You can use MagicMock without having to 2156*cda5da8dSAndroid Build Coastguard Worker configure the magic methods yourself. 2157*cda5da8dSAndroid Build Coastguard Worker 2158*cda5da8dSAndroid Build Coastguard Worker If you use the `spec` or `spec_set` arguments then *only* magic 2159*cda5da8dSAndroid Build Coastguard Worker methods that exist in the spec will be created. 2160*cda5da8dSAndroid Build Coastguard Worker 2161*cda5da8dSAndroid Build Coastguard Worker Attributes and the return value of a `MagicMock` will also be `MagicMocks`. 2162*cda5da8dSAndroid Build Coastguard Worker """ 2163*cda5da8dSAndroid Build Coastguard Worker def mock_add_spec(self, spec, spec_set=False): 2164*cda5da8dSAndroid Build Coastguard Worker """Add a spec to a mock. `spec` can either be an object or a 2165*cda5da8dSAndroid Build Coastguard Worker list of strings. Only attributes on the `spec` can be fetched as 2166*cda5da8dSAndroid Build Coastguard Worker attributes from the mock. 2167*cda5da8dSAndroid Build Coastguard Worker 2168*cda5da8dSAndroid Build Coastguard Worker If `spec_set` is True then only attributes on the spec can be set.""" 2169*cda5da8dSAndroid Build Coastguard Worker self._mock_add_spec(spec, spec_set) 2170*cda5da8dSAndroid Build Coastguard Worker self._mock_set_magics() 2171*cda5da8dSAndroid Build Coastguard Worker 2172*cda5da8dSAndroid Build Coastguard Worker 2173*cda5da8dSAndroid Build Coastguard Worker 2174*cda5da8dSAndroid Build Coastguard Workerclass MagicProxy(Base): 2175*cda5da8dSAndroid Build Coastguard Worker def __init__(self, name, parent): 2176*cda5da8dSAndroid Build Coastguard Worker self.name = name 2177*cda5da8dSAndroid Build Coastguard Worker self.parent = parent 2178*cda5da8dSAndroid Build Coastguard Worker 2179*cda5da8dSAndroid Build Coastguard Worker def create_mock(self): 2180*cda5da8dSAndroid Build Coastguard Worker entry = self.name 2181*cda5da8dSAndroid Build Coastguard Worker parent = self.parent 2182*cda5da8dSAndroid Build Coastguard Worker m = parent._get_child_mock(name=entry, _new_name=entry, 2183*cda5da8dSAndroid Build Coastguard Worker _new_parent=parent) 2184*cda5da8dSAndroid Build Coastguard Worker setattr(parent, entry, m) 2185*cda5da8dSAndroid Build Coastguard Worker _set_return_value(parent, m, entry) 2186*cda5da8dSAndroid Build Coastguard Worker return m 2187*cda5da8dSAndroid Build Coastguard Worker 2188*cda5da8dSAndroid Build Coastguard Worker def __get__(self, obj, _type=None): 2189*cda5da8dSAndroid Build Coastguard Worker return self.create_mock() 2190*cda5da8dSAndroid Build Coastguard Worker 2191*cda5da8dSAndroid Build Coastguard Worker 2192*cda5da8dSAndroid Build Coastguard Workerclass AsyncMockMixin(Base): 2193*cda5da8dSAndroid Build Coastguard Worker await_count = _delegating_property('await_count') 2194*cda5da8dSAndroid Build Coastguard Worker await_args = _delegating_property('await_args') 2195*cda5da8dSAndroid Build Coastguard Worker await_args_list = _delegating_property('await_args_list') 2196*cda5da8dSAndroid Build Coastguard Worker 2197*cda5da8dSAndroid Build Coastguard Worker def __init__(self, /, *args, **kwargs): 2198*cda5da8dSAndroid Build Coastguard Worker super().__init__(*args, **kwargs) 2199*cda5da8dSAndroid Build Coastguard Worker # iscoroutinefunction() checks _is_coroutine property to say if an 2200*cda5da8dSAndroid Build Coastguard Worker # object is a coroutine. Without this check it looks to see if it is a 2201*cda5da8dSAndroid Build Coastguard Worker # function/method, which in this case it is not (since it is an 2202*cda5da8dSAndroid Build Coastguard Worker # AsyncMock). 2203*cda5da8dSAndroid Build Coastguard Worker # It is set through __dict__ because when spec_set is True, this 2204*cda5da8dSAndroid Build Coastguard Worker # attribute is likely undefined. 2205*cda5da8dSAndroid Build Coastguard Worker self.__dict__['_is_coroutine'] = asyncio.coroutines._is_coroutine 2206*cda5da8dSAndroid Build Coastguard Worker self.__dict__['_mock_await_count'] = 0 2207*cda5da8dSAndroid Build Coastguard Worker self.__dict__['_mock_await_args'] = None 2208*cda5da8dSAndroid Build Coastguard Worker self.__dict__['_mock_await_args_list'] = _CallList() 2209*cda5da8dSAndroid Build Coastguard Worker code_mock = NonCallableMock(spec_set=CodeType) 2210*cda5da8dSAndroid Build Coastguard Worker code_mock.co_flags = ( 2211*cda5da8dSAndroid Build Coastguard Worker inspect.CO_COROUTINE 2212*cda5da8dSAndroid Build Coastguard Worker + inspect.CO_VARARGS 2213*cda5da8dSAndroid Build Coastguard Worker + inspect.CO_VARKEYWORDS 2214*cda5da8dSAndroid Build Coastguard Worker ) 2215*cda5da8dSAndroid Build Coastguard Worker code_mock.co_argcount = 0 2216*cda5da8dSAndroid Build Coastguard Worker code_mock.co_varnames = ('args', 'kwargs') 2217*cda5da8dSAndroid Build Coastguard Worker code_mock.co_posonlyargcount = 0 2218*cda5da8dSAndroid Build Coastguard Worker code_mock.co_kwonlyargcount = 0 2219*cda5da8dSAndroid Build Coastguard Worker self.__dict__['__code__'] = code_mock 2220*cda5da8dSAndroid Build Coastguard Worker self.__dict__['__name__'] = 'AsyncMock' 2221*cda5da8dSAndroid Build Coastguard Worker self.__dict__['__defaults__'] = tuple() 2222*cda5da8dSAndroid Build Coastguard Worker self.__dict__['__kwdefaults__'] = {} 2223*cda5da8dSAndroid Build Coastguard Worker self.__dict__['__annotations__'] = None 2224*cda5da8dSAndroid Build Coastguard Worker 2225*cda5da8dSAndroid Build Coastguard Worker async def _execute_mock_call(self, /, *args, **kwargs): 2226*cda5da8dSAndroid Build Coastguard Worker # This is nearly just like super(), except for special handling 2227*cda5da8dSAndroid Build Coastguard Worker # of coroutines 2228*cda5da8dSAndroid Build Coastguard Worker 2229*cda5da8dSAndroid Build Coastguard Worker _call = _Call((args, kwargs), two=True) 2230*cda5da8dSAndroid Build Coastguard Worker self.await_count += 1 2231*cda5da8dSAndroid Build Coastguard Worker self.await_args = _call 2232*cda5da8dSAndroid Build Coastguard Worker self.await_args_list.append(_call) 2233*cda5da8dSAndroid Build Coastguard Worker 2234*cda5da8dSAndroid Build Coastguard Worker effect = self.side_effect 2235*cda5da8dSAndroid Build Coastguard Worker if effect is not None: 2236*cda5da8dSAndroid Build Coastguard Worker if _is_exception(effect): 2237*cda5da8dSAndroid Build Coastguard Worker raise effect 2238*cda5da8dSAndroid Build Coastguard Worker elif not _callable(effect): 2239*cda5da8dSAndroid Build Coastguard Worker try: 2240*cda5da8dSAndroid Build Coastguard Worker result = next(effect) 2241*cda5da8dSAndroid Build Coastguard Worker except StopIteration: 2242*cda5da8dSAndroid Build Coastguard Worker # It is impossible to propagate a StopIteration 2243*cda5da8dSAndroid Build Coastguard Worker # through coroutines because of PEP 479 2244*cda5da8dSAndroid Build Coastguard Worker raise StopAsyncIteration 2245*cda5da8dSAndroid Build Coastguard Worker if _is_exception(result): 2246*cda5da8dSAndroid Build Coastguard Worker raise result 2247*cda5da8dSAndroid Build Coastguard Worker elif iscoroutinefunction(effect): 2248*cda5da8dSAndroid Build Coastguard Worker result = await effect(*args, **kwargs) 2249*cda5da8dSAndroid Build Coastguard Worker else: 2250*cda5da8dSAndroid Build Coastguard Worker result = effect(*args, **kwargs) 2251*cda5da8dSAndroid Build Coastguard Worker 2252*cda5da8dSAndroid Build Coastguard Worker if result is not DEFAULT: 2253*cda5da8dSAndroid Build Coastguard Worker return result 2254*cda5da8dSAndroid Build Coastguard Worker 2255*cda5da8dSAndroid Build Coastguard Worker if self._mock_return_value is not DEFAULT: 2256*cda5da8dSAndroid Build Coastguard Worker return self.return_value 2257*cda5da8dSAndroid Build Coastguard Worker 2258*cda5da8dSAndroid Build Coastguard Worker if self._mock_wraps is not None: 2259*cda5da8dSAndroid Build Coastguard Worker if iscoroutinefunction(self._mock_wraps): 2260*cda5da8dSAndroid Build Coastguard Worker return await self._mock_wraps(*args, **kwargs) 2261*cda5da8dSAndroid Build Coastguard Worker return self._mock_wraps(*args, **kwargs) 2262*cda5da8dSAndroid Build Coastguard Worker 2263*cda5da8dSAndroid Build Coastguard Worker return self.return_value 2264*cda5da8dSAndroid Build Coastguard Worker 2265*cda5da8dSAndroid Build Coastguard Worker def assert_awaited(self): 2266*cda5da8dSAndroid Build Coastguard Worker """ 2267*cda5da8dSAndroid Build Coastguard Worker Assert that the mock was awaited at least once. 2268*cda5da8dSAndroid Build Coastguard Worker """ 2269*cda5da8dSAndroid Build Coastguard Worker if self.await_count == 0: 2270*cda5da8dSAndroid Build Coastguard Worker msg = f"Expected {self._mock_name or 'mock'} to have been awaited." 2271*cda5da8dSAndroid Build Coastguard Worker raise AssertionError(msg) 2272*cda5da8dSAndroid Build Coastguard Worker 2273*cda5da8dSAndroid Build Coastguard Worker def assert_awaited_once(self): 2274*cda5da8dSAndroid Build Coastguard Worker """ 2275*cda5da8dSAndroid Build Coastguard Worker Assert that the mock was awaited exactly once. 2276*cda5da8dSAndroid Build Coastguard Worker """ 2277*cda5da8dSAndroid Build Coastguard Worker if not self.await_count == 1: 2278*cda5da8dSAndroid Build Coastguard Worker msg = (f"Expected {self._mock_name or 'mock'} to have been awaited once." 2279*cda5da8dSAndroid Build Coastguard Worker f" Awaited {self.await_count} times.") 2280*cda5da8dSAndroid Build Coastguard Worker raise AssertionError(msg) 2281*cda5da8dSAndroid Build Coastguard Worker 2282*cda5da8dSAndroid Build Coastguard Worker def assert_awaited_with(self, /, *args, **kwargs): 2283*cda5da8dSAndroid Build Coastguard Worker """ 2284*cda5da8dSAndroid Build Coastguard Worker Assert that the last await was with the specified arguments. 2285*cda5da8dSAndroid Build Coastguard Worker """ 2286*cda5da8dSAndroid Build Coastguard Worker if self.await_args is None: 2287*cda5da8dSAndroid Build Coastguard Worker expected = self._format_mock_call_signature(args, kwargs) 2288*cda5da8dSAndroid Build Coastguard Worker raise AssertionError(f'Expected await: {expected}\nNot awaited') 2289*cda5da8dSAndroid Build Coastguard Worker 2290*cda5da8dSAndroid Build Coastguard Worker def _error_message(): 2291*cda5da8dSAndroid Build Coastguard Worker msg = self._format_mock_failure_message(args, kwargs, action='await') 2292*cda5da8dSAndroid Build Coastguard Worker return msg 2293*cda5da8dSAndroid Build Coastguard Worker 2294*cda5da8dSAndroid Build Coastguard Worker expected = self._call_matcher(_Call((args, kwargs), two=True)) 2295*cda5da8dSAndroid Build Coastguard Worker actual = self._call_matcher(self.await_args) 2296*cda5da8dSAndroid Build Coastguard Worker if actual != expected: 2297*cda5da8dSAndroid Build Coastguard Worker cause = expected if isinstance(expected, Exception) else None 2298*cda5da8dSAndroid Build Coastguard Worker raise AssertionError(_error_message()) from cause 2299*cda5da8dSAndroid Build Coastguard Worker 2300*cda5da8dSAndroid Build Coastguard Worker def assert_awaited_once_with(self, /, *args, **kwargs): 2301*cda5da8dSAndroid Build Coastguard Worker """ 2302*cda5da8dSAndroid Build Coastguard Worker Assert that the mock was awaited exactly once and with the specified 2303*cda5da8dSAndroid Build Coastguard Worker arguments. 2304*cda5da8dSAndroid Build Coastguard Worker """ 2305*cda5da8dSAndroid Build Coastguard Worker if not self.await_count == 1: 2306*cda5da8dSAndroid Build Coastguard Worker msg = (f"Expected {self._mock_name or 'mock'} to have been awaited once." 2307*cda5da8dSAndroid Build Coastguard Worker f" Awaited {self.await_count} times.") 2308*cda5da8dSAndroid Build Coastguard Worker raise AssertionError(msg) 2309*cda5da8dSAndroid Build Coastguard Worker return self.assert_awaited_with(*args, **kwargs) 2310*cda5da8dSAndroid Build Coastguard Worker 2311*cda5da8dSAndroid Build Coastguard Worker def assert_any_await(self, /, *args, **kwargs): 2312*cda5da8dSAndroid Build Coastguard Worker """ 2313*cda5da8dSAndroid Build Coastguard Worker Assert the mock has ever been awaited with the specified arguments. 2314*cda5da8dSAndroid Build Coastguard Worker """ 2315*cda5da8dSAndroid Build Coastguard Worker expected = self._call_matcher(_Call((args, kwargs), two=True)) 2316*cda5da8dSAndroid Build Coastguard Worker cause = expected if isinstance(expected, Exception) else None 2317*cda5da8dSAndroid Build Coastguard Worker actual = [self._call_matcher(c) for c in self.await_args_list] 2318*cda5da8dSAndroid Build Coastguard Worker if cause or expected not in _AnyComparer(actual): 2319*cda5da8dSAndroid Build Coastguard Worker expected_string = self._format_mock_call_signature(args, kwargs) 2320*cda5da8dSAndroid Build Coastguard Worker raise AssertionError( 2321*cda5da8dSAndroid Build Coastguard Worker '%s await not found' % expected_string 2322*cda5da8dSAndroid Build Coastguard Worker ) from cause 2323*cda5da8dSAndroid Build Coastguard Worker 2324*cda5da8dSAndroid Build Coastguard Worker def assert_has_awaits(self, calls, any_order=False): 2325*cda5da8dSAndroid Build Coastguard Worker """ 2326*cda5da8dSAndroid Build Coastguard Worker Assert the mock has been awaited with the specified calls. 2327*cda5da8dSAndroid Build Coastguard Worker The :attr:`await_args_list` list is checked for the awaits. 2328*cda5da8dSAndroid Build Coastguard Worker 2329*cda5da8dSAndroid Build Coastguard Worker If `any_order` is False (the default) then the awaits must be 2330*cda5da8dSAndroid Build Coastguard Worker sequential. There can be extra calls before or after the 2331*cda5da8dSAndroid Build Coastguard Worker specified awaits. 2332*cda5da8dSAndroid Build Coastguard Worker 2333*cda5da8dSAndroid Build Coastguard Worker If `any_order` is True then the awaits can be in any order, but 2334*cda5da8dSAndroid Build Coastguard Worker they must all appear in :attr:`await_args_list`. 2335*cda5da8dSAndroid Build Coastguard Worker """ 2336*cda5da8dSAndroid Build Coastguard Worker expected = [self._call_matcher(c) for c in calls] 2337*cda5da8dSAndroid Build Coastguard Worker cause = next((e for e in expected if isinstance(e, Exception)), None) 2338*cda5da8dSAndroid Build Coastguard Worker all_awaits = _CallList(self._call_matcher(c) for c in self.await_args_list) 2339*cda5da8dSAndroid Build Coastguard Worker if not any_order: 2340*cda5da8dSAndroid Build Coastguard Worker if expected not in all_awaits: 2341*cda5da8dSAndroid Build Coastguard Worker if cause is None: 2342*cda5da8dSAndroid Build Coastguard Worker problem = 'Awaits not found.' 2343*cda5da8dSAndroid Build Coastguard Worker else: 2344*cda5da8dSAndroid Build Coastguard Worker problem = ('Error processing expected awaits.\n' 2345*cda5da8dSAndroid Build Coastguard Worker 'Errors: {}').format( 2346*cda5da8dSAndroid Build Coastguard Worker [e if isinstance(e, Exception) else None 2347*cda5da8dSAndroid Build Coastguard Worker for e in expected]) 2348*cda5da8dSAndroid Build Coastguard Worker raise AssertionError( 2349*cda5da8dSAndroid Build Coastguard Worker f'{problem}\n' 2350*cda5da8dSAndroid Build Coastguard Worker f'Expected: {_CallList(calls)}\n' 2351*cda5da8dSAndroid Build Coastguard Worker f'Actual: {self.await_args_list}' 2352*cda5da8dSAndroid Build Coastguard Worker ) from cause 2353*cda5da8dSAndroid Build Coastguard Worker return 2354*cda5da8dSAndroid Build Coastguard Worker 2355*cda5da8dSAndroid Build Coastguard Worker all_awaits = list(all_awaits) 2356*cda5da8dSAndroid Build Coastguard Worker 2357*cda5da8dSAndroid Build Coastguard Worker not_found = [] 2358*cda5da8dSAndroid Build Coastguard Worker for kall in expected: 2359*cda5da8dSAndroid Build Coastguard Worker try: 2360*cda5da8dSAndroid Build Coastguard Worker all_awaits.remove(kall) 2361*cda5da8dSAndroid Build Coastguard Worker except ValueError: 2362*cda5da8dSAndroid Build Coastguard Worker not_found.append(kall) 2363*cda5da8dSAndroid Build Coastguard Worker if not_found: 2364*cda5da8dSAndroid Build Coastguard Worker raise AssertionError( 2365*cda5da8dSAndroid Build Coastguard Worker '%r not all found in await list' % (tuple(not_found),) 2366*cda5da8dSAndroid Build Coastguard Worker ) from cause 2367*cda5da8dSAndroid Build Coastguard Worker 2368*cda5da8dSAndroid Build Coastguard Worker def assert_not_awaited(self): 2369*cda5da8dSAndroid Build Coastguard Worker """ 2370*cda5da8dSAndroid Build Coastguard Worker Assert that the mock was never awaited. 2371*cda5da8dSAndroid Build Coastguard Worker """ 2372*cda5da8dSAndroid Build Coastguard Worker if self.await_count != 0: 2373*cda5da8dSAndroid Build Coastguard Worker msg = (f"Expected {self._mock_name or 'mock'} to not have been awaited." 2374*cda5da8dSAndroid Build Coastguard Worker f" Awaited {self.await_count} times.") 2375*cda5da8dSAndroid Build Coastguard Worker raise AssertionError(msg) 2376*cda5da8dSAndroid Build Coastguard Worker 2377*cda5da8dSAndroid Build Coastguard Worker def reset_mock(self, /, *args, **kwargs): 2378*cda5da8dSAndroid Build Coastguard Worker """ 2379*cda5da8dSAndroid Build Coastguard Worker See :func:`.Mock.reset_mock()` 2380*cda5da8dSAndroid Build Coastguard Worker """ 2381*cda5da8dSAndroid Build Coastguard Worker super().reset_mock(*args, **kwargs) 2382*cda5da8dSAndroid Build Coastguard Worker self.await_count = 0 2383*cda5da8dSAndroid Build Coastguard Worker self.await_args = None 2384*cda5da8dSAndroid Build Coastguard Worker self.await_args_list = _CallList() 2385*cda5da8dSAndroid Build Coastguard Worker 2386*cda5da8dSAndroid Build Coastguard Worker 2387*cda5da8dSAndroid Build Coastguard Workerclass AsyncMock(AsyncMockMixin, AsyncMagicMixin, Mock): 2388*cda5da8dSAndroid Build Coastguard Worker """ 2389*cda5da8dSAndroid Build Coastguard Worker Enhance :class:`Mock` with features allowing to mock 2390*cda5da8dSAndroid Build Coastguard Worker an async function. 2391*cda5da8dSAndroid Build Coastguard Worker 2392*cda5da8dSAndroid Build Coastguard Worker The :class:`AsyncMock` object will behave so the object is 2393*cda5da8dSAndroid Build Coastguard Worker recognized as an async function, and the result of a call is an awaitable: 2394*cda5da8dSAndroid Build Coastguard Worker 2395*cda5da8dSAndroid Build Coastguard Worker >>> mock = AsyncMock() 2396*cda5da8dSAndroid Build Coastguard Worker >>> iscoroutinefunction(mock) 2397*cda5da8dSAndroid Build Coastguard Worker True 2398*cda5da8dSAndroid Build Coastguard Worker >>> inspect.isawaitable(mock()) 2399*cda5da8dSAndroid Build Coastguard Worker True 2400*cda5da8dSAndroid Build Coastguard Worker 2401*cda5da8dSAndroid Build Coastguard Worker 2402*cda5da8dSAndroid Build Coastguard Worker The result of ``mock()`` is an async function which will have the outcome 2403*cda5da8dSAndroid Build Coastguard Worker of ``side_effect`` or ``return_value``: 2404*cda5da8dSAndroid Build Coastguard Worker 2405*cda5da8dSAndroid Build Coastguard Worker - if ``side_effect`` is a function, the async function will return the 2406*cda5da8dSAndroid Build Coastguard Worker result of that function, 2407*cda5da8dSAndroid Build Coastguard Worker - if ``side_effect`` is an exception, the async function will raise the 2408*cda5da8dSAndroid Build Coastguard Worker exception, 2409*cda5da8dSAndroid Build Coastguard Worker - if ``side_effect`` is an iterable, the async function will return the 2410*cda5da8dSAndroid Build Coastguard Worker next value of the iterable, however, if the sequence of result is 2411*cda5da8dSAndroid Build Coastguard Worker exhausted, ``StopIteration`` is raised immediately, 2412*cda5da8dSAndroid Build Coastguard Worker - if ``side_effect`` is not defined, the async function will return the 2413*cda5da8dSAndroid Build Coastguard Worker value defined by ``return_value``, hence, by default, the async function 2414*cda5da8dSAndroid Build Coastguard Worker returns a new :class:`AsyncMock` object. 2415*cda5da8dSAndroid Build Coastguard Worker 2416*cda5da8dSAndroid Build Coastguard Worker If the outcome of ``side_effect`` or ``return_value`` is an async function, 2417*cda5da8dSAndroid Build Coastguard Worker the mock async function obtained when the mock object is called will be this 2418*cda5da8dSAndroid Build Coastguard Worker async function itself (and not an async function returning an async 2419*cda5da8dSAndroid Build Coastguard Worker function). 2420*cda5da8dSAndroid Build Coastguard Worker 2421*cda5da8dSAndroid Build Coastguard Worker The test author can also specify a wrapped object with ``wraps``. In this 2422*cda5da8dSAndroid Build Coastguard Worker case, the :class:`Mock` object behavior is the same as with an 2423*cda5da8dSAndroid Build Coastguard Worker :class:`.Mock` object: the wrapped object may have methods 2424*cda5da8dSAndroid Build Coastguard Worker defined as async function functions. 2425*cda5da8dSAndroid Build Coastguard Worker 2426*cda5da8dSAndroid Build Coastguard Worker Based on Martin Richard's asynctest project. 2427*cda5da8dSAndroid Build Coastguard Worker """ 2428*cda5da8dSAndroid Build Coastguard Worker 2429*cda5da8dSAndroid Build Coastguard Worker 2430*cda5da8dSAndroid Build Coastguard Workerclass _ANY(object): 2431*cda5da8dSAndroid Build Coastguard Worker "A helper object that compares equal to everything." 2432*cda5da8dSAndroid Build Coastguard Worker 2433*cda5da8dSAndroid Build Coastguard Worker def __eq__(self, other): 2434*cda5da8dSAndroid Build Coastguard Worker return True 2435*cda5da8dSAndroid Build Coastguard Worker 2436*cda5da8dSAndroid Build Coastguard Worker def __ne__(self, other): 2437*cda5da8dSAndroid Build Coastguard Worker return False 2438*cda5da8dSAndroid Build Coastguard Worker 2439*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 2440*cda5da8dSAndroid Build Coastguard Worker return '<ANY>' 2441*cda5da8dSAndroid Build Coastguard Worker 2442*cda5da8dSAndroid Build Coastguard WorkerANY = _ANY() 2443*cda5da8dSAndroid Build Coastguard Worker 2444*cda5da8dSAndroid Build Coastguard Worker 2445*cda5da8dSAndroid Build Coastguard Worker 2446*cda5da8dSAndroid Build Coastguard Workerdef _format_call_signature(name, args, kwargs): 2447*cda5da8dSAndroid Build Coastguard Worker message = '%s(%%s)' % name 2448*cda5da8dSAndroid Build Coastguard Worker formatted_args = '' 2449*cda5da8dSAndroid Build Coastguard Worker args_string = ', '.join([repr(arg) for arg in args]) 2450*cda5da8dSAndroid Build Coastguard Worker kwargs_string = ', '.join([ 2451*cda5da8dSAndroid Build Coastguard Worker '%s=%r' % (key, value) for key, value in kwargs.items() 2452*cda5da8dSAndroid Build Coastguard Worker ]) 2453*cda5da8dSAndroid Build Coastguard Worker if args_string: 2454*cda5da8dSAndroid Build Coastguard Worker formatted_args = args_string 2455*cda5da8dSAndroid Build Coastguard Worker if kwargs_string: 2456*cda5da8dSAndroid Build Coastguard Worker if formatted_args: 2457*cda5da8dSAndroid Build Coastguard Worker formatted_args += ', ' 2458*cda5da8dSAndroid Build Coastguard Worker formatted_args += kwargs_string 2459*cda5da8dSAndroid Build Coastguard Worker 2460*cda5da8dSAndroid Build Coastguard Worker return message % formatted_args 2461*cda5da8dSAndroid Build Coastguard Worker 2462*cda5da8dSAndroid Build Coastguard Worker 2463*cda5da8dSAndroid Build Coastguard Worker 2464*cda5da8dSAndroid Build Coastguard Workerclass _Call(tuple): 2465*cda5da8dSAndroid Build Coastguard Worker """ 2466*cda5da8dSAndroid Build Coastguard Worker A tuple for holding the results of a call to a mock, either in the form 2467*cda5da8dSAndroid Build Coastguard Worker `(args, kwargs)` or `(name, args, kwargs)`. 2468*cda5da8dSAndroid Build Coastguard Worker 2469*cda5da8dSAndroid Build Coastguard Worker If args or kwargs are empty then a call tuple will compare equal to 2470*cda5da8dSAndroid Build Coastguard Worker a tuple without those values. This makes comparisons less verbose:: 2471*cda5da8dSAndroid Build Coastguard Worker 2472*cda5da8dSAndroid Build Coastguard Worker _Call(('name', (), {})) == ('name',) 2473*cda5da8dSAndroid Build Coastguard Worker _Call(('name', (1,), {})) == ('name', (1,)) 2474*cda5da8dSAndroid Build Coastguard Worker _Call(((), {'a': 'b'})) == ({'a': 'b'},) 2475*cda5da8dSAndroid Build Coastguard Worker 2476*cda5da8dSAndroid Build Coastguard Worker The `_Call` object provides a useful shortcut for comparing with call:: 2477*cda5da8dSAndroid Build Coastguard Worker 2478*cda5da8dSAndroid Build Coastguard Worker _Call(((1, 2), {'a': 3})) == call(1, 2, a=3) 2479*cda5da8dSAndroid Build Coastguard Worker _Call(('foo', (1, 2), {'a': 3})) == call.foo(1, 2, a=3) 2480*cda5da8dSAndroid Build Coastguard Worker 2481*cda5da8dSAndroid Build Coastguard Worker If the _Call has no name then it will match any name. 2482*cda5da8dSAndroid Build Coastguard Worker """ 2483*cda5da8dSAndroid Build Coastguard Worker def __new__(cls, value=(), name='', parent=None, two=False, 2484*cda5da8dSAndroid Build Coastguard Worker from_kall=True): 2485*cda5da8dSAndroid Build Coastguard Worker args = () 2486*cda5da8dSAndroid Build Coastguard Worker kwargs = {} 2487*cda5da8dSAndroid Build Coastguard Worker _len = len(value) 2488*cda5da8dSAndroid Build Coastguard Worker if _len == 3: 2489*cda5da8dSAndroid Build Coastguard Worker name, args, kwargs = value 2490*cda5da8dSAndroid Build Coastguard Worker elif _len == 2: 2491*cda5da8dSAndroid Build Coastguard Worker first, second = value 2492*cda5da8dSAndroid Build Coastguard Worker if isinstance(first, str): 2493*cda5da8dSAndroid Build Coastguard Worker name = first 2494*cda5da8dSAndroid Build Coastguard Worker if isinstance(second, tuple): 2495*cda5da8dSAndroid Build Coastguard Worker args = second 2496*cda5da8dSAndroid Build Coastguard Worker else: 2497*cda5da8dSAndroid Build Coastguard Worker kwargs = second 2498*cda5da8dSAndroid Build Coastguard Worker else: 2499*cda5da8dSAndroid Build Coastguard Worker args, kwargs = first, second 2500*cda5da8dSAndroid Build Coastguard Worker elif _len == 1: 2501*cda5da8dSAndroid Build Coastguard Worker value, = value 2502*cda5da8dSAndroid Build Coastguard Worker if isinstance(value, str): 2503*cda5da8dSAndroid Build Coastguard Worker name = value 2504*cda5da8dSAndroid Build Coastguard Worker elif isinstance(value, tuple): 2505*cda5da8dSAndroid Build Coastguard Worker args = value 2506*cda5da8dSAndroid Build Coastguard Worker else: 2507*cda5da8dSAndroid Build Coastguard Worker kwargs = value 2508*cda5da8dSAndroid Build Coastguard Worker 2509*cda5da8dSAndroid Build Coastguard Worker if two: 2510*cda5da8dSAndroid Build Coastguard Worker return tuple.__new__(cls, (args, kwargs)) 2511*cda5da8dSAndroid Build Coastguard Worker 2512*cda5da8dSAndroid Build Coastguard Worker return tuple.__new__(cls, (name, args, kwargs)) 2513*cda5da8dSAndroid Build Coastguard Worker 2514*cda5da8dSAndroid Build Coastguard Worker 2515*cda5da8dSAndroid Build Coastguard Worker def __init__(self, value=(), name=None, parent=None, two=False, 2516*cda5da8dSAndroid Build Coastguard Worker from_kall=True): 2517*cda5da8dSAndroid Build Coastguard Worker self._mock_name = name 2518*cda5da8dSAndroid Build Coastguard Worker self._mock_parent = parent 2519*cda5da8dSAndroid Build Coastguard Worker self._mock_from_kall = from_kall 2520*cda5da8dSAndroid Build Coastguard Worker 2521*cda5da8dSAndroid Build Coastguard Worker 2522*cda5da8dSAndroid Build Coastguard Worker def __eq__(self, other): 2523*cda5da8dSAndroid Build Coastguard Worker try: 2524*cda5da8dSAndroid Build Coastguard Worker len_other = len(other) 2525*cda5da8dSAndroid Build Coastguard Worker except TypeError: 2526*cda5da8dSAndroid Build Coastguard Worker return NotImplemented 2527*cda5da8dSAndroid Build Coastguard Worker 2528*cda5da8dSAndroid Build Coastguard Worker self_name = '' 2529*cda5da8dSAndroid Build Coastguard Worker if len(self) == 2: 2530*cda5da8dSAndroid Build Coastguard Worker self_args, self_kwargs = self 2531*cda5da8dSAndroid Build Coastguard Worker else: 2532*cda5da8dSAndroid Build Coastguard Worker self_name, self_args, self_kwargs = self 2533*cda5da8dSAndroid Build Coastguard Worker 2534*cda5da8dSAndroid Build Coastguard Worker if (getattr(self, '_mock_parent', None) and getattr(other, '_mock_parent', None) 2535*cda5da8dSAndroid Build Coastguard Worker and self._mock_parent != other._mock_parent): 2536*cda5da8dSAndroid Build Coastguard Worker return False 2537*cda5da8dSAndroid Build Coastguard Worker 2538*cda5da8dSAndroid Build Coastguard Worker other_name = '' 2539*cda5da8dSAndroid Build Coastguard Worker if len_other == 0: 2540*cda5da8dSAndroid Build Coastguard Worker other_args, other_kwargs = (), {} 2541*cda5da8dSAndroid Build Coastguard Worker elif len_other == 3: 2542*cda5da8dSAndroid Build Coastguard Worker other_name, other_args, other_kwargs = other 2543*cda5da8dSAndroid Build Coastguard Worker elif len_other == 1: 2544*cda5da8dSAndroid Build Coastguard Worker value, = other 2545*cda5da8dSAndroid Build Coastguard Worker if isinstance(value, tuple): 2546*cda5da8dSAndroid Build Coastguard Worker other_args = value 2547*cda5da8dSAndroid Build Coastguard Worker other_kwargs = {} 2548*cda5da8dSAndroid Build Coastguard Worker elif isinstance(value, str): 2549*cda5da8dSAndroid Build Coastguard Worker other_name = value 2550*cda5da8dSAndroid Build Coastguard Worker other_args, other_kwargs = (), {} 2551*cda5da8dSAndroid Build Coastguard Worker else: 2552*cda5da8dSAndroid Build Coastguard Worker other_args = () 2553*cda5da8dSAndroid Build Coastguard Worker other_kwargs = value 2554*cda5da8dSAndroid Build Coastguard Worker elif len_other == 2: 2555*cda5da8dSAndroid Build Coastguard Worker # could be (name, args) or (name, kwargs) or (args, kwargs) 2556*cda5da8dSAndroid Build Coastguard Worker first, second = other 2557*cda5da8dSAndroid Build Coastguard Worker if isinstance(first, str): 2558*cda5da8dSAndroid Build Coastguard Worker other_name = first 2559*cda5da8dSAndroid Build Coastguard Worker if isinstance(second, tuple): 2560*cda5da8dSAndroid Build Coastguard Worker other_args, other_kwargs = second, {} 2561*cda5da8dSAndroid Build Coastguard Worker else: 2562*cda5da8dSAndroid Build Coastguard Worker other_args, other_kwargs = (), second 2563*cda5da8dSAndroid Build Coastguard Worker else: 2564*cda5da8dSAndroid Build Coastguard Worker other_args, other_kwargs = first, second 2565*cda5da8dSAndroid Build Coastguard Worker else: 2566*cda5da8dSAndroid Build Coastguard Worker return False 2567*cda5da8dSAndroid Build Coastguard Worker 2568*cda5da8dSAndroid Build Coastguard Worker if self_name and other_name != self_name: 2569*cda5da8dSAndroid Build Coastguard Worker return False 2570*cda5da8dSAndroid Build Coastguard Worker 2571*cda5da8dSAndroid Build Coastguard Worker # this order is important for ANY to work! 2572*cda5da8dSAndroid Build Coastguard Worker return (other_args, other_kwargs) == (self_args, self_kwargs) 2573*cda5da8dSAndroid Build Coastguard Worker 2574*cda5da8dSAndroid Build Coastguard Worker 2575*cda5da8dSAndroid Build Coastguard Worker __ne__ = object.__ne__ 2576*cda5da8dSAndroid Build Coastguard Worker 2577*cda5da8dSAndroid Build Coastguard Worker 2578*cda5da8dSAndroid Build Coastguard Worker def __call__(self, /, *args, **kwargs): 2579*cda5da8dSAndroid Build Coastguard Worker if self._mock_name is None: 2580*cda5da8dSAndroid Build Coastguard Worker return _Call(('', args, kwargs), name='()') 2581*cda5da8dSAndroid Build Coastguard Worker 2582*cda5da8dSAndroid Build Coastguard Worker name = self._mock_name + '()' 2583*cda5da8dSAndroid Build Coastguard Worker return _Call((self._mock_name, args, kwargs), name=name, parent=self) 2584*cda5da8dSAndroid Build Coastguard Worker 2585*cda5da8dSAndroid Build Coastguard Worker 2586*cda5da8dSAndroid Build Coastguard Worker def __getattr__(self, attr): 2587*cda5da8dSAndroid Build Coastguard Worker if self._mock_name is None: 2588*cda5da8dSAndroid Build Coastguard Worker return _Call(name=attr, from_kall=False) 2589*cda5da8dSAndroid Build Coastguard Worker name = '%s.%s' % (self._mock_name, attr) 2590*cda5da8dSAndroid Build Coastguard Worker return _Call(name=name, parent=self, from_kall=False) 2591*cda5da8dSAndroid Build Coastguard Worker 2592*cda5da8dSAndroid Build Coastguard Worker 2593*cda5da8dSAndroid Build Coastguard Worker def __getattribute__(self, attr): 2594*cda5da8dSAndroid Build Coastguard Worker if attr in tuple.__dict__: 2595*cda5da8dSAndroid Build Coastguard Worker raise AttributeError 2596*cda5da8dSAndroid Build Coastguard Worker return tuple.__getattribute__(self, attr) 2597*cda5da8dSAndroid Build Coastguard Worker 2598*cda5da8dSAndroid Build Coastguard Worker 2599*cda5da8dSAndroid Build Coastguard Worker def _get_call_arguments(self): 2600*cda5da8dSAndroid Build Coastguard Worker if len(self) == 2: 2601*cda5da8dSAndroid Build Coastguard Worker args, kwargs = self 2602*cda5da8dSAndroid Build Coastguard Worker else: 2603*cda5da8dSAndroid Build Coastguard Worker name, args, kwargs = self 2604*cda5da8dSAndroid Build Coastguard Worker 2605*cda5da8dSAndroid Build Coastguard Worker return args, kwargs 2606*cda5da8dSAndroid Build Coastguard Worker 2607*cda5da8dSAndroid Build Coastguard Worker @property 2608*cda5da8dSAndroid Build Coastguard Worker def args(self): 2609*cda5da8dSAndroid Build Coastguard Worker return self._get_call_arguments()[0] 2610*cda5da8dSAndroid Build Coastguard Worker 2611*cda5da8dSAndroid Build Coastguard Worker @property 2612*cda5da8dSAndroid Build Coastguard Worker def kwargs(self): 2613*cda5da8dSAndroid Build Coastguard Worker return self._get_call_arguments()[1] 2614*cda5da8dSAndroid Build Coastguard Worker 2615*cda5da8dSAndroid Build Coastguard Worker def __repr__(self): 2616*cda5da8dSAndroid Build Coastguard Worker if not self._mock_from_kall: 2617*cda5da8dSAndroid Build Coastguard Worker name = self._mock_name or 'call' 2618*cda5da8dSAndroid Build Coastguard Worker if name.startswith('()'): 2619*cda5da8dSAndroid Build Coastguard Worker name = 'call%s' % name 2620*cda5da8dSAndroid Build Coastguard Worker return name 2621*cda5da8dSAndroid Build Coastguard Worker 2622*cda5da8dSAndroid Build Coastguard Worker if len(self) == 2: 2623*cda5da8dSAndroid Build Coastguard Worker name = 'call' 2624*cda5da8dSAndroid Build Coastguard Worker args, kwargs = self 2625*cda5da8dSAndroid Build Coastguard Worker else: 2626*cda5da8dSAndroid Build Coastguard Worker name, args, kwargs = self 2627*cda5da8dSAndroid Build Coastguard Worker if not name: 2628*cda5da8dSAndroid Build Coastguard Worker name = 'call' 2629*cda5da8dSAndroid Build Coastguard Worker elif not name.startswith('()'): 2630*cda5da8dSAndroid Build Coastguard Worker name = 'call.%s' % name 2631*cda5da8dSAndroid Build Coastguard Worker else: 2632*cda5da8dSAndroid Build Coastguard Worker name = 'call%s' % name 2633*cda5da8dSAndroid Build Coastguard Worker return _format_call_signature(name, args, kwargs) 2634*cda5da8dSAndroid Build Coastguard Worker 2635*cda5da8dSAndroid Build Coastguard Worker 2636*cda5da8dSAndroid Build Coastguard Worker def call_list(self): 2637*cda5da8dSAndroid Build Coastguard Worker """For a call object that represents multiple calls, `call_list` 2638*cda5da8dSAndroid Build Coastguard Worker returns a list of all the intermediate calls as well as the 2639*cda5da8dSAndroid Build Coastguard Worker final call.""" 2640*cda5da8dSAndroid Build Coastguard Worker vals = [] 2641*cda5da8dSAndroid Build Coastguard Worker thing = self 2642*cda5da8dSAndroid Build Coastguard Worker while thing is not None: 2643*cda5da8dSAndroid Build Coastguard Worker if thing._mock_from_kall: 2644*cda5da8dSAndroid Build Coastguard Worker vals.append(thing) 2645*cda5da8dSAndroid Build Coastguard Worker thing = thing._mock_parent 2646*cda5da8dSAndroid Build Coastguard Worker return _CallList(reversed(vals)) 2647*cda5da8dSAndroid Build Coastguard Worker 2648*cda5da8dSAndroid Build Coastguard Worker 2649*cda5da8dSAndroid Build Coastguard Workercall = _Call(from_kall=False) 2650*cda5da8dSAndroid Build Coastguard Worker 2651*cda5da8dSAndroid Build Coastguard Worker 2652*cda5da8dSAndroid Build Coastguard Workerdef create_autospec(spec, spec_set=False, instance=False, _parent=None, 2653*cda5da8dSAndroid Build Coastguard Worker _name=None, *, unsafe=False, **kwargs): 2654*cda5da8dSAndroid Build Coastguard Worker """Create a mock object using another object as a spec. Attributes on the 2655*cda5da8dSAndroid Build Coastguard Worker mock will use the corresponding attribute on the `spec` object as their 2656*cda5da8dSAndroid Build Coastguard Worker spec. 2657*cda5da8dSAndroid Build Coastguard Worker 2658*cda5da8dSAndroid Build Coastguard Worker Functions or methods being mocked will have their arguments checked 2659*cda5da8dSAndroid Build Coastguard Worker to check that they are called with the correct signature. 2660*cda5da8dSAndroid Build Coastguard Worker 2661*cda5da8dSAndroid Build Coastguard Worker If `spec_set` is True then attempting to set attributes that don't exist 2662*cda5da8dSAndroid Build Coastguard Worker on the spec object will raise an `AttributeError`. 2663*cda5da8dSAndroid Build Coastguard Worker 2664*cda5da8dSAndroid Build Coastguard Worker If a class is used as a spec then the return value of the mock (the 2665*cda5da8dSAndroid Build Coastguard Worker instance of the class) will have the same spec. You can use a class as the 2666*cda5da8dSAndroid Build Coastguard Worker spec for an instance object by passing `instance=True`. The returned mock 2667*cda5da8dSAndroid Build Coastguard Worker will only be callable if instances of the mock are callable. 2668*cda5da8dSAndroid Build Coastguard Worker 2669*cda5da8dSAndroid Build Coastguard Worker `create_autospec` will raise a `RuntimeError` if passed some common 2670*cda5da8dSAndroid Build Coastguard Worker misspellings of the arguments autospec and spec_set. Pass the argument 2671*cda5da8dSAndroid Build Coastguard Worker `unsafe` with the value True to disable that check. 2672*cda5da8dSAndroid Build Coastguard Worker 2673*cda5da8dSAndroid Build Coastguard Worker `create_autospec` also takes arbitrary keyword arguments that are passed to 2674*cda5da8dSAndroid Build Coastguard Worker the constructor of the created mock.""" 2675*cda5da8dSAndroid Build Coastguard Worker if _is_list(spec): 2676*cda5da8dSAndroid Build Coastguard Worker # can't pass a list instance to the mock constructor as it will be 2677*cda5da8dSAndroid Build Coastguard Worker # interpreted as a list of strings 2678*cda5da8dSAndroid Build Coastguard Worker spec = type(spec) 2679*cda5da8dSAndroid Build Coastguard Worker 2680*cda5da8dSAndroid Build Coastguard Worker is_type = isinstance(spec, type) 2681*cda5da8dSAndroid Build Coastguard Worker if _is_instance_mock(spec): 2682*cda5da8dSAndroid Build Coastguard Worker raise InvalidSpecError(f'Cannot autospec a Mock object. ' 2683*cda5da8dSAndroid Build Coastguard Worker f'[object={spec!r}]') 2684*cda5da8dSAndroid Build Coastguard Worker is_async_func = _is_async_func(spec) 2685*cda5da8dSAndroid Build Coastguard Worker _kwargs = {'spec': spec} 2686*cda5da8dSAndroid Build Coastguard Worker if spec_set: 2687*cda5da8dSAndroid Build Coastguard Worker _kwargs = {'spec_set': spec} 2688*cda5da8dSAndroid Build Coastguard Worker elif spec is None: 2689*cda5da8dSAndroid Build Coastguard Worker # None we mock with a normal mock without a spec 2690*cda5da8dSAndroid Build Coastguard Worker _kwargs = {} 2691*cda5da8dSAndroid Build Coastguard Worker if _kwargs and instance: 2692*cda5da8dSAndroid Build Coastguard Worker _kwargs['_spec_as_instance'] = True 2693*cda5da8dSAndroid Build Coastguard Worker if not unsafe: 2694*cda5da8dSAndroid Build Coastguard Worker _check_spec_arg_typos(kwargs) 2695*cda5da8dSAndroid Build Coastguard Worker 2696*cda5da8dSAndroid Build Coastguard Worker _kwargs.update(kwargs) 2697*cda5da8dSAndroid Build Coastguard Worker 2698*cda5da8dSAndroid Build Coastguard Worker Klass = MagicMock 2699*cda5da8dSAndroid Build Coastguard Worker if inspect.isdatadescriptor(spec): 2700*cda5da8dSAndroid Build Coastguard Worker # descriptors don't have a spec 2701*cda5da8dSAndroid Build Coastguard Worker # because we don't know what type they return 2702*cda5da8dSAndroid Build Coastguard Worker _kwargs = {} 2703*cda5da8dSAndroid Build Coastguard Worker elif is_async_func: 2704*cda5da8dSAndroid Build Coastguard Worker if instance: 2705*cda5da8dSAndroid Build Coastguard Worker raise RuntimeError("Instance can not be True when create_autospec " 2706*cda5da8dSAndroid Build Coastguard Worker "is mocking an async function") 2707*cda5da8dSAndroid Build Coastguard Worker Klass = AsyncMock 2708*cda5da8dSAndroid Build Coastguard Worker elif not _callable(spec): 2709*cda5da8dSAndroid Build Coastguard Worker Klass = NonCallableMagicMock 2710*cda5da8dSAndroid Build Coastguard Worker elif is_type and instance and not _instance_callable(spec): 2711*cda5da8dSAndroid Build Coastguard Worker Klass = NonCallableMagicMock 2712*cda5da8dSAndroid Build Coastguard Worker 2713*cda5da8dSAndroid Build Coastguard Worker _name = _kwargs.pop('name', _name) 2714*cda5da8dSAndroid Build Coastguard Worker 2715*cda5da8dSAndroid Build Coastguard Worker _new_name = _name 2716*cda5da8dSAndroid Build Coastguard Worker if _parent is None: 2717*cda5da8dSAndroid Build Coastguard Worker # for a top level object no _new_name should be set 2718*cda5da8dSAndroid Build Coastguard Worker _new_name = '' 2719*cda5da8dSAndroid Build Coastguard Worker 2720*cda5da8dSAndroid Build Coastguard Worker mock = Klass(parent=_parent, _new_parent=_parent, _new_name=_new_name, 2721*cda5da8dSAndroid Build Coastguard Worker name=_name, **_kwargs) 2722*cda5da8dSAndroid Build Coastguard Worker 2723*cda5da8dSAndroid Build Coastguard Worker if isinstance(spec, FunctionTypes): 2724*cda5da8dSAndroid Build Coastguard Worker # should only happen at the top level because we don't 2725*cda5da8dSAndroid Build Coastguard Worker # recurse for functions 2726*cda5da8dSAndroid Build Coastguard Worker mock = _set_signature(mock, spec) 2727*cda5da8dSAndroid Build Coastguard Worker if is_async_func: 2728*cda5da8dSAndroid Build Coastguard Worker _setup_async_mock(mock) 2729*cda5da8dSAndroid Build Coastguard Worker else: 2730*cda5da8dSAndroid Build Coastguard Worker _check_signature(spec, mock, is_type, instance) 2731*cda5da8dSAndroid Build Coastguard Worker 2732*cda5da8dSAndroid Build Coastguard Worker if _parent is not None and not instance: 2733*cda5da8dSAndroid Build Coastguard Worker _parent._mock_children[_name] = mock 2734*cda5da8dSAndroid Build Coastguard Worker 2735*cda5da8dSAndroid Build Coastguard Worker if is_type and not instance and 'return_value' not in kwargs: 2736*cda5da8dSAndroid Build Coastguard Worker mock.return_value = create_autospec(spec, spec_set, instance=True, 2737*cda5da8dSAndroid Build Coastguard Worker _name='()', _parent=mock) 2738*cda5da8dSAndroid Build Coastguard Worker 2739*cda5da8dSAndroid Build Coastguard Worker for entry in dir(spec): 2740*cda5da8dSAndroid Build Coastguard Worker if _is_magic(entry): 2741*cda5da8dSAndroid Build Coastguard Worker # MagicMock already does the useful magic methods for us 2742*cda5da8dSAndroid Build Coastguard Worker continue 2743*cda5da8dSAndroid Build Coastguard Worker 2744*cda5da8dSAndroid Build Coastguard Worker # XXXX do we need a better way of getting attributes without 2745*cda5da8dSAndroid Build Coastguard Worker # triggering code execution (?) Probably not - we need the actual 2746*cda5da8dSAndroid Build Coastguard Worker # object to mock it so we would rather trigger a property than mock 2747*cda5da8dSAndroid Build Coastguard Worker # the property descriptor. Likewise we want to mock out dynamically 2748*cda5da8dSAndroid Build Coastguard Worker # provided attributes. 2749*cda5da8dSAndroid Build Coastguard Worker # XXXX what about attributes that raise exceptions other than 2750*cda5da8dSAndroid Build Coastguard Worker # AttributeError on being fetched? 2751*cda5da8dSAndroid Build Coastguard Worker # we could be resilient against it, or catch and propagate the 2752*cda5da8dSAndroid Build Coastguard Worker # exception when the attribute is fetched from the mock 2753*cda5da8dSAndroid Build Coastguard Worker try: 2754*cda5da8dSAndroid Build Coastguard Worker original = getattr(spec, entry) 2755*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 2756*cda5da8dSAndroid Build Coastguard Worker continue 2757*cda5da8dSAndroid Build Coastguard Worker 2758*cda5da8dSAndroid Build Coastguard Worker kwargs = {'spec': original} 2759*cda5da8dSAndroid Build Coastguard Worker if spec_set: 2760*cda5da8dSAndroid Build Coastguard Worker kwargs = {'spec_set': original} 2761*cda5da8dSAndroid Build Coastguard Worker 2762*cda5da8dSAndroid Build Coastguard Worker if not isinstance(original, FunctionTypes): 2763*cda5da8dSAndroid Build Coastguard Worker new = _SpecState(original, spec_set, mock, entry, instance) 2764*cda5da8dSAndroid Build Coastguard Worker mock._mock_children[entry] = new 2765*cda5da8dSAndroid Build Coastguard Worker else: 2766*cda5da8dSAndroid Build Coastguard Worker parent = mock 2767*cda5da8dSAndroid Build Coastguard Worker if isinstance(spec, FunctionTypes): 2768*cda5da8dSAndroid Build Coastguard Worker parent = mock.mock 2769*cda5da8dSAndroid Build Coastguard Worker 2770*cda5da8dSAndroid Build Coastguard Worker skipfirst = _must_skip(spec, entry, is_type) 2771*cda5da8dSAndroid Build Coastguard Worker kwargs['_eat_self'] = skipfirst 2772*cda5da8dSAndroid Build Coastguard Worker if iscoroutinefunction(original): 2773*cda5da8dSAndroid Build Coastguard Worker child_klass = AsyncMock 2774*cda5da8dSAndroid Build Coastguard Worker else: 2775*cda5da8dSAndroid Build Coastguard Worker child_klass = MagicMock 2776*cda5da8dSAndroid Build Coastguard Worker new = child_klass(parent=parent, name=entry, _new_name=entry, 2777*cda5da8dSAndroid Build Coastguard Worker _new_parent=parent, 2778*cda5da8dSAndroid Build Coastguard Worker **kwargs) 2779*cda5da8dSAndroid Build Coastguard Worker mock._mock_children[entry] = new 2780*cda5da8dSAndroid Build Coastguard Worker _check_signature(original, new, skipfirst=skipfirst) 2781*cda5da8dSAndroid Build Coastguard Worker 2782*cda5da8dSAndroid Build Coastguard Worker # so functions created with _set_signature become instance attributes, 2783*cda5da8dSAndroid Build Coastguard Worker # *plus* their underlying mock exists in _mock_children of the parent 2784*cda5da8dSAndroid Build Coastguard Worker # mock. Adding to _mock_children may be unnecessary where we are also 2785*cda5da8dSAndroid Build Coastguard Worker # setting as an instance attribute? 2786*cda5da8dSAndroid Build Coastguard Worker if isinstance(new, FunctionTypes): 2787*cda5da8dSAndroid Build Coastguard Worker setattr(mock, entry, new) 2788*cda5da8dSAndroid Build Coastguard Worker 2789*cda5da8dSAndroid Build Coastguard Worker return mock 2790*cda5da8dSAndroid Build Coastguard Worker 2791*cda5da8dSAndroid Build Coastguard Worker 2792*cda5da8dSAndroid Build Coastguard Workerdef _must_skip(spec, entry, is_type): 2793*cda5da8dSAndroid Build Coastguard Worker """ 2794*cda5da8dSAndroid Build Coastguard Worker Return whether we should skip the first argument on spec's `entry` 2795*cda5da8dSAndroid Build Coastguard Worker attribute. 2796*cda5da8dSAndroid Build Coastguard Worker """ 2797*cda5da8dSAndroid Build Coastguard Worker if not isinstance(spec, type): 2798*cda5da8dSAndroid Build Coastguard Worker if entry in getattr(spec, '__dict__', {}): 2799*cda5da8dSAndroid Build Coastguard Worker # instance attribute - shouldn't skip 2800*cda5da8dSAndroid Build Coastguard Worker return False 2801*cda5da8dSAndroid Build Coastguard Worker spec = spec.__class__ 2802*cda5da8dSAndroid Build Coastguard Worker 2803*cda5da8dSAndroid Build Coastguard Worker for klass in spec.__mro__: 2804*cda5da8dSAndroid Build Coastguard Worker result = klass.__dict__.get(entry, DEFAULT) 2805*cda5da8dSAndroid Build Coastguard Worker if result is DEFAULT: 2806*cda5da8dSAndroid Build Coastguard Worker continue 2807*cda5da8dSAndroid Build Coastguard Worker if isinstance(result, (staticmethod, classmethod)): 2808*cda5da8dSAndroid Build Coastguard Worker return False 2809*cda5da8dSAndroid Build Coastguard Worker elif isinstance(result, FunctionTypes): 2810*cda5da8dSAndroid Build Coastguard Worker # Normal method => skip if looked up on type 2811*cda5da8dSAndroid Build Coastguard Worker # (if looked up on instance, self is already skipped) 2812*cda5da8dSAndroid Build Coastguard Worker return is_type 2813*cda5da8dSAndroid Build Coastguard Worker else: 2814*cda5da8dSAndroid Build Coastguard Worker return False 2815*cda5da8dSAndroid Build Coastguard Worker 2816*cda5da8dSAndroid Build Coastguard Worker # function is a dynamically provided attribute 2817*cda5da8dSAndroid Build Coastguard Worker return is_type 2818*cda5da8dSAndroid Build Coastguard Worker 2819*cda5da8dSAndroid Build Coastguard Worker 2820*cda5da8dSAndroid Build Coastguard Workerclass _SpecState(object): 2821*cda5da8dSAndroid Build Coastguard Worker 2822*cda5da8dSAndroid Build Coastguard Worker def __init__(self, spec, spec_set=False, parent=None, 2823*cda5da8dSAndroid Build Coastguard Worker name=None, ids=None, instance=False): 2824*cda5da8dSAndroid Build Coastguard Worker self.spec = spec 2825*cda5da8dSAndroid Build Coastguard Worker self.ids = ids 2826*cda5da8dSAndroid Build Coastguard Worker self.spec_set = spec_set 2827*cda5da8dSAndroid Build Coastguard Worker self.parent = parent 2828*cda5da8dSAndroid Build Coastguard Worker self.instance = instance 2829*cda5da8dSAndroid Build Coastguard Worker self.name = name 2830*cda5da8dSAndroid Build Coastguard Worker 2831*cda5da8dSAndroid Build Coastguard Worker 2832*cda5da8dSAndroid Build Coastguard WorkerFunctionTypes = ( 2833*cda5da8dSAndroid Build Coastguard Worker # python function 2834*cda5da8dSAndroid Build Coastguard Worker type(create_autospec), 2835*cda5da8dSAndroid Build Coastguard Worker # instance method 2836*cda5da8dSAndroid Build Coastguard Worker type(ANY.__eq__), 2837*cda5da8dSAndroid Build Coastguard Worker) 2838*cda5da8dSAndroid Build Coastguard Worker 2839*cda5da8dSAndroid Build Coastguard Worker 2840*cda5da8dSAndroid Build Coastguard Workerfile_spec = None 2841*cda5da8dSAndroid Build Coastguard Workeropen_spec = None 2842*cda5da8dSAndroid Build Coastguard Worker 2843*cda5da8dSAndroid Build Coastguard Worker 2844*cda5da8dSAndroid Build Coastguard Workerdef _to_stream(read_data): 2845*cda5da8dSAndroid Build Coastguard Worker if isinstance(read_data, bytes): 2846*cda5da8dSAndroid Build Coastguard Worker return io.BytesIO(read_data) 2847*cda5da8dSAndroid Build Coastguard Worker else: 2848*cda5da8dSAndroid Build Coastguard Worker return io.StringIO(read_data) 2849*cda5da8dSAndroid Build Coastguard Worker 2850*cda5da8dSAndroid Build Coastguard Worker 2851*cda5da8dSAndroid Build Coastguard Workerdef mock_open(mock=None, read_data=''): 2852*cda5da8dSAndroid Build Coastguard Worker """ 2853*cda5da8dSAndroid Build Coastguard Worker A helper function to create a mock to replace the use of `open`. It works 2854*cda5da8dSAndroid Build Coastguard Worker for `open` called directly or used as a context manager. 2855*cda5da8dSAndroid Build Coastguard Worker 2856*cda5da8dSAndroid Build Coastguard Worker The `mock` argument is the mock object to configure. If `None` (the 2857*cda5da8dSAndroid Build Coastguard Worker default) then a `MagicMock` will be created for you, with the API limited 2858*cda5da8dSAndroid Build Coastguard Worker to methods or attributes available on standard file handles. 2859*cda5da8dSAndroid Build Coastguard Worker 2860*cda5da8dSAndroid Build Coastguard Worker `read_data` is a string for the `read`, `readline` and `readlines` of the 2861*cda5da8dSAndroid Build Coastguard Worker file handle to return. This is an empty string by default. 2862*cda5da8dSAndroid Build Coastguard Worker """ 2863*cda5da8dSAndroid Build Coastguard Worker _read_data = _to_stream(read_data) 2864*cda5da8dSAndroid Build Coastguard Worker _state = [_read_data, None] 2865*cda5da8dSAndroid Build Coastguard Worker 2866*cda5da8dSAndroid Build Coastguard Worker def _readlines_side_effect(*args, **kwargs): 2867*cda5da8dSAndroid Build Coastguard Worker if handle.readlines.return_value is not None: 2868*cda5da8dSAndroid Build Coastguard Worker return handle.readlines.return_value 2869*cda5da8dSAndroid Build Coastguard Worker return _state[0].readlines(*args, **kwargs) 2870*cda5da8dSAndroid Build Coastguard Worker 2871*cda5da8dSAndroid Build Coastguard Worker def _read_side_effect(*args, **kwargs): 2872*cda5da8dSAndroid Build Coastguard Worker if handle.read.return_value is not None: 2873*cda5da8dSAndroid Build Coastguard Worker return handle.read.return_value 2874*cda5da8dSAndroid Build Coastguard Worker return _state[0].read(*args, **kwargs) 2875*cda5da8dSAndroid Build Coastguard Worker 2876*cda5da8dSAndroid Build Coastguard Worker def _readline_side_effect(*args, **kwargs): 2877*cda5da8dSAndroid Build Coastguard Worker yield from _iter_side_effect() 2878*cda5da8dSAndroid Build Coastguard Worker while True: 2879*cda5da8dSAndroid Build Coastguard Worker yield _state[0].readline(*args, **kwargs) 2880*cda5da8dSAndroid Build Coastguard Worker 2881*cda5da8dSAndroid Build Coastguard Worker def _iter_side_effect(): 2882*cda5da8dSAndroid Build Coastguard Worker if handle.readline.return_value is not None: 2883*cda5da8dSAndroid Build Coastguard Worker while True: 2884*cda5da8dSAndroid Build Coastguard Worker yield handle.readline.return_value 2885*cda5da8dSAndroid Build Coastguard Worker for line in _state[0]: 2886*cda5da8dSAndroid Build Coastguard Worker yield line 2887*cda5da8dSAndroid Build Coastguard Worker 2888*cda5da8dSAndroid Build Coastguard Worker def _next_side_effect(): 2889*cda5da8dSAndroid Build Coastguard Worker if handle.readline.return_value is not None: 2890*cda5da8dSAndroid Build Coastguard Worker return handle.readline.return_value 2891*cda5da8dSAndroid Build Coastguard Worker return next(_state[0]) 2892*cda5da8dSAndroid Build Coastguard Worker 2893*cda5da8dSAndroid Build Coastguard Worker global file_spec 2894*cda5da8dSAndroid Build Coastguard Worker if file_spec is None: 2895*cda5da8dSAndroid Build Coastguard Worker import _io 2896*cda5da8dSAndroid Build Coastguard Worker file_spec = list(set(dir(_io.TextIOWrapper)).union(set(dir(_io.BytesIO)))) 2897*cda5da8dSAndroid Build Coastguard Worker 2898*cda5da8dSAndroid Build Coastguard Worker global open_spec 2899*cda5da8dSAndroid Build Coastguard Worker if open_spec is None: 2900*cda5da8dSAndroid Build Coastguard Worker import _io 2901*cda5da8dSAndroid Build Coastguard Worker open_spec = list(set(dir(_io.open))) 2902*cda5da8dSAndroid Build Coastguard Worker if mock is None: 2903*cda5da8dSAndroid Build Coastguard Worker mock = MagicMock(name='open', spec=open_spec) 2904*cda5da8dSAndroid Build Coastguard Worker 2905*cda5da8dSAndroid Build Coastguard Worker handle = MagicMock(spec=file_spec) 2906*cda5da8dSAndroid Build Coastguard Worker handle.__enter__.return_value = handle 2907*cda5da8dSAndroid Build Coastguard Worker 2908*cda5da8dSAndroid Build Coastguard Worker handle.write.return_value = None 2909*cda5da8dSAndroid Build Coastguard Worker handle.read.return_value = None 2910*cda5da8dSAndroid Build Coastguard Worker handle.readline.return_value = None 2911*cda5da8dSAndroid Build Coastguard Worker handle.readlines.return_value = None 2912*cda5da8dSAndroid Build Coastguard Worker 2913*cda5da8dSAndroid Build Coastguard Worker handle.read.side_effect = _read_side_effect 2914*cda5da8dSAndroid Build Coastguard Worker _state[1] = _readline_side_effect() 2915*cda5da8dSAndroid Build Coastguard Worker handle.readline.side_effect = _state[1] 2916*cda5da8dSAndroid Build Coastguard Worker handle.readlines.side_effect = _readlines_side_effect 2917*cda5da8dSAndroid Build Coastguard Worker handle.__iter__.side_effect = _iter_side_effect 2918*cda5da8dSAndroid Build Coastguard Worker handle.__next__.side_effect = _next_side_effect 2919*cda5da8dSAndroid Build Coastguard Worker 2920*cda5da8dSAndroid Build Coastguard Worker def reset_data(*args, **kwargs): 2921*cda5da8dSAndroid Build Coastguard Worker _state[0] = _to_stream(read_data) 2922*cda5da8dSAndroid Build Coastguard Worker if handle.readline.side_effect == _state[1]: 2923*cda5da8dSAndroid Build Coastguard Worker # Only reset the side effect if the user hasn't overridden it. 2924*cda5da8dSAndroid Build Coastguard Worker _state[1] = _readline_side_effect() 2925*cda5da8dSAndroid Build Coastguard Worker handle.readline.side_effect = _state[1] 2926*cda5da8dSAndroid Build Coastguard Worker return DEFAULT 2927*cda5da8dSAndroid Build Coastguard Worker 2928*cda5da8dSAndroid Build Coastguard Worker mock.side_effect = reset_data 2929*cda5da8dSAndroid Build Coastguard Worker mock.return_value = handle 2930*cda5da8dSAndroid Build Coastguard Worker return mock 2931*cda5da8dSAndroid Build Coastguard Worker 2932*cda5da8dSAndroid Build Coastguard Worker 2933*cda5da8dSAndroid Build Coastguard Workerclass PropertyMock(Mock): 2934*cda5da8dSAndroid Build Coastguard Worker """ 2935*cda5da8dSAndroid Build Coastguard Worker A mock intended to be used as a property, or other descriptor, on a class. 2936*cda5da8dSAndroid Build Coastguard Worker `PropertyMock` provides `__get__` and `__set__` methods so you can specify 2937*cda5da8dSAndroid Build Coastguard Worker a return value when it is fetched. 2938*cda5da8dSAndroid Build Coastguard Worker 2939*cda5da8dSAndroid Build Coastguard Worker Fetching a `PropertyMock` instance from an object calls the mock, with 2940*cda5da8dSAndroid Build Coastguard Worker no args. Setting it calls the mock with the value being set. 2941*cda5da8dSAndroid Build Coastguard Worker """ 2942*cda5da8dSAndroid Build Coastguard Worker def _get_child_mock(self, /, **kwargs): 2943*cda5da8dSAndroid Build Coastguard Worker return MagicMock(**kwargs) 2944*cda5da8dSAndroid Build Coastguard Worker 2945*cda5da8dSAndroid Build Coastguard Worker def __get__(self, obj, obj_type=None): 2946*cda5da8dSAndroid Build Coastguard Worker return self() 2947*cda5da8dSAndroid Build Coastguard Worker def __set__(self, obj, val): 2948*cda5da8dSAndroid Build Coastguard Worker self(val) 2949*cda5da8dSAndroid Build Coastguard Worker 2950*cda5da8dSAndroid Build Coastguard Worker 2951*cda5da8dSAndroid Build Coastguard Workerdef seal(mock): 2952*cda5da8dSAndroid Build Coastguard Worker """Disable the automatic generation of child mocks. 2953*cda5da8dSAndroid Build Coastguard Worker 2954*cda5da8dSAndroid Build Coastguard Worker Given an input Mock, seals it to ensure no further mocks will be generated 2955*cda5da8dSAndroid Build Coastguard Worker when accessing an attribute that was not already defined. 2956*cda5da8dSAndroid Build Coastguard Worker 2957*cda5da8dSAndroid Build Coastguard Worker The operation recursively seals the mock passed in, meaning that 2958*cda5da8dSAndroid Build Coastguard Worker the mock itself, any mocks generated by accessing one of its attributes, 2959*cda5da8dSAndroid Build Coastguard Worker and all assigned mocks without a name or spec will be sealed. 2960*cda5da8dSAndroid Build Coastguard Worker """ 2961*cda5da8dSAndroid Build Coastguard Worker mock._mock_sealed = True 2962*cda5da8dSAndroid Build Coastguard Worker for attr in dir(mock): 2963*cda5da8dSAndroid Build Coastguard Worker try: 2964*cda5da8dSAndroid Build Coastguard Worker m = getattr(mock, attr) 2965*cda5da8dSAndroid Build Coastguard Worker except AttributeError: 2966*cda5da8dSAndroid Build Coastguard Worker continue 2967*cda5da8dSAndroid Build Coastguard Worker if not isinstance(m, NonCallableMock): 2968*cda5da8dSAndroid Build Coastguard Worker continue 2969*cda5da8dSAndroid Build Coastguard Worker if isinstance(m._mock_children.get(attr), _SpecState): 2970*cda5da8dSAndroid Build Coastguard Worker continue 2971*cda5da8dSAndroid Build Coastguard Worker if m._mock_new_parent is mock: 2972*cda5da8dSAndroid Build Coastguard Worker seal(m) 2973*cda5da8dSAndroid Build Coastguard Worker 2974*cda5da8dSAndroid Build Coastguard Worker 2975*cda5da8dSAndroid Build Coastguard Workerclass _AsyncIterator: 2976*cda5da8dSAndroid Build Coastguard Worker """ 2977*cda5da8dSAndroid Build Coastguard Worker Wraps an iterator in an asynchronous iterator. 2978*cda5da8dSAndroid Build Coastguard Worker """ 2979*cda5da8dSAndroid Build Coastguard Worker def __init__(self, iterator): 2980*cda5da8dSAndroid Build Coastguard Worker self.iterator = iterator 2981*cda5da8dSAndroid Build Coastguard Worker code_mock = NonCallableMock(spec_set=CodeType) 2982*cda5da8dSAndroid Build Coastguard Worker code_mock.co_flags = inspect.CO_ITERABLE_COROUTINE 2983*cda5da8dSAndroid Build Coastguard Worker self.__dict__['__code__'] = code_mock 2984*cda5da8dSAndroid Build Coastguard Worker 2985*cda5da8dSAndroid Build Coastguard Worker async def __anext__(self): 2986*cda5da8dSAndroid Build Coastguard Worker try: 2987*cda5da8dSAndroid Build Coastguard Worker return next(self.iterator) 2988*cda5da8dSAndroid Build Coastguard Worker except StopIteration: 2989*cda5da8dSAndroid Build Coastguard Worker pass 2990*cda5da8dSAndroid Build Coastguard Worker raise StopAsyncIteration 2991