Currently a very basic module that provides an adapter for requests that mocks network activity for unit test purposes.
This code assumes your HTTP client is written in a way that enables passing a custom Session object. When that's the case, all you have to do is to mount the adapter to answer for a specific prefix:
>>> import requests >>> from requests_testadapter import TestAdapter >>> s = requests.Session() >>> s.mount('http://', TestAdapter(b'Mock!', status=404)) >>> r = s.get('http://mocked.com') >>> r.status_code 404 >>> r.text 'Mock!'
You can also specify a headers
dictionary as a keyword argument to
TestAdapter
.
In requests
1.2.0 and older, the order of mounted adapters is
unpredictable. To make sure you can mount arbitrary paths with their own
respective adapters, use TestSession
which always matches the longest
prefix:
>>> from requests_testadapter import TestAdapter, TestSession >>> s = TestSession() >>> s.mount('http://git', TestAdapter(b'git')) >>> s.mount('http://github', TestAdapter(b'github')) >>> s.mount('http://github.com', TestAdapter(b'github.com')) >>> s.mount('http://github.com/about/', TestAdapter(b'github.com/about')) >>> r = s.get('http://github.com/about/') >>> r.text u'github.com/about' >>> r = s.get('http://github.com') >>> r.text u'github.com' >>> r = s.get('http://gittip.com') >>> r.text u'git'
TestSession
doesn't connect the default handlers for HTTP and HTTPS so you
will be notified if your requests unintentionally try to reach external
websites in your unit tests:
>>> r = s.get('http://bitbucket.org') Traceback (most recent call last): ... requests.exceptions.InvalidSchema: No connection adapters were found for 'http://bitbucket.org/'
The easiest way would be to extract the source tarball and run:
$ python test/test_testadapter.py
If you have all compatible Python implementations available on your system, you can run tests on all of them by using tox:
$ pip install tox $ tox GLOB sdist-make: setup.py py26 inst-nodeps: .tox/dist/requests-testadapter-0.1.0.zip py26 runtests: commands[0] .. ---------------------------------------------------------------------- Ran 2 tests in 0.014s OK py27 inst-nodeps: .tox/dist/requests-testadapter-0.1.0.zip py27 runtests: commands[0] .. ---------------------------------------------------------------------- Ran 2 tests in 0.014s OK py32 inst-nodeps: .tox/dist/requests-testadapter-0.1.0.zip py32 runtests: commands[0] .. ---------------------------------------------------------------------- Ran 2 tests in 0.024s OK py33 inst-nodeps: .tox/dist/requests-testadapter-0.1.0.zip py33 runtests: commands[0] .. ---------------------------------------------------------------------- Ran 2 tests in 0.017s OK _______________________________ summary ______________________________ py26: commands succeeded py27: commands succeeded py32: commands succeeded py33: commands succeeded congratulations :)
- fixed a compatibility problem with
requests
1.2.1+
- introduced
TestSession
to make adapter order predictable inrequests
1.2 and older TestAdapter
doesn't prefetchresponse.content
anymore ifstream=True
is passed to a request. This lets the user readresponse.raw
herself.
- initial published version
Glued together by Łukasz Langa. Additional fixes by Luke Sneeringer.