def test_method_race_with_failing_promises(self): class MyException(Exception): pass _reject_promise = [] def _failing_async_promise(_ok, error): _reject_promise.append(error) promises = [Promise(_failing_async_promise) for _ in range(0, 15)] p = Promise.race(promises) with pytest.raises(TimeoutError): p.result(0) random.shuffle(_reject_promise) reject = _reject_promise.pop(0) reject(MyException()) assert isinstance(p.exception(0.001), MyException) # subsequent rejection are ignored for reject in _reject_promise: reject(ValueError()) assert isinstance(p.exception(0.001), MyException)
def test_method_race_with_several_promises(self): _resolve_callback = [] def _async_promise(ok, _error): _resolve_callback.append(ok) # Add non-resolving promises. promises = [Promise(lambda _ok, _err: None) for _ in range(0, 5)] promises.append(Promise(_async_promise)) promises.append(Promise(_async_promise)) # Add non-resolving promises. promises += [Promise(lambda _ok, _err: None) for _ in range(0, 5)] p = Promise.race(promises) with pytest.raises(TimeoutError): p.result(0) _resolve_callback[0]('RESULT') # p is resolved after the first Promise resolves. assert p.result(0.001) == 'RESULT' # subsequent Promises resolutions should have no effect. _resolve_callback[1]('RESULT2') assert p.result(0.001) == 'RESULT'
def test_method_race_with_one_promise(self): p1 = Promise.resolve('RESULT') p = Promise.race([p1]) assert p.result(0.001) == 'RESULT'
def test_method_race_with_empty_set(self): with pytest.raises(ValueError): Promise.race([])