Metadata-Version: 2.1
Name: play-requests
Version: 0.0.4
Summary: pytest-play plugin driving the famous Python requests library for making HTTP calls
Home-page: https://github.com/davidemoro/play_requests
Author: Davide Moro
Author-email: davide.moro@gmail.com
License: Apache Software License 2.0
Keywords: play_requests
Platform: UNKNOWN
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.3
Classifier: Programming Language :: Python :: 3.4
Classifier: Programming Language :: Python :: 3.5
Requires-Dist: requests
Requires-Dist: pytest-play (>=2.0.0)
Provides-Extra: tests
Requires-Dist: pytest ; extra == 'tests'
Requires-Dist: mock ; extra == 'tests'
Requires-Dist: requests-mock ; extra == 'tests'
Requires-Dist: pytest-cov ; extra == 'tests'

=============
play requests
=============


.. image:: https://img.shields.io/pypi/v/play_requests.svg
        :target: https://pypi.python.org/pypi/play_requests

.. image:: https://travis-ci.org/davidemoro/play_requests.svg?branch=develop
       :target: https://travis-ci.org/davidemoro/play_requests

.. image:: https://readthedocs.org/projects/play-requests/badge/?version=latest
        :target: https://play-requests.readthedocs.io/en/latest/?badge=latest
        :alt: Documentation Status

.. image:: https://codecov.io/gh/davidemoro/play_requests/branch/develop/graph/badge.svg
     :target: https://codecov.io/gh/davidemoro/play_requests


pytest-play plugin driving the famous Python requests_ library for making ``HTTP`` calls.

More info and examples on:

* pytest-play_, documentation
* cookiecutter-qa_, see ``pytest-play`` in action with a working example if you want to start hacking


Features
--------

This pytest-play_ command provider let you drive a
Python requests_ HTTP library using a YAML configuration file
containing a set of pytest-play_ commands.

you can see a pytest-play_ script powered by a command provided
by the play_requests_ plugin:

::

    - provider: play_requests
      type: GET
      assertion: "'pytest-play' in response.json()"
      url: https://www.google.it/complete/search
      parameters:
        headers:
          Host: www.google.it
          User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101
            Firefox/57.0
          Accept: "*/*"
          Accept-Language: en-US,en;q=0.5
          Referer: https://www.google.it/
          Connection: keep-alive
        params:
        - - client
          - psy-ab
        - - hl
          - it
        - - gs_rn
          - '64'
        - - gs_ri
          - psy-ab
        - - gs_mss
          - pytest-
        - - cp
          - '11'
        - - gs_id
          - '172'
        - - q
          - pytest-play
        - - xhr
          - t
        timeout: 2.5


The above example:

* performs a GET call to https://www.google.it/complete/search?client=psy-ab&hl=it&... 
  with the provided headers, a timeout (if it takes more than 2.5 seconds a timeout
  exception will be raised) and an assertion expression that verifies that the response
  meets the expected value

play_requests_ supports all the HTTP verbs supported by the requests_ library:

* OPTIONS
* HEAD
* GET
* POST
* PUT
* PATCH
* DELETE

**NOTES:** cookies and auth implementations supported by requests_ are not yet implemented
because this package is still under development.

You'll find other play_requests_ command examples in the following sections.

Upload files
============

Post a csv file::

    - provider: play_requests
      type: POST
      url: http://something/1
      parameters:
        files:
          filecsv:
          - report.csv
          - some,data

Post a csv file with custom headers::

    - provider: play_requests
      type: POST
      url: http://something/1
      parameters:
        files:
          filecsv:
          - report.csv
          - some,data
          - application/csv
          - Expires: '0'

Post a file providing the path::

    - provider: play_requests
      type: POST
      url: http://something/1
      parameters:
        files:
          filecsv:
          - file.csv
          - path:$base_path/file.csv

assuming that you have a ``$base_path`` variable.

Save the response to a variable
===============================

You can save a response elaboration to a pytest-play_ variable
and reuse in the following commands::

    - provider: play_requests
      type: POST
      url: http://something/1
      variable: myvar
      variable_expression: response.json()
      assertion: variables['myvar']['status'] == 'ok'
      parameters:
        json:
          foo: bar
        timeout: 2.5

It the endpoint returns a non JSON response, use ``response.text`` instead.

Default payload
===============

If all your requests have a common payload it might be annoying
but thanks to play_requests_ you can avoid repetitions.

You can set variables in many ways programatically using the pytest-play_
execute command or execute commands. You can also update variables using
the play_python_ ``exec`` command::

    - provider: python
      type: store_variable
      name: bearer
      expression: "'BEARER'"
    - provider: python
      type: store_variable
      name: play_requests
      expression: "{'parameters': {'headers': {'Authorization': '$bearer'}}}"
    - provider: play_requests
      type: GET
      url: "$base_url"

and all the following HTTP calls will be performed with the authorization bearer provided in the default
payload.

Merging rules:

* if a play_requests_ command provides any other header value, the resulting HTTP call will be performed
  with merged header values (eg: ``Authorization`` + ``Host``)
* if a play_requests_ command provides a conflicting header value or any other default option,
  the ``Authorization`` header provided by the command will win and it will override just for the current
  call the default conflicting header value

Assert response status code
===========================

::

    - provider: play_requests
      type: POST
      url: http://something/1
      variable: myvar
      variable_expression: response.json()
      assertion: response.status_code == 200
      parameters:
        json:
          foo: bar

of if you want you can use the expression ``response.raise_for_status()`` instead of
checking the exact match of status code.

The ``raise_for_status`` call will raise an ``HTTPError`` if the ``HTTP`` request
returned an unsuccessful status code.


Post raw data
=============

If you want to send some POST data or send a JSON payload without automatic JSON encoding::

    - provider: play_requests
      type: POST
      url: http://something/1
      parameters:
        data: '{"foo"  : "bar"    }'

Redirections
============

By default requests_ will perform location redirection for all verbs
except HEAD:

* http://docs.python-requests.org/en/master/user/quickstart/#redirection-and-history

You can disable or enable redirects playing with the ``allow_redirects`` option::

    - provider: play_requests
      type: POST
      url: http://something/1
      variable: myvar
      variable_expression: response.json()
      assertion: response.status_code == 200
      parameters:
        allow_redirects: false
        json:
          foo: bar

Twitter
-------

``pytest-play`` tweets happens here:

* `@davidemoro`_

Credits
-------

This package was created with Cookiecutter_ and the cookiecutter-play-plugin_ (based on `audreyr/cookiecutter-pypackage`_ project template).

.. _Cookiecutter: https://github.com/audreyr/cookiecutter
.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage
.. _`cookiecutter-play-plugin`: https://github.com/davidemoro/cookiecutter-play-plugin
.. _pytest-play: https://github.com/davidemoro/pytest-play
.. _cookiecutter-qa: https://github.com/davidemoro/cookiecutter-qa
.. _requests: http://docs.python-requests.org/en/master/user/quickstart
.. _play_requests: https://play_requests.readthedocs.io/en/latest
.. _play_python: https://play_python.readthedocs.io/en/latest
.. _`@davidemoro`: https://twitter.com/davidemoro


=======
CHANGES
=======

0.0.4 (2019-01-25)
------------------

- Supports new pytest-play >= 2.0 YAML based syntax (json no more supported)


0.0.3 (2018-01-22)
------------------

- remove condition option (already implemented by pytest-play's ``skip_condition``)

- documentation improvements


0.0.2 (2018-01-16)
------------------

- Refactor internal methods

- Remove merge commands with default payload (already
  implemented in ``pytest-play`` >= 1.1.0)


0.0.1 (2018-01-10)
------------------

* First release


