1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
|
API
===
.. module:: betamax
.. autoclass:: Betamax
:members:
.. autofunction:: betamax.decorator.use_cassette
.. autoclass:: betamax.configure.Configuration
:members:
.. automodule:: betamax.fixtures.pytest
.. automodule:: betamax.fixtures.unittest
Examples
--------
Basic Usage
^^^^^^^^^^^
Let `example.json` be a file in a directory called `cassettes` with the
content:
.. code-block:: javascript
{
"http_interactions": [
{
"request": {
"body": {
"string": "",
"encoding": "utf-8"
},
"headers": {
"User-Agent": ["python-requests/v1.2.3"]
},
"method": "GET",
"uri": "https://httpbin.org/get"
},
"response": {
"body": {
"string": "example body",
"encoding": "utf-8"
},
"headers": {},
"status": {
"code": 200,
"message": "OK"
},
"url": "https://httpbin.org/get"
}
}
],
"recorded_with": "betamax"
}
The following snippet will not raise any exceptions
.. code-block:: python
from betamax import Betamax
from requests import Session
s = Session()
with Betamax(s, cassette_library_dir='cassettes') as betamax:
betamax.use_cassette('example', record='none')
r = s.get("https://httpbin.org/get")
On the other hand, this will raise an exception:
.. code-block:: python
from betamax import Betamax
from requests import Session
s = Session()
with Betamax(s, cassette_library_dir='cassettes') as betamax:
betamax.use_cassette('example', record='none')
r = s.post("https://httpbin.org/post",
data={"key": "value"})
Finally, we can also use a decorator in order to simplify things:
.. code-block:: python
import unittest
from betamax.decorator import use_cassette
class TestExample(unittest.TestCase):
@use_cassette('example', cassette_library_dir='cassettes')
def test_example(self, session):
session.get('https://httpbin.org/get')
# Or if you're using something like py.test
@use_cassette('example', cassette_library_dir='cassettes')
def test_example_pytest(session):
session.get('https://httpbin.org/get')
.. _opinions:
Opinions at Work
----------------
If you use ``requests``'s default ``Accept-Encoding`` header, servers that
support gzip content encoding will return responses that Betamax cannot
serialize in a human-readable format. In this event, the cassette will look
like this:
.. code-block:: javascript
:emphasize-lines: 17
{
"http_interactions": [
{
"request": {
"body": {
"base64_string": "",
"encoding": "utf-8"
},
"headers": {
"User-Agent": ["python-requests/v1.2.3"]
},
"method": "GET",
"uri": "https://httpbin.org/get"
},
"response": {
"body": {
"base64_string": "Zm9vIGJhcgo=",
"encoding": "utf-8"
},
"headers": {
"Content-Encoding": ["gzip"]
},
"status": {
"code": 200,
"message": "OK"
},
"url": "https://httpbin.org/get"
}
}
],
"recorded_with": "betamax"
}
Forcing bytes to be preserved
-----------------------------
You may want to force betamax to preserve the exact bytes in the body of a
response (or request) instead of relying on the :ref:`opinions held by the
library <opinions>`. In this case you have two ways of telling betamax to do
this.
The first, is on a per-cassette basis, like so:
.. code-block:: python
from betamax import Betamax
import requests
session = Session()
with Betamax.configure() as config:
c.cassette_library_dir = '.'
with Betamax(session).use_cassette('some_cassette',
preserve_exact_body_bytes=True):
r = session.get('http://example.com')
On the other hand, you may want to preserve exact body bytes for all
cassettes. In this case, you can do:
.. code-block:: python
from betamax import Betamax
import requests
session = Session()
with Betamax.configure() as config:
config.cassette_library_dir = '.'
config.preserve_exact_body_bytes = True
with Betamax(session).use_cassette('some_cassette'):
r = session.get('http://example.com')
|