Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def mock_constructor(target, class_name, allow_private=False, type_validation=True):
if not isinstance(class_name, str):
raise ValueError("Second argument must be a string with the name of the class.")
_bail_if_private(class_name, allow_private)
if isinstance(target, str):
target = testslide._importer(target)
target_class_id = (id(target), class_name)
if target_class_id in _mocked_target_classes:
original_class, mocked_class = _mocked_target_classes[target_class_id]
if not getattr(target, class_name) is mocked_class:
raise AssertionError(
"The class {} at {} was changed after mock_constructor() mocked "
"it!".format(class_name, target)
)
callable_mock = mocked_class.__new__
else:
original_class = getattr(target, class_name)
if "__new__" in original_class.__dict__:
raise NotImplementedError(
"Usage with classes that define __new__() is currently not supported."
) -> None:
"""
Patch target's attribute with new_value. The target can be any Python
object, such as modules, classes or instances; attribute is a string with
the attribute name and new_value.. is the value to be patched.
patch_attribute() has special mechanics so it "just works" for all cases.
For example, patching a @property at an instance requires changes in the
class, which may affect other instances. patch_attribute() takes care of
what's needed, so only the target instance is affected.
"""
_bail_if_private(attribute, allow_private)
if isinstance(target, str):
target = testslide._importer(target)
key = (id(target), attribute)
if isinstance(target, testslide.StrictMock):
template_class = target._template
if template_class:
value = getattr(template_class, attribute)
if not isinstance(value, type) and callable(value):
raise ValueError(
"Attribute can not be callable!\n"
"You can either use mock_callable() / mock_async_callable() instead."
)
def strict_mock_hasattr(obj, name):
try:
return hasattr(obj, name)
):
if not _is_setup():
raise RuntimeError(
"mock_callable() was not setup correctly before usage. "
"Please refer to the documentation at http://testslide.readthedocs.io/ "
"to learn how to properly do that."
)
self._original_target = target
self._method = method
self._runner = None
self._next_runner_accepted_args = None
self.allow_private = allow_private
self.type_validation = type_validation
self.caller_frame_info = caller_frame_info
if isinstance(target, str):
self._target = testslide._importer(target)
else:
self._target = target
target_method_id = (id(self._target), method)
if target_method_id not in self.CALLABLE_MOCKS:
if not callable_mock:
patch = True
callable_mock = self._get_callable_mock()
else:
patch = False
self.CALLABLE_MOCKS[target_method_id] = callable_mock
self._callable_mock = callable_mock
def del_callable_mock():
del self.CALLABLE_MOCKS[target_method_id]