Metadata-Version: 2.1
Name: pytest-httpserver
Version: 0.1
Summary: pytest-httpserver is a httpserver for pytest
Home-page: https://www.github.com/csernazs/pytest-httpserver
Author: Zsolt Cserna
Author-email: zsolt.cserna@gmail.com
License: UNKNOWN
Platform: UNKNOWN
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Framework :: Pytest

.. image:: https://travis-ci.org/csernazs/pytest-httpserver.svg?branch=master
    :target: https://travis-ci.org/csernazs/pytest-httpserver

pytest_httpserver
=================
HTTP server for pytest


Nutshell
--------

This library is designed to help to test http clients without contacting the real http server.
In other words, it is a fake http server which is accessible via localhost can be started with
the pre-defined expected http requests and their responses.

Example
-------

.. code-block:: python

    def test_my_client(httpserver): # httpserver is a pytest fixture which starts the server
        # set up the server to serve /foobar with the json
        httpserver.expect_request("/foobar").respond_with_json({"foo": "bar"})
        # check that the request is served
        assert requests.get(httpserver.url_for("/foobar")).json() == {'foo': 'bar'}


You can also use the library without pytest. There's a with statement to ensure that the server is stopped.


.. code-block:: python

    with HTTPServer() as httpserver:
        # set up the server to serve /foobar with the json
        httpserver.expect_request("/foobar").respond_with_json({"foo": "bar"})
        # check that the request is served
        print(requests.get(httpserver.url_for("/foobar")).json())


Features
--------
You can set up a dozen of expectations for the requests, and also what response should be sent by the server to the client.


Requests
~~~~~~~~
There are three different types:

- **permanent**: this will be always served when there's match for this request, you can make as many HTTP requests as you want
- **oneshot**: this will be served only once when there's a match for this request, you can only make 1 HTTP request
- **ordered**: same as oneshot but the order must be strictly matched to the order of setting up

You can also fine-tune the expected request. The following can be specified:

- URI (this is a must)
- HTTP method
- headers
- query string
- data (HTTP payload of the request)


Responses
~~~~~~~~~

Once you have the expectations for the request set up, you should also define the response you want to send back.
The following is supported currently:

- respond arbitrary data (string or bytearray)
- respond a json (a python dict converted in-place to json)
- respond a Response object of werkzeug
- use your own function

Similar to requests, you can fine-tune what response you want to send:

- HTTP status
- headers
- data


Missing features
----------------
* HTTP/2
* Keepalive
* TLS


