diff options
Diffstat (limited to 'tests/utils.py')
-rw-r--r-- | tests/utils.py | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/tests/utils.py b/tests/utils.py index 990380fb1c..c68b17f7b9 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -29,7 +29,8 @@ import json import urlparse -class MockHttpServer(HttpServer): +# This is a mock /resource/ not an entire server +class MockHttpResource(HttpServer): def __init__(self, prefix=""): self.callbacks = [] # 3-tuple of method/pattern/function @@ -210,3 +211,43 @@ class MemoryDataStore(object): def get_room_events_max_id(self): return 0 # TODO (erikj) + +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 |