Skip to main content
## Tornado Stub Client

[![Build Status](https://travis-ci.org/venmo/tornado-stub-client.png?branch=master)](https://travis-ci.org/venmo/tornado-stub-client)

A library for stubbing async calls to external services in tornado. It stubs out AsyncHTTPClient.fetch, to be precise (but there's no need to be precise, that's the only asynchronous method in all of Tornado). It works well but it's brand new, I have a couple more features to add.

Similar to [HTTPretty](https://github.com/gabrielfalcao/HTTPretty) but this just patches the `fetch()` method directly rather than the python socket. Writing a new library was easier than trying to get HTTPretty to work with the tornado async client. If there's interest it would be easy enough to make this work with other http libs, e.g. requests or grequests, but you should probably just use HTTPretty.

### Usage

```python
import tornado
from tornado_stub_client import stub, reset, AsyncHTTPStubClient

class MyAppTest(tornado.testing.AsyncTestCase):

def test_basic(self):
client = AsyncHTTPStubClient()
with stub("http://example.com").and_return(body="hello there"):
client.fetch("http://example.com", self.stop)
response = self.wait()
self.assertEquals(response.code, 200)
self.assertEquals(response.body, "hello there")

def test_an_async_library(self):
""" For this example, SomeRestLib is some async library that wraps a
REST api. It has an AsyncHTTPClient as an instance variable.

Let's say it has a method get_user(id, callback) that sends a GET to
/user/:id and returns just json, and we want to unit test it
"""
mylib = SomeRestLib()
mylib.http_client = AsyncHTTPStubClient()
with stub("http://api.example.com/user/10").and_return(
body_json={'name': 'Danny Cosson',
'twitter_handle': '@dannycosson'}):
mylib.get_user(10, self.stop)
response_dict = self.wait()
self.assertEquals(response_dict.get('name'), 'Danny Cosson')

def test_can_queue_stub_responses(self):
""" A stub supports round-robin responses, i.e., a stub will cycle through
queued responses. Handy for testing endpoints that handle state.
"""
client = AsyncHTTPStubClient()
with stub("/hello").and_return(body="hello")\
.and_return(body="world"):

client.fetch("/hello", self.stop)
response = self.wait()
self.assertEqual(response.code, 200)
self.assertEqual(response.body, "hello")

client.fetch("/hello", self.stop)
response = self.wait()
self.assertEqual(response.code, 200)
self.assertEqual(response.body, "world")
```

See `tests/test_integration.py` for working tests/example code.

Note that you don't have to use `stub().and_return()` in a `with` statement, but if you don't the stub you create won't get deleted between tests so you should add setUp or tearDown method that calls `reset()` to clear out the data.

### Tests

It would be strange to write an untested testing library. To run the tests (probably in a virtualenv is best):

$ cd tornado-stub-client
$ pip install -r requirements.txt
$ pip install nose
$ nosetests tests

Metadata

Release files for tornado-stub-client 0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for tornado-stub-client 0.2
File Size Uploaded Provenance
tornado-stub-client-0.2.tar.gz 3.3 kB Without provenance Details

Release files / tornado-stub-client-0.2.tar.gz

Download URL tornado-stub-client-0.2.tar.gz
Size 3.3 kB
Tags Source
SHA-256 checksum
How to use checksums
951cd1615e4e6e2f5921ad67afc91d890e2c4314539a44ef65fda9051a4f0117
BLAKE2b-256 checksum
How to use checksums
cfb0bf505426937856263e3adb8452e0ca0120dc47002fd415c397f21780e87e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Security for tornado-stub-client 0.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.2 This release

1 release file No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page