"""This module provide test utilities.""" __all__ = ("interface",) def interface(obj, funcs): """Override provided object's functions using dict of funcs, as ``{func_name: return_value}``. Attribute ``obj.calls`` is a dict with all call done using those methods, as ``{func_name: (args, kwargs) | list[(args, kwargs]]}``. """ if not isinstance(getattr(obj, "calls", None), dict): obj.calls = {} for attr, value in funcs.items(): interface_wrap(obj, attr, value) def interface_wrap(obj, attr, value): obj.calls[attr] = None def wrapper(*a, **kw): call = obj.calls.get(attr) if call is None: obj.calls[attr] = (a, kw) elif isinstance(call, tuple): obj.calls[attr] = [call, (a, kw)] else: call.append((a, kw)) return value setattr(obj, attr, wrapper)