diff options
author | Paul "LeoNerd" Evans <paul@matrix.org> | 2014-08-18 15:10:31 +0100 |
---|---|---|
committer | Paul "LeoNerd" Evans <paul@matrix.org> | 2014-08-19 14:25:43 +0100 |
commit | fcdc40a5dd227c2498582f4f9e5502b2e6ef618d (patch) | |
tree | b3f2075c08918b8cde7007e05f1599794fe2d1dc | |
parent | More formatting, more clarity. (diff) | |
download | synapse-fcdc40a5dd227c2498582f4f9e5502b2e6ef618d.tar.xz |
Add a DeferredMockCallable; like mock's MockCallable but allows awaiting
on method calls to be made later
-rw-r--r-- | tests/utils.py | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/tests/utils.py b/tests/utils.py index 9bb32fb048..9b0de38a9d 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -280,3 +280,44 @@ class MemoryDataStore(object): def get_presence_list(self, user_localpart, accepted): return [] + + +def _format_call(args, kwargs): + return ", ".join( + ["%r" % (a) for a in args] + + ["%s=%r" % (k, v) for k, v in kwargs.items()] + ) + + +class DeferredMockCallable(object): + """A callable instance that stores a set of pending call expectations and + return values for them. It allows a unit test to assert that the given set + of function calls are eventually made, by awaiting on them to be called. + """ + + def __init__(self): + self.expectations = [] + + def __call__(self, *args, **kwargs): + if not self.expectations: + raise ValueError("%r has no pending calls to handle call(%s)" % ( + self, _format_call(args, kwargs)) + ) + + for (call, result, d) in self.expectations: + if args == call[1] and kwargs == call[2]: + d.callback(None) + return result + + raise AssertionError("Was not expecting call(%s)" % + _format_call(args, kwargs) + ) + + def expect_call_and_return(self, call, result): + self.expectations.append((call, result, defer.Deferred())) + + @defer.inlineCallbacks + def await_calls(self): + while self.expectations: + (_, _, d) = self.expectations.pop(0) + yield d |