mirror of
https://github.com/kevin1024/vcrpy.git
synced 2025-12-09 01:03:24 +00:00
Merge pull request #149 from kevin1024/pytest-httpbin
WIP: add pytest-httpbin
This commit is contained in:
3
runtests.sh
Executable file
3
runtests.sh
Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
REQUESTS_CA_BUNDLE=`python -m pytest_httpbin.certs` py.test $1
|
||||||
3
setup.py
3
setup.py
@@ -64,8 +64,7 @@ setup(
|
|||||||
install_requires=install_requires,
|
install_requires=install_requires,
|
||||||
extras_require=extras_require,
|
extras_require=extras_require,
|
||||||
license='MIT',
|
license='MIT',
|
||||||
tests_require=['pytest', 'mock', 'pytest-localserver'],
|
tests_require=['pytest', 'mock', 'pytest-localserver', 'pytest-httpbin'],
|
||||||
cmdclass={'test': PyTest},
|
|
||||||
classifiers=[
|
classifiers=[
|
||||||
'Development Status :: 4 - Beta',
|
'Development Status :: 4 - Beta',
|
||||||
'Environment :: Console',
|
'Environment :: Console',
|
||||||
|
|||||||
@@ -9,74 +9,63 @@ from six.moves.urllib.request import urlopen
|
|||||||
import vcr
|
import vcr
|
||||||
|
|
||||||
|
|
||||||
def test_nonexistent_directory(tmpdir):
|
def test_nonexistent_directory(tmpdir, httpbin):
|
||||||
'''If we load a cassette in a nonexistent directory, it can save ok'''
|
'''If we load a cassette in a nonexistent directory, it can save ok'''
|
||||||
# Check to make sure directory doesnt exist
|
# Check to make sure directory doesnt exist
|
||||||
assert not os.path.exists(str(tmpdir.join('nonexistent')))
|
assert not os.path.exists(str(tmpdir.join('nonexistent')))
|
||||||
|
|
||||||
# Run VCR to create dir and cassette file
|
# Run VCR to create dir and cassette file
|
||||||
with vcr.use_cassette(str(tmpdir.join('nonexistent', 'cassette.yml'))):
|
with vcr.use_cassette(str(tmpdir.join('nonexistent', 'cassette.yml'))):
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
|
|
||||||
# This should have made the file and the directory
|
# This should have made the file and the directory
|
||||||
assert os.path.exists(str(tmpdir.join('nonexistent', 'cassette.yml')))
|
assert os.path.exists(str(tmpdir.join('nonexistent', 'cassette.yml')))
|
||||||
|
|
||||||
|
|
||||||
def test_unpatch(tmpdir):
|
def test_unpatch(tmpdir, httpbin):
|
||||||
'''Ensure that our cassette gets unpatched when we're done'''
|
'''Ensure that our cassette gets unpatched when we're done'''
|
||||||
with vcr.use_cassette(str(tmpdir.join('unpatch.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('unpatch.yaml'))) as cass:
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
|
|
||||||
# Make the same request, and assert that we haven't served any more
|
# Make the same request, and assert that we haven't served any more
|
||||||
# requests out of cache
|
# requests out of cache
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
assert cass.play_count == 0
|
assert cass.play_count == 0
|
||||||
|
|
||||||
|
|
||||||
def test_basic_use(tmpdir):
|
def test_basic_json_use(tmpdir, httpbin):
|
||||||
'''
|
|
||||||
Copied from the docs
|
|
||||||
'''
|
|
||||||
with vcr.use_cassette('fixtures/vcr_cassettes/synopsis.yaml'):
|
|
||||||
response = urlopen(
|
|
||||||
'http://www.iana.org/domains/reserved'
|
|
||||||
).read()
|
|
||||||
assert b'Example domains' in response
|
|
||||||
|
|
||||||
|
|
||||||
def test_basic_json_use(tmpdir):
|
|
||||||
'''
|
'''
|
||||||
Ensure you can load a json serialized cassette
|
Ensure you can load a json serialized cassette
|
||||||
'''
|
'''
|
||||||
test_fixture = 'fixtures/vcr_cassettes/synopsis.json'
|
test_fixture = str(tmpdir.join('synopsis.json'))
|
||||||
with vcr.use_cassette(test_fixture, serializer='json'):
|
with vcr.use_cassette(test_fixture, serializer='json'):
|
||||||
response = urlopen('http://httpbin.org/').read()
|
response = urlopen(httpbin.url).read()
|
||||||
assert b'difficult sometimes' in response
|
assert b'difficult sometimes' in response
|
||||||
|
|
||||||
|
|
||||||
def test_patched_content(tmpdir):
|
def test_patched_content(tmpdir, httpbin):
|
||||||
'''
|
'''
|
||||||
Ensure that what you pull from a cassette is what came from the
|
Ensure that what you pull from a cassette is what came from the
|
||||||
request
|
request
|
||||||
'''
|
'''
|
||||||
with vcr.use_cassette(str(tmpdir.join('synopsis.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('synopsis.yaml'))) as cass:
|
||||||
response = urlopen('http://httpbin.org/').read()
|
response = urlopen(httpbin.url).read()
|
||||||
assert cass.play_count == 0
|
assert cass.play_count == 0
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('synopsis.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('synopsis.yaml'))) as cass:
|
||||||
response2 = urlopen('http://httpbin.org/').read()
|
response2 = urlopen(httpbin.url).read()
|
||||||
assert cass.play_count == 1
|
assert cass.play_count == 1
|
||||||
cass._save(force=True)
|
cass._save(force=True)
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('synopsis.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('synopsis.yaml'))) as cass:
|
||||||
response3 = urlopen('http://httpbin.org/').read()
|
response3 = urlopen(httpbin.url).read()
|
||||||
assert cass.play_count == 1
|
assert cass.play_count == 1
|
||||||
|
|
||||||
assert response == response2
|
assert response == response2
|
||||||
assert response2 == response3
|
assert response2 == response3
|
||||||
|
|
||||||
|
|
||||||
def test_patched_content_json(tmpdir):
|
def test_patched_content_json(tmpdir, httpbin):
|
||||||
'''
|
'''
|
||||||
Ensure that what you pull from a json cassette is what came from the
|
Ensure that what you pull from a json cassette is what came from the
|
||||||
request
|
request
|
||||||
@@ -85,16 +74,16 @@ def test_patched_content_json(tmpdir):
|
|||||||
testfile = str(tmpdir.join('synopsis.json'))
|
testfile = str(tmpdir.join('synopsis.json'))
|
||||||
|
|
||||||
with vcr.use_cassette(testfile) as cass:
|
with vcr.use_cassette(testfile) as cass:
|
||||||
response = urlopen('http://httpbin.org/').read()
|
response = urlopen(httpbin.url).read()
|
||||||
assert cass.play_count == 0
|
assert cass.play_count == 0
|
||||||
|
|
||||||
with vcr.use_cassette(testfile) as cass:
|
with vcr.use_cassette(testfile) as cass:
|
||||||
response2 = urlopen('http://httpbin.org/').read()
|
response2 = urlopen(httpbin.url).read()
|
||||||
assert cass.play_count == 1
|
assert cass.play_count == 1
|
||||||
cass._save(force=True)
|
cass._save(force=True)
|
||||||
|
|
||||||
with vcr.use_cassette(testfile) as cass:
|
with vcr.use_cassette(testfile) as cass:
|
||||||
response3 = urlopen('http://httpbin.org/').read()
|
response3 = urlopen(httpbin.url).read()
|
||||||
assert cass.play_count == 1
|
assert cass.play_count == 1
|
||||||
|
|
||||||
assert response == response2
|
assert response == response2
|
||||||
|
|||||||
@@ -5,46 +5,46 @@ import vcr
|
|||||||
from six.moves.urllib.request import urlopen
|
from six.moves.urllib.request import urlopen
|
||||||
|
|
||||||
|
|
||||||
def test_set_serializer_default_config(tmpdir):
|
def test_set_serializer_default_config(tmpdir, httpbin):
|
||||||
my_vcr = vcr.VCR(serializer='json')
|
my_vcr = vcr.VCR(serializer='json')
|
||||||
|
|
||||||
with my_vcr.use_cassette(str(tmpdir.join('test.json'))):
|
with my_vcr.use_cassette(str(tmpdir.join('test.json'))):
|
||||||
assert my_vcr.serializer == 'json'
|
assert my_vcr.serializer == 'json'
|
||||||
urlopen('http://httpbin.org/get')
|
urlopen(httpbin.url + '/get')
|
||||||
|
|
||||||
with open(str(tmpdir.join('test.json'))) as f:
|
with open(str(tmpdir.join('test.json'))) as f:
|
||||||
assert json.loads(f.read())
|
assert json.loads(f.read())
|
||||||
|
|
||||||
|
|
||||||
def test_default_set_cassette_library_dir(tmpdir):
|
def test_default_set_cassette_library_dir(tmpdir, httpbin):
|
||||||
my_vcr = vcr.VCR(cassette_library_dir=str(tmpdir.join('subdir')))
|
my_vcr = vcr.VCR(cassette_library_dir=str(tmpdir.join('subdir')))
|
||||||
|
|
||||||
with my_vcr.use_cassette('test.json'):
|
with my_vcr.use_cassette('test.json'):
|
||||||
urlopen('http://httpbin.org/get')
|
urlopen(httpbin.url + '/get')
|
||||||
|
|
||||||
assert os.path.exists(str(tmpdir.join('subdir').join('test.json')))
|
assert os.path.exists(str(tmpdir.join('subdir').join('test.json')))
|
||||||
|
|
||||||
|
|
||||||
def test_override_set_cassette_library_dir(tmpdir):
|
def test_override_set_cassette_library_dir(tmpdir, httpbin):
|
||||||
my_vcr = vcr.VCR(cassette_library_dir=str(tmpdir.join('subdir')))
|
my_vcr = vcr.VCR(cassette_library_dir=str(tmpdir.join('subdir')))
|
||||||
|
|
||||||
cld = str(tmpdir.join('subdir2'))
|
cld = str(tmpdir.join('subdir2'))
|
||||||
|
|
||||||
with my_vcr.use_cassette('test.json', cassette_library_dir=cld):
|
with my_vcr.use_cassette('test.json', cassette_library_dir=cld):
|
||||||
urlopen('http://httpbin.org/get')
|
urlopen(httpbin.url + '/get')
|
||||||
|
|
||||||
assert os.path.exists(str(tmpdir.join('subdir2').join('test.json')))
|
assert os.path.exists(str(tmpdir.join('subdir2').join('test.json')))
|
||||||
assert not os.path.exists(str(tmpdir.join('subdir').join('test.json')))
|
assert not os.path.exists(str(tmpdir.join('subdir').join('test.json')))
|
||||||
|
|
||||||
|
|
||||||
def test_override_match_on(tmpdir):
|
def test_override_match_on(tmpdir, httpbin):
|
||||||
my_vcr = vcr.VCR(match_on=['method'])
|
my_vcr = vcr.VCR(match_on=['method'])
|
||||||
|
|
||||||
with my_vcr.use_cassette(str(tmpdir.join('test.json'))):
|
with my_vcr.use_cassette(str(tmpdir.join('test.json'))):
|
||||||
urlopen('http://httpbin.org/')
|
urlopen(httpbin.url)
|
||||||
|
|
||||||
with my_vcr.use_cassette(str(tmpdir.join('test.json'))) as cass:
|
with my_vcr.use_cassette(str(tmpdir.join('test.json'))) as cass:
|
||||||
urlopen('http://httpbin.org/get')
|
urlopen(httpbin.url + '/get')
|
||||||
|
|
||||||
assert len(cass) == 1
|
assert len(cass) == 1
|
||||||
assert cass.play_count == 1
|
assert cass.play_count == 1
|
||||||
|
|||||||
@@ -10,19 +10,19 @@ from six.moves.urllib.request import urlopen
|
|||||||
import vcr
|
import vcr
|
||||||
|
|
||||||
|
|
||||||
def test_disk_saver_nowrite(tmpdir):
|
def test_disk_saver_nowrite(tmpdir, httpbin):
|
||||||
'''
|
'''
|
||||||
Ensure that when you close a cassette without changing it it doesn't
|
Ensure that when you close a cassette without changing it it doesn't
|
||||||
rewrite the file
|
rewrite the file
|
||||||
'''
|
'''
|
||||||
fname = str(tmpdir.join('synopsis.yaml'))
|
fname = str(tmpdir.join('synopsis.yaml'))
|
||||||
with vcr.use_cassette(fname) as cass:
|
with vcr.use_cassette(fname) as cass:
|
||||||
urlopen('http://www.iana.org/domains/reserved').read()
|
urlopen(httpbin.url).read()
|
||||||
assert cass.play_count == 0
|
assert cass.play_count == 0
|
||||||
last_mod = os.path.getmtime(fname)
|
last_mod = os.path.getmtime(fname)
|
||||||
|
|
||||||
with vcr.use_cassette(fname) as cass:
|
with vcr.use_cassette(fname) as cass:
|
||||||
urlopen('http://www.iana.org/domains/reserved').read()
|
urlopen(httpbin.url).read()
|
||||||
assert cass.play_count == 1
|
assert cass.play_count == 1
|
||||||
assert cass.dirty is False
|
assert cass.dirty is False
|
||||||
last_mod2 = os.path.getmtime(fname)
|
last_mod2 = os.path.getmtime(fname)
|
||||||
@@ -30,14 +30,14 @@ def test_disk_saver_nowrite(tmpdir):
|
|||||||
assert last_mod == last_mod2
|
assert last_mod == last_mod2
|
||||||
|
|
||||||
|
|
||||||
def test_disk_saver_write(tmpdir):
|
def test_disk_saver_write(tmpdir, httpbin):
|
||||||
'''
|
'''
|
||||||
Ensure that when you close a cassette after changing it it does
|
Ensure that when you close a cassette after changing it it does
|
||||||
rewrite the file
|
rewrite the file
|
||||||
'''
|
'''
|
||||||
fname = str(tmpdir.join('synopsis.yaml'))
|
fname = str(tmpdir.join('synopsis.yaml'))
|
||||||
with vcr.use_cassette(fname) as cass:
|
with vcr.use_cassette(fname) as cass:
|
||||||
urlopen('http://www.iana.org/domains/reserved').read()
|
urlopen(httpbin.url).read()
|
||||||
assert cass.play_count == 0
|
assert cass.play_count == 0
|
||||||
last_mod = os.path.getmtime(fname)
|
last_mod = os.path.getmtime(fname)
|
||||||
|
|
||||||
@@ -46,8 +46,8 @@ def test_disk_saver_write(tmpdir):
|
|||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
with vcr.use_cassette(fname, record_mode='any') as cass:
|
with vcr.use_cassette(fname, record_mode='any') as cass:
|
||||||
urlopen('http://www.iana.org/domains/reserved').read()
|
urlopen(httpbin.url).read()
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url + '/get').read()
|
||||||
assert cass.play_count == 1
|
assert cass.play_count == 1
|
||||||
assert cass.dirty
|
assert cass.dirty
|
||||||
last_mod2 = os.path.getmtime(fname)
|
last_mod2 = os.path.getmtime(fname)
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ def _find_header(cassette, header):
|
|||||||
return any(header in request.headers for request in cassette.requests)
|
return any(header in request.headers for request in cassette.requests)
|
||||||
|
|
||||||
|
|
||||||
def test_filter_basic_auth(tmpdir):
|
def test_filter_basic_auth(tmpdir, httpbin):
|
||||||
url = 'http://httpbin.org/basic-auth/user/passwd'
|
url = httpbin.url + '/basic-auth/user/passwd'
|
||||||
cass_file = str(tmpdir.join('basic_auth_filter.yaml'))
|
cass_file = str(tmpdir.join('basic_auth_filter.yaml'))
|
||||||
my_vcr = vcr.VCR(match_on=['uri', 'method', 'headers'])
|
my_vcr = vcr.VCR(match_on=['uri', 'method', 'headers'])
|
||||||
# 2 requests, one with auth failure and one with auth success
|
# 2 requests, one with auth failure and one with auth success
|
||||||
@@ -44,8 +44,8 @@ def test_filter_basic_auth(tmpdir):
|
|||||||
assert len(cass) == 2
|
assert len(cass) == 2
|
||||||
|
|
||||||
|
|
||||||
def test_filter_querystring(tmpdir):
|
def test_filter_querystring(tmpdir, httpbin):
|
||||||
url = 'http://httpbin.org/?foo=bar'
|
url = httpbin.url + '/?foo=bar'
|
||||||
cass_file = str(tmpdir.join('filter_qs.yaml'))
|
cass_file = str(tmpdir.join('filter_qs.yaml'))
|
||||||
with vcr.use_cassette(cass_file, filter_query_parameters=['foo']):
|
with vcr.use_cassette(cass_file, filter_query_parameters=['foo']):
|
||||||
urlopen(url)
|
urlopen(url)
|
||||||
@@ -54,8 +54,8 @@ def test_filter_querystring(tmpdir):
|
|||||||
assert 'foo' not in cass.requests[0].url
|
assert 'foo' not in cass.requests[0].url
|
||||||
|
|
||||||
|
|
||||||
def test_filter_post_data(tmpdir):
|
def test_filter_post_data(tmpdir, httpbin):
|
||||||
url = 'http://httpbin.org/post'
|
url = httpbin.url + '/post'
|
||||||
data = urlencode({'id': 'secret', 'foo': 'bar'}).encode('utf-8')
|
data = urlencode({'id': 'secret', 'foo': 'bar'}).encode('utf-8')
|
||||||
cass_file = str(tmpdir.join('filter_pd.yaml'))
|
cass_file = str(tmpdir.join('filter_pd.yaml'))
|
||||||
with vcr.use_cassette(cass_file, filter_post_data_parameters=['id']):
|
with vcr.use_cassette(cass_file, filter_post_data_parameters=['id']):
|
||||||
@@ -64,9 +64,9 @@ def test_filter_post_data(tmpdir):
|
|||||||
assert b'id=secret' not in cass.requests[0].body
|
assert b'id=secret' not in cass.requests[0].body
|
||||||
|
|
||||||
|
|
||||||
def test_filter_json_post_data(tmpdir):
|
def test_filter_json_post_data(tmpdir, httpbin):
|
||||||
data = json.dumps({'id': 'secret', 'foo': 'bar'}).encode('utf-8')
|
data = json.dumps({'id': 'secret', 'foo': 'bar'}).encode('utf-8')
|
||||||
request = Request('http://httpbin.org/post', data=data)
|
request = Request(httpbin.url + '/post', data=data)
|
||||||
request.add_header('Content-Type', 'application/json')
|
request.add_header('Content-Type', 'application/json')
|
||||||
|
|
||||||
cass_file = str(tmpdir.join('filter_jpd.yaml'))
|
cass_file = str(tmpdir.join('filter_jpd.yaml'))
|
||||||
@@ -76,8 +76,8 @@ def test_filter_json_post_data(tmpdir):
|
|||||||
assert b'"id": "secret"' not in cass.requests[0].body
|
assert b'"id": "secret"' not in cass.requests[0].body
|
||||||
|
|
||||||
|
|
||||||
def test_filter_callback(tmpdir):
|
def test_filter_callback(tmpdir, httpbin):
|
||||||
url = 'http://httpbin.org/get'
|
url = httpbin.url + '/get'
|
||||||
cass_file = str(tmpdir.join('basic_auth_filter.yaml'))
|
cass_file = str(tmpdir.join('basic_auth_filter.yaml'))
|
||||||
|
|
||||||
def before_record_cb(request):
|
def before_record_cb(request):
|
||||||
@@ -96,8 +96,8 @@ def test_filter_callback(tmpdir):
|
|||||||
assert len(cass) == 0
|
assert len(cass) == 0
|
||||||
|
|
||||||
|
|
||||||
def test_decompress_gzip(tmpdir):
|
def test_decompress_gzip(tmpdir, httpbin):
|
||||||
url = 'http://httpbin.org/gzip'
|
url = httpbin.url + '/gzip'
|
||||||
request = Request(url, headers={'Accept-Encoding': ['gzip, deflate']})
|
request = Request(url, headers={'Accept-Encoding': ['gzip, deflate']})
|
||||||
cass_file = str(tmpdir.join('gzip_response.yaml'))
|
cass_file = str(tmpdir.join('gzip_response.yaml'))
|
||||||
with vcr.use_cassette(cass_file, decode_compressed_response=True):
|
with vcr.use_cassette(cass_file, decode_compressed_response=True):
|
||||||
@@ -108,8 +108,8 @@ def test_decompress_gzip(tmpdir):
|
|||||||
assert_is_json(decoded_response)
|
assert_is_json(decoded_response)
|
||||||
|
|
||||||
|
|
||||||
def test_decompress_deflate(tmpdir):
|
def test_decompress_deflate(tmpdir, httpbin):
|
||||||
url = 'http://httpbin.org/deflate'
|
url = httpbin.url + '/deflate'
|
||||||
request = Request(url, headers={'Accept-Encoding': ['gzip, deflate']})
|
request = Request(url, headers={'Accept-Encoding': ['gzip, deflate']})
|
||||||
cass_file = str(tmpdir.join('deflate_response.yaml'))
|
cass_file = str(tmpdir.join('deflate_response.yaml'))
|
||||||
with vcr.use_cassette(cass_file, decode_compressed_response=True):
|
with vcr.use_cassette(cass_file, decode_compressed_response=True):
|
||||||
@@ -120,9 +120,9 @@ def test_decompress_deflate(tmpdir):
|
|||||||
assert_is_json(decoded_response)
|
assert_is_json(decoded_response)
|
||||||
|
|
||||||
|
|
||||||
def test_decompress_regular(tmpdir):
|
def test_decompress_regular(tmpdir, httpbin):
|
||||||
"""Test that it doesn't try to decompress content that isn't compressed"""
|
"""Test that it doesn't try to decompress content that isn't compressed"""
|
||||||
url = 'http://httpbin.org/get'
|
url = httpbin.url + '/get'
|
||||||
cass_file = str(tmpdir.join('noncompressed_response.yaml'))
|
cass_file = str(tmpdir.join('noncompressed_response.yaml'))
|
||||||
with vcr.use_cassette(cass_file, decode_compressed_response=True):
|
with vcr.use_cassette(cass_file, decode_compressed_response=True):
|
||||||
urlopen(url)
|
urlopen(url)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
# External imports
|
# External imports
|
||||||
from six.moves.urllib_parse import urlencode
|
from six.moves.urllib_parse import urlencode
|
||||||
import pytest
|
import pytest
|
||||||
|
import pytest_httpbin.certs
|
||||||
|
|
||||||
# Internal imports
|
# Internal imports
|
||||||
import vcr
|
import vcr
|
||||||
@@ -13,141 +14,141 @@ from assertions import assert_cassette_has_one_response
|
|||||||
httplib2 = pytest.importorskip("httplib2")
|
httplib2 = pytest.importorskip("httplib2")
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(params=["https", "http"])
|
def http():
|
||||||
def scheme(request):
|
|
||||||
"""
|
"""
|
||||||
Fixture that returns both http and https
|
Returns an httplib2 HTTP instance
|
||||||
|
with the certificate replaced by the httpbin one.
|
||||||
"""
|
"""
|
||||||
return request.param
|
return httplib2.Http(ca_certs=pytest_httpbin.certs.where())
|
||||||
|
|
||||||
|
|
||||||
def test_response_code(scheme, tmpdir):
|
def test_response_code(tmpdir, httpbin_both):
|
||||||
'''Ensure we can read a response code from a fetch'''
|
'''Ensure we can read a response code from a fetch'''
|
||||||
url = scheme + '://httpbin.org/'
|
url = httpbin_both.url
|
||||||
with vcr.use_cassette(str(tmpdir.join('atts.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('atts.yaml'))):
|
||||||
resp, _ = httplib2.Http().request(url)
|
resp, _ = http().request(url)
|
||||||
code = resp.status
|
code = resp.status
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('atts.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('atts.yaml'))):
|
||||||
resp, _ = httplib2.Http().request(url)
|
resp, _ = http().request(url)
|
||||||
assert code == resp.status
|
assert code == resp.status
|
||||||
|
|
||||||
|
|
||||||
def test_random_body(scheme, tmpdir):
|
def test_random_body(httpbin_both, tmpdir):
|
||||||
'''Ensure we can read the content, and that it's served from cache'''
|
'''Ensure we can read the content, and that it's served from cache'''
|
||||||
url = scheme + '://httpbin.org/bytes/1024'
|
url = httpbin_both.url + '/bytes/1024'
|
||||||
with vcr.use_cassette(str(tmpdir.join('body.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('body.yaml'))):
|
||||||
_, content = httplib2.Http().request(url)
|
_, content = http().request(url)
|
||||||
body = content
|
body = content
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('body.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('body.yaml'))):
|
||||||
_, content = httplib2.Http().request(url)
|
_, content = http().request(url)
|
||||||
assert body == content
|
assert body == content
|
||||||
|
|
||||||
|
|
||||||
def test_response_headers(scheme, tmpdir):
|
def test_response_headers(tmpdir, httpbin_both):
|
||||||
'''Ensure we can get information from the response'''
|
'''Ensure we can get information from the response'''
|
||||||
url = scheme + '://httpbin.org/'
|
url = httpbin_both.url
|
||||||
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
||||||
resp, _ = httplib2.Http().request(url)
|
resp, _ = http().request(url)
|
||||||
headers = resp.items()
|
headers = resp.items()
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
||||||
resp, _ = httplib2.Http().request(url)
|
resp, _ = http().request(url)
|
||||||
assert set(headers) == set(resp.items())
|
assert set(headers) == set(resp.items())
|
||||||
|
|
||||||
|
|
||||||
def test_effective_url(scheme, tmpdir):
|
def test_effective_url(tmpdir, httpbin_both):
|
||||||
'''Ensure that the effective_url is captured'''
|
'''Ensure that the effective_url is captured'''
|
||||||
url = scheme + '://httpbin.org/redirect-to?url=/html'
|
url = httpbin_both.url + '/redirect-to?url=/html'
|
||||||
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
||||||
resp, _ = httplib2.Http().request(url)
|
resp, _ = http().request(url)
|
||||||
effective_url = resp['content-location']
|
effective_url = resp['content-location']
|
||||||
assert effective_url == scheme + '://httpbin.org/html'
|
assert effective_url == httpbin_both + '/html'
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
||||||
resp, _ = httplib2.Http().request(url)
|
resp, _ = http().request(url)
|
||||||
assert effective_url == resp['content-location']
|
assert effective_url == resp['content-location']
|
||||||
|
|
||||||
|
|
||||||
def test_multiple_requests(scheme, tmpdir):
|
def test_multiple_requests(tmpdir, httpbin_both):
|
||||||
'''Ensure that we can cache multiple requests'''
|
'''Ensure that we can cache multiple requests'''
|
||||||
urls = [
|
urls = [
|
||||||
scheme + '://httpbin.org/',
|
httpbin_both.url,
|
||||||
scheme + '://httpbin.org/',
|
httpbin_both.url,
|
||||||
scheme + '://httpbin.org/get',
|
httpbin_both.url + '/get',
|
||||||
scheme + '://httpbin.org/bytes/1024'
|
httpbin_both.url + '/bytes/1024',
|
||||||
]
|
]
|
||||||
with vcr.use_cassette(str(tmpdir.join('multiple.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('multiple.yaml'))) as cass:
|
||||||
[httplib2.Http().request(url) for url in urls]
|
[http().request(url) for url in urls]
|
||||||
assert len(cass) == len(urls)
|
assert len(cass) == len(urls)
|
||||||
|
|
||||||
|
|
||||||
def test_get_data(scheme, tmpdir):
|
def test_get_data(tmpdir, httpbin_both):
|
||||||
'''Ensure that it works with query data'''
|
'''Ensure that it works with query data'''
|
||||||
data = urlencode({'some': 1, 'data': 'here'})
|
data = urlencode({'some': 1, 'data': 'here'})
|
||||||
url = scheme + '://httpbin.org/get?' + data
|
url = httpbin_both.url + '/get?' + data
|
||||||
with vcr.use_cassette(str(tmpdir.join('get_data.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('get_data.yaml'))):
|
||||||
_, res1 = httplib2.Http().request(url)
|
_, res1 = http().request(url)
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('get_data.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('get_data.yaml'))):
|
||||||
_, res2 = httplib2.Http().request(url)
|
_, res2 = http().request(url)
|
||||||
|
|
||||||
assert res1 == res2
|
assert res1 == res2
|
||||||
|
|
||||||
|
|
||||||
def test_post_data(scheme, tmpdir):
|
def test_post_data(tmpdir, httpbin_both):
|
||||||
'''Ensure that it works when posting data'''
|
'''Ensure that it works when posting data'''
|
||||||
data = urlencode({'some': 1, 'data': 'here'})
|
data = urlencode({'some': 1, 'data': 'here'})
|
||||||
url = scheme + '://httpbin.org/post'
|
url = httpbin_both.url + '/post'
|
||||||
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))):
|
||||||
_, res1 = httplib2.Http().request(url, "POST", data)
|
_, res1 = http().request(url, "POST", data)
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))) as cass:
|
||||||
_, res2 = httplib2.Http().request(url, "POST", data)
|
_, res2 = http().request(url, "POST", data)
|
||||||
|
|
||||||
assert res1 == res2
|
assert res1 == res2
|
||||||
assert_cassette_has_one_response(cass)
|
assert_cassette_has_one_response(cass)
|
||||||
|
|
||||||
|
|
||||||
def test_post_unicode_data(scheme, tmpdir):
|
def test_post_unicode_data(tmpdir, httpbin_both):
|
||||||
'''Ensure that it works when posting unicode data'''
|
'''Ensure that it works when posting unicode data'''
|
||||||
data = urlencode({'snowman': u'☃'.encode('utf-8')})
|
data = urlencode({'snowman': u'☃'.encode('utf-8')})
|
||||||
url = scheme + '://httpbin.org/post'
|
url = httpbin_both.url + '/post'
|
||||||
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))):
|
||||||
_, res1 = httplib2.Http().request(url, "POST", data)
|
_, res1 = http().request(url, "POST", data)
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))) as cass:
|
||||||
_, res2 = httplib2.Http().request(url, "POST", data)
|
_, res2 = http().request(url, "POST", data)
|
||||||
|
|
||||||
assert res1 == res2
|
assert res1 == res2
|
||||||
assert_cassette_has_one_response(cass)
|
assert_cassette_has_one_response(cass)
|
||||||
|
|
||||||
|
|
||||||
def test_cross_scheme(tmpdir):
|
def test_cross_scheme(tmpdir, httpbin, httpbin_secure):
|
||||||
'''Ensure that requests between schemes are treated separately'''
|
'''Ensure that requests between schemes are treated separately'''
|
||||||
# First fetch a url under https, and then again under https and then
|
# First fetch a url under https, and then again under https and then
|
||||||
# ensure that we haven't served anything out of cache, and we have two
|
# ensure that we haven't served anything out of cache, and we have two
|
||||||
# requests / response pairs in the cassette
|
# requests / response pairs in the cassette
|
||||||
with vcr.use_cassette(str(tmpdir.join('cross_scheme.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('cross_scheme.yaml'))) as cass:
|
||||||
httplib2.Http().request('https://httpbin.org/')
|
http().request(httpbin_secure.url)
|
||||||
httplib2.Http().request('http://httpbin.org/')
|
http().request(httpbin.url)
|
||||||
assert len(cass) == 2
|
assert len(cass) == 2
|
||||||
assert cass.play_count == 0
|
assert cass.play_count == 0
|
||||||
|
|
||||||
|
|
||||||
def test_decorator(scheme, tmpdir):
|
def test_decorator(tmpdir, httpbin_both):
|
||||||
'''Test the decorator version of VCR.py'''
|
'''Test the decorator version of VCR.py'''
|
||||||
url = scheme + '://httpbin.org/'
|
url = httpbin_both.url
|
||||||
|
|
||||||
@vcr.use_cassette(str(tmpdir.join('atts.yaml')))
|
@vcr.use_cassette(str(tmpdir.join('atts.yaml')))
|
||||||
def inner1():
|
def inner1():
|
||||||
resp, _ = httplib2.Http().request(url)
|
resp, _ = http().request(url)
|
||||||
return resp['status']
|
return resp['status']
|
||||||
|
|
||||||
@vcr.use_cassette(str(tmpdir.join('atts.yaml')))
|
@vcr.use_cassette(str(tmpdir.join('atts.yaml')))
|
||||||
def inner2():
|
def inner2():
|
||||||
resp, _ = httplib2.Http().request(url)
|
resp, _ = http().request(url)
|
||||||
return resp['status']
|
return resp['status']
|
||||||
|
|
||||||
assert inner1() == inner2()
|
assert inner1() == inner2()
|
||||||
|
|||||||
@@ -1,54 +1,73 @@
|
|||||||
from six.moves.urllib.request import urlopen
|
from six.moves.urllib.request import urlopen
|
||||||
|
import socket
|
||||||
|
from contextlib import contextmanager
|
||||||
import vcr
|
import vcr
|
||||||
|
|
||||||
|
|
||||||
def test_ignore_localhost(tmpdir, httpserver):
|
@contextmanager
|
||||||
httpserver.serve_content('Hello!')
|
def overridden_dns(overrides):
|
||||||
|
"""
|
||||||
|
Monkeypatch socket.getaddrinfo() to override DNS lookups (name will resolve
|
||||||
|
to address)
|
||||||
|
"""
|
||||||
|
real_getaddrinfo = socket.getaddrinfo
|
||||||
|
|
||||||
|
def fake_getaddrinfo(*args, **kwargs):
|
||||||
|
if args[0] in overrides:
|
||||||
|
address = overrides[args[0]]
|
||||||
|
return [(2, 1, 6, '', (address, args[1]))]
|
||||||
|
return real_getaddrinfo(*args, **kwargs)
|
||||||
|
socket.getaddrinfo = fake_getaddrinfo
|
||||||
|
yield
|
||||||
|
socket.getaddrinfo = real_getaddrinfo
|
||||||
|
|
||||||
|
|
||||||
|
def test_ignore_localhost(tmpdir, httpbin):
|
||||||
|
with overridden_dns({'httpbin.org': '127.0.0.1'}):
|
||||||
cass_file = str(tmpdir.join('filter_qs.yaml'))
|
cass_file = str(tmpdir.join('filter_qs.yaml'))
|
||||||
with vcr.use_cassette(cass_file, ignore_localhost=True) as cass:
|
with vcr.use_cassette(cass_file, ignore_localhost=True) as cass:
|
||||||
urlopen(httpserver.url)
|
urlopen('http://localhost:{0}/'.format(httpbin.port))
|
||||||
assert len(cass) == 0
|
assert len(cass) == 0
|
||||||
urlopen('http://httpbin.org')
|
urlopen('http://httpbin.org:{0}/'.format(httpbin.port))
|
||||||
assert len(cass) == 1
|
assert len(cass) == 1
|
||||||
|
|
||||||
|
|
||||||
def test_ignore_httpbin(tmpdir, httpserver):
|
def test_ignore_httpbin(tmpdir, httpbin):
|
||||||
httpserver.serve_content('Hello!')
|
with overridden_dns({'httpbin.org': '127.0.0.1'}):
|
||||||
cass_file = str(tmpdir.join('filter_qs.yaml'))
|
cass_file = str(tmpdir.join('filter_qs.yaml'))
|
||||||
with vcr.use_cassette(
|
with vcr.use_cassette(
|
||||||
cass_file,
|
cass_file,
|
||||||
ignore_hosts=['httpbin.org']
|
ignore_hosts=['httpbin.org']
|
||||||
) as cass:
|
) as cass:
|
||||||
urlopen('http://httpbin.org')
|
urlopen('http://httpbin.org:{0}/'.format(httpbin.port))
|
||||||
assert len(cass) == 0
|
assert len(cass) == 0
|
||||||
urlopen(httpserver.url)
|
urlopen('http://localhost:{0}/'.format(httpbin.port))
|
||||||
assert len(cass) == 1
|
assert len(cass) == 1
|
||||||
|
|
||||||
|
|
||||||
def test_ignore_localhost_and_httpbin(tmpdir, httpserver):
|
def test_ignore_localhost_and_httpbin(tmpdir, httpbin):
|
||||||
httpserver.serve_content('Hello!')
|
with overridden_dns({'httpbin.org': '127.0.0.1'}):
|
||||||
cass_file = str(tmpdir.join('filter_qs.yaml'))
|
cass_file = str(tmpdir.join('filter_qs.yaml'))
|
||||||
with vcr.use_cassette(
|
with vcr.use_cassette(
|
||||||
cass_file,
|
cass_file,
|
||||||
ignore_hosts=['httpbin.org'],
|
ignore_hosts=['httpbin.org'],
|
||||||
ignore_localhost=True
|
ignore_localhost=True
|
||||||
) as cass:
|
) as cass:
|
||||||
urlopen('http://httpbin.org')
|
urlopen('http://httpbin.org:{0}'.format(httpbin.port))
|
||||||
urlopen(httpserver.url)
|
urlopen('http://localhost:{0}'.format(httpbin.port))
|
||||||
assert len(cass) == 0
|
assert len(cass) == 0
|
||||||
|
|
||||||
|
|
||||||
def test_ignore_localhost_twice(tmpdir, httpserver):
|
def test_ignore_localhost_twice(tmpdir, httpbin):
|
||||||
httpserver.serve_content('Hello!')
|
with overridden_dns({'httpbin.org': '127.0.0.1'}):
|
||||||
cass_file = str(tmpdir.join('filter_qs.yaml'))
|
cass_file = str(tmpdir.join('filter_qs.yaml'))
|
||||||
with vcr.use_cassette(cass_file, ignore_localhost=True) as cass:
|
with vcr.use_cassette(cass_file, ignore_localhost=True) as cass:
|
||||||
urlopen(httpserver.url)
|
urlopen('http://localhost:{0}'.format(httpbin.port))
|
||||||
assert len(cass) == 0
|
assert len(cass) == 0
|
||||||
urlopen('http://httpbin.org')
|
urlopen('http://httpbin.org:{0}'.format(httpbin.port))
|
||||||
assert len(cass) == 1
|
assert len(cass) == 1
|
||||||
with vcr.use_cassette(cass_file, ignore_localhost=True) as cass:
|
with vcr.use_cassette(cass_file, ignore_localhost=True) as cass:
|
||||||
assert len(cass) == 1
|
assert len(cass) == 1
|
||||||
urlopen(httpserver.url)
|
urlopen('http://localhost:{0}'.format(httpbin.port))
|
||||||
urlopen('http://httpbin.org')
|
urlopen('http://httpbin.org:{0}'.format(httpbin.port))
|
||||||
assert len(cass) == 1
|
assert len(cass) == 1
|
||||||
|
|||||||
@@ -6,15 +6,21 @@ from six.moves.urllib.request import urlopen
|
|||||||
DEFAULT_URI = 'http://httpbin.org/get?p1=q1&p2=q2' # base uri for testing
|
DEFAULT_URI = 'http://httpbin.org/get?p1=q1&p2=q2' # base uri for testing
|
||||||
|
|
||||||
|
|
||||||
|
def _replace_httpbin(uri, httpbin, httpbin_secure):
|
||||||
|
return uri.replace('http://httpbin.org', httpbin.url).replace('https://httpbin.org', httpbin_secure.url)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def cassette(tmpdir):
|
def cassette(tmpdir, httpbin, httpbin_secure):
|
||||||
"""
|
"""
|
||||||
Helper fixture used to prepare the cassete
|
Helper fixture used to prepare the cassete
|
||||||
returns path to the recorded cassette
|
returns path to the recorded cassette
|
||||||
"""
|
"""
|
||||||
|
default_uri = _replace_httpbin(DEFAULT_URI, httpbin, httpbin_secure)
|
||||||
|
|
||||||
cassette_path = str(tmpdir.join('test.yml'))
|
cassette_path = str(tmpdir.join('test.yml'))
|
||||||
with vcr.use_cassette(cassette_path, record_mode='all'):
|
with vcr.use_cassette(cassette_path, record_mode='all'):
|
||||||
urlopen(DEFAULT_URI)
|
urlopen(default_uri)
|
||||||
return cassette_path
|
return cassette_path
|
||||||
|
|
||||||
|
|
||||||
@@ -28,9 +34,6 @@ def cassette(tmpdir):
|
|||||||
('host',
|
('host',
|
||||||
'https://httpbin.org/post?a=b',
|
'https://httpbin.org/post?a=b',
|
||||||
'http://google.com/get?p1=q1&p2=q2'),
|
'http://google.com/get?p1=q1&p2=q2'),
|
||||||
('port',
|
|
||||||
'https://google.com:80/post?a=b',
|
|
||||||
'http://httpbin.org:5000/get?p1=q1&p2=q2'),
|
|
||||||
('path',
|
('path',
|
||||||
'https://google.com/get?a=b',
|
'https://google.com/get?a=b',
|
||||||
'http://httpbin.org/post?p1=q1&p2=q2'),
|
'http://httpbin.org/post?p1=q1&p2=q2'),
|
||||||
@@ -38,10 +41,15 @@ def cassette(tmpdir):
|
|||||||
'https://google.com/get?p2=q2&p1=q1',
|
'https://google.com/get?p2=q2&p1=q1',
|
||||||
'http://httpbin.org/get?p1=q1&a=b')
|
'http://httpbin.org/get?p1=q1&a=b')
|
||||||
])
|
])
|
||||||
def test_matchers(cassette, matcher, matching_uri, not_matching_uri):
|
def test_matchers(httpbin, httpbin_secure, cassette, matcher, matching_uri, not_matching_uri):
|
||||||
|
|
||||||
|
matching_uri = _replace_httpbin(matching_uri, httpbin, httpbin_secure)
|
||||||
|
not_matching_uri = _replace_httpbin(not_matching_uri, httpbin, httpbin_secure)
|
||||||
|
default_uri = _replace_httpbin(DEFAULT_URI, httpbin, httpbin_secure)
|
||||||
|
|
||||||
# play cassette with default uri
|
# play cassette with default uri
|
||||||
with vcr.use_cassette(cassette, match_on=[matcher]) as cass:
|
with vcr.use_cassette(cassette, match_on=[matcher]) as cass:
|
||||||
urlopen(DEFAULT_URI)
|
urlopen(default_uri)
|
||||||
assert cass.play_count == 1
|
assert cass.play_count == 1
|
||||||
|
|
||||||
# play cassette with matching on uri
|
# play cassette with matching on uri
|
||||||
@@ -55,7 +63,9 @@ def test_matchers(cassette, matcher, matching_uri, not_matching_uri):
|
|||||||
urlopen(not_matching_uri)
|
urlopen(not_matching_uri)
|
||||||
|
|
||||||
|
|
||||||
def test_method_matcher(cassette):
|
def test_method_matcher(cassette, httpbin, httpbin_secure):
|
||||||
|
default_uri = _replace_httpbin(DEFAULT_URI, httpbin, httpbin_secure)
|
||||||
|
|
||||||
# play cassette with matching on method
|
# play cassette with matching on method
|
||||||
with vcr.use_cassette(cassette, match_on=['method']) as cass:
|
with vcr.use_cassette(cassette, match_on=['method']) as cass:
|
||||||
urlopen('https://google.com/get?a=b')
|
urlopen('https://google.com/get?a=b')
|
||||||
@@ -65,7 +75,7 @@ def test_method_matcher(cassette):
|
|||||||
with pytest.raises(vcr.errors.CannotOverwriteExistingCassetteException):
|
with pytest.raises(vcr.errors.CannotOverwriteExistingCassetteException):
|
||||||
with vcr.use_cassette(cassette, match_on=['method']) as cass:
|
with vcr.use_cassette(cassette, match_on=['method']) as cass:
|
||||||
# is a POST request
|
# is a POST request
|
||||||
urlopen(DEFAULT_URI, data=b'')
|
urlopen(default_uri, data=b'')
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("uri", [
|
@pytest.mark.parametrize("uri", [
|
||||||
@@ -73,7 +83,10 @@ def test_method_matcher(cassette):
|
|||||||
'http://httpbin.org/get?p2=q2&p1=q1',
|
'http://httpbin.org/get?p2=q2&p1=q1',
|
||||||
'http://httpbin.org/get?p2=q2&p1=q1',
|
'http://httpbin.org/get?p2=q2&p1=q1',
|
||||||
])
|
])
|
||||||
def test_default_matcher_matches(cassette, uri):
|
def test_default_matcher_matches(cassette, uri, httpbin, httpbin_secure):
|
||||||
|
|
||||||
|
uri = _replace_httpbin(uri, httpbin, httpbin_secure)
|
||||||
|
|
||||||
with vcr.use_cassette(cassette) as cass:
|
with vcr.use_cassette(cassette) as cass:
|
||||||
urlopen(uri)
|
urlopen(uri)
|
||||||
assert cass.play_count == 1
|
assert cass.play_count == 1
|
||||||
@@ -82,18 +95,19 @@ def test_default_matcher_matches(cassette, uri):
|
|||||||
@pytest.mark.parametrize("uri", [
|
@pytest.mark.parametrize("uri", [
|
||||||
'https://httpbin.org/get?p1=q1&p2=q2',
|
'https://httpbin.org/get?p1=q1&p2=q2',
|
||||||
'http://google.com/get?p1=q1&p2=q2',
|
'http://google.com/get?p1=q1&p2=q2',
|
||||||
'http://httpbin.org:5000/get?p1=q1&p2=q2',
|
|
||||||
'http://httpbin.org/post?p1=q1&p2=q2',
|
'http://httpbin.org/post?p1=q1&p2=q2',
|
||||||
'http://httpbin.org/get?p1=q1&a=b'
|
'http://httpbin.org/get?p1=q1&a=b'
|
||||||
])
|
])
|
||||||
def test_default_matcher_does_not_match(cassette, uri):
|
def test_default_matcher_does_not_match(cassette, uri, httpbin, httpbin_secure):
|
||||||
|
uri = _replace_httpbin(uri, httpbin, httpbin_secure)
|
||||||
with pytest.raises(vcr.errors.CannotOverwriteExistingCassetteException):
|
with pytest.raises(vcr.errors.CannotOverwriteExistingCassetteException):
|
||||||
with vcr.use_cassette(cassette):
|
with vcr.use_cassette(cassette):
|
||||||
urlopen(uri)
|
urlopen(uri)
|
||||||
|
|
||||||
|
|
||||||
def test_default_matcher_does_not_match_on_method(cassette):
|
def test_default_matcher_does_not_match_on_method(cassette, httpbin, httpbin_secure):
|
||||||
|
default_uri = _replace_httpbin(DEFAULT_URI, httpbin, httpbin_secure)
|
||||||
with pytest.raises(vcr.errors.CannotOverwriteExistingCassetteException):
|
with pytest.raises(vcr.errors.CannotOverwriteExistingCassetteException):
|
||||||
with vcr.use_cassette(cassette):
|
with vcr.use_cassette(cassette):
|
||||||
# is a POST request
|
# is a POST request
|
||||||
urlopen(DEFAULT_URI, data=b'')
|
urlopen(default_uri, data=b'')
|
||||||
|
|||||||
@@ -3,18 +3,18 @@ import vcr
|
|||||||
from six.moves.urllib.request import urlopen
|
from six.moves.urllib.request import urlopen
|
||||||
|
|
||||||
|
|
||||||
def test_making_extra_request_raises_exception(tmpdir):
|
def test_making_extra_request_raises_exception(tmpdir, httpbin):
|
||||||
# make two requests in the first request that are considered
|
# make two requests in the first request that are considered
|
||||||
# identical (since the match is based on method)
|
# identical (since the match is based on method)
|
||||||
with vcr.use_cassette(str(tmpdir.join('test.json')), match_on=['method']):
|
with vcr.use_cassette(str(tmpdir.join('test.json')), match_on=['method']):
|
||||||
urlopen('http://httpbin.org/status/200')
|
urlopen(httpbin.url + '/status/200')
|
||||||
urlopen('http://httpbin.org/status/201')
|
urlopen(httpbin.url + '/status/201')
|
||||||
|
|
||||||
# Now, try to make three requests. The first two should return the
|
# Now, try to make three requests. The first two should return the
|
||||||
# correct status codes in order, and the third should raise an
|
# correct status codes in order, and the third should raise an
|
||||||
# exception.
|
# exception.
|
||||||
with vcr.use_cassette(str(tmpdir.join('test.json')), match_on=['method']):
|
with vcr.use_cassette(str(tmpdir.join('test.json')), match_on=['method']):
|
||||||
assert urlopen('http://httpbin.org/status/200').getcode() == 200
|
assert urlopen(httpbin.url + '/status/200').getcode() == 200
|
||||||
assert urlopen('http://httpbin.org/status/201').getcode() == 201
|
assert urlopen(httpbin.url + '/status/201').getcode() == 201
|
||||||
with pytest.raises(Exception):
|
with pytest.raises(Exception):
|
||||||
urlopen('http://httpbin.org/status/200')
|
urlopen(httpbin.url + '/status/200')
|
||||||
|
|||||||
@@ -3,62 +3,62 @@ import vcr
|
|||||||
from six.moves.urllib.request import urlopen
|
from six.moves.urllib.request import urlopen
|
||||||
|
|
||||||
|
|
||||||
def test_once_record_mode(tmpdir):
|
def test_once_record_mode(tmpdir, httpbin):
|
||||||
testfile = str(tmpdir.join('recordmode.yml'))
|
testfile = str(tmpdir.join('recordmode.yml'))
|
||||||
with vcr.use_cassette(testfile, record_mode="once"):
|
with vcr.use_cassette(testfile, record_mode="once"):
|
||||||
# cassette file doesn't exist, so create.
|
# cassette file doesn't exist, so create.
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
|
|
||||||
with vcr.use_cassette(testfile, record_mode="once"):
|
with vcr.use_cassette(testfile, record_mode="once"):
|
||||||
# make the same request again
|
# make the same request again
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
|
|
||||||
# the first time, it's played from the cassette.
|
# the first time, it's played from the cassette.
|
||||||
# but, try to access something else from the same cassette, and an
|
# but, try to access something else from the same cassette, and an
|
||||||
# exception is raised.
|
# exception is raised.
|
||||||
with pytest.raises(Exception):
|
with pytest.raises(Exception):
|
||||||
urlopen('http://httpbin.org/get').read()
|
urlopen(httpbin.url + '/get').read()
|
||||||
|
|
||||||
|
|
||||||
def test_once_record_mode_two_times(tmpdir):
|
def test_once_record_mode_two_times(tmpdir, httpbin):
|
||||||
testfile = str(tmpdir.join('recordmode.yml'))
|
testfile = str(tmpdir.join('recordmode.yml'))
|
||||||
with vcr.use_cassette(testfile, record_mode="once"):
|
with vcr.use_cassette(testfile, record_mode="once"):
|
||||||
# get two of the same file
|
# get two of the same file
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
|
|
||||||
with vcr.use_cassette(testfile, record_mode="once"):
|
with vcr.use_cassette(testfile, record_mode="once"):
|
||||||
# do it again
|
# do it again
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
|
|
||||||
|
|
||||||
def test_once_mode_three_times(tmpdir):
|
def test_once_mode_three_times(tmpdir, httpbin):
|
||||||
testfile = str(tmpdir.join('recordmode.yml'))
|
testfile = str(tmpdir.join('recordmode.yml'))
|
||||||
with vcr.use_cassette(testfile, record_mode="once"):
|
with vcr.use_cassette(testfile, record_mode="once"):
|
||||||
# get three of the same file
|
# get three of the same file
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
|
|
||||||
|
|
||||||
def test_new_episodes_record_mode(tmpdir):
|
def test_new_episodes_record_mode(tmpdir, httpbin):
|
||||||
testfile = str(tmpdir.join('recordmode.yml'))
|
testfile = str(tmpdir.join('recordmode.yml'))
|
||||||
|
|
||||||
with vcr.use_cassette(testfile, record_mode="new_episodes"):
|
with vcr.use_cassette(testfile, record_mode="new_episodes"):
|
||||||
# cassette file doesn't exist, so create.
|
# cassette file doesn't exist, so create.
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
|
|
||||||
with vcr.use_cassette(testfile, record_mode="new_episodes") as cass:
|
with vcr.use_cassette(testfile, record_mode="new_episodes") as cass:
|
||||||
# make the same request again
|
# make the same request again
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
|
|
||||||
# all responses have been played
|
# all responses have been played
|
||||||
assert cass.all_played
|
assert cass.all_played
|
||||||
|
|
||||||
# in the "new_episodes" record mode, we can add more requests to
|
# in the "new_episodes" record mode, we can add more requests to
|
||||||
# a cassette without repurcussions.
|
# a cassette without repurcussions.
|
||||||
urlopen('http://httpbin.org/get').read()
|
urlopen(httpbin.url + '/get').read()
|
||||||
|
|
||||||
# one of the responses has been played
|
# one of the responses has been played
|
||||||
assert cass.play_count == 1
|
assert cass.play_count == 1
|
||||||
@@ -71,9 +71,9 @@ def test_new_episodes_record_mode(tmpdir):
|
|||||||
assert len(cass.responses) == 2
|
assert len(cass.responses) == 2
|
||||||
|
|
||||||
|
|
||||||
def test_new_episodes_record_mode_two_times(tmpdir):
|
def test_new_episodes_record_mode_two_times(tmpdir, httpbin):
|
||||||
testfile = str(tmpdir.join('recordmode.yml'))
|
testfile = str(tmpdir.join('recordmode.yml'))
|
||||||
url = 'http://httpbin.org/bytes/1024'
|
url = httpbin.url + '/bytes/1024'
|
||||||
with vcr.use_cassette(testfile, record_mode="new_episodes"):
|
with vcr.use_cassette(testfile, record_mode="new_episodes"):
|
||||||
# cassette file doesn't exist, so create.
|
# cassette file doesn't exist, so create.
|
||||||
original_first_response = urlopen(url).read()
|
original_first_response = urlopen(url).read()
|
||||||
@@ -96,12 +96,12 @@ def test_new_episodes_record_mode_two_times(tmpdir):
|
|||||||
urlopen(url).read()
|
urlopen(url).read()
|
||||||
|
|
||||||
|
|
||||||
def test_all_record_mode(tmpdir):
|
def test_all_record_mode(tmpdir, httpbin):
|
||||||
testfile = str(tmpdir.join('recordmode.yml'))
|
testfile = str(tmpdir.join('recordmode.yml'))
|
||||||
|
|
||||||
with vcr.use_cassette(testfile, record_mode="all"):
|
with vcr.use_cassette(testfile, record_mode="all"):
|
||||||
# cassette file doesn't exist, so create.
|
# cassette file doesn't exist, so create.
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
|
|
||||||
with vcr.use_cassette(testfile, record_mode="all") as cass:
|
with vcr.use_cassette(testfile, record_mode="all") as cass:
|
||||||
# make the same request again
|
# make the same request again
|
||||||
@@ -109,7 +109,7 @@ def test_all_record_mode(tmpdir):
|
|||||||
|
|
||||||
# in the "all" record mode, we can add more requests to
|
# in the "all" record mode, we can add more requests to
|
||||||
# a cassette without repurcussions.
|
# a cassette without repurcussions.
|
||||||
urlopen('http://httpbin.org/get').read()
|
urlopen(httpbin.url + '/get').read()
|
||||||
|
|
||||||
# The cassette was never actually played, even though it existed.
|
# The cassette was never actually played, even though it existed.
|
||||||
# that's because, in "all" mode, the requests all go directly to
|
# that's because, in "all" mode, the requests all go directly to
|
||||||
@@ -117,26 +117,26 @@ def test_all_record_mode(tmpdir):
|
|||||||
assert cass.play_count == 0
|
assert cass.play_count == 0
|
||||||
|
|
||||||
|
|
||||||
def test_none_record_mode(tmpdir):
|
def test_none_record_mode(tmpdir, httpbin):
|
||||||
# Cassette file doesn't exist, yet we are trying to make a request.
|
# Cassette file doesn't exist, yet we are trying to make a request.
|
||||||
# raise hell.
|
# raise hell.
|
||||||
testfile = str(tmpdir.join('recordmode.yml'))
|
testfile = str(tmpdir.join('recordmode.yml'))
|
||||||
with vcr.use_cassette(testfile, record_mode="none"):
|
with vcr.use_cassette(testfile, record_mode="none"):
|
||||||
with pytest.raises(Exception):
|
with pytest.raises(Exception):
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
|
|
||||||
|
|
||||||
def test_none_record_mode_with_existing_cassette(tmpdir):
|
def test_none_record_mode_with_existing_cassette(tmpdir, httpbin):
|
||||||
# create a cassette file
|
# create a cassette file
|
||||||
testfile = str(tmpdir.join('recordmode.yml'))
|
testfile = str(tmpdir.join('recordmode.yml'))
|
||||||
|
|
||||||
with vcr.use_cassette(testfile, record_mode="all"):
|
with vcr.use_cassette(testfile, record_mode="all"):
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
|
|
||||||
# play from cassette file
|
# play from cassette file
|
||||||
with vcr.use_cassette(testfile, record_mode="none") as cass:
|
with vcr.use_cassette(testfile, record_mode="none") as cass:
|
||||||
urlopen('http://httpbin.org/').read()
|
urlopen(httpbin.url).read()
|
||||||
assert cass.play_count == 1
|
assert cass.play_count == 1
|
||||||
# but if I try to hit the net, raise an exception.
|
# but if I try to hit the net, raise an exception.
|
||||||
with pytest.raises(Exception):
|
with pytest.raises(Exception):
|
||||||
urlopen('http://httpbin.org/get').read()
|
urlopen(httpbin.url + '/get').read()
|
||||||
|
|||||||
@@ -10,27 +10,27 @@ def false_matcher(r1, r2):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def test_registered_true_matcher(tmpdir):
|
def test_registered_true_matcher(tmpdir, httpbin):
|
||||||
my_vcr = vcr.VCR()
|
my_vcr = vcr.VCR()
|
||||||
my_vcr.register_matcher('true', true_matcher)
|
my_vcr.register_matcher('true', true_matcher)
|
||||||
testfile = str(tmpdir.join('test.yml'))
|
testfile = str(tmpdir.join('test.yml'))
|
||||||
with my_vcr.use_cassette(testfile, match_on=['true']):
|
with my_vcr.use_cassette(testfile, match_on=['true']):
|
||||||
# These 2 different urls are stored as the same request
|
# These 2 different urls are stored as the same request
|
||||||
urlopen('http://httpbin.org/')
|
urlopen(httpbin.url)
|
||||||
urlopen('https://httpbin.org/get')
|
urlopen(httpbin.url + '/get')
|
||||||
|
|
||||||
with my_vcr.use_cassette(testfile, match_on=['true']):
|
with my_vcr.use_cassette(testfile, match_on=['true']):
|
||||||
# I can get the response twice even though I only asked for it once
|
# I can get the response twice even though I only asked for it once
|
||||||
urlopen('http://httpbin.org/get')
|
urlopen(httpbin.url + '/get')
|
||||||
urlopen('https://httpbin.org/get')
|
urlopen(httpbin.url + '/get')
|
||||||
|
|
||||||
|
|
||||||
def test_registered_false_matcher(tmpdir):
|
def test_registered_false_matcher(tmpdir, httpbin):
|
||||||
my_vcr = vcr.VCR()
|
my_vcr = vcr.VCR()
|
||||||
my_vcr.register_matcher('false', false_matcher)
|
my_vcr.register_matcher('false', false_matcher)
|
||||||
testfile = str(tmpdir.join('test.yml'))
|
testfile = str(tmpdir.join('test.yml'))
|
||||||
with my_vcr.use_cassette(testfile, match_on=['false']) as cass:
|
with my_vcr.use_cassette(testfile, match_on=['false']) as cass:
|
||||||
# These 2 different urls are stored as different requests
|
# These 2 different urls are stored as different requests
|
||||||
urlopen('http://httpbin.org/')
|
urlopen(httpbin.url)
|
||||||
urlopen('https://httpbin.org/get')
|
urlopen(httpbin.url + '/get')
|
||||||
assert len(cass) == 2
|
assert len(cass) == 2
|
||||||
|
|||||||
@@ -2,21 +2,18 @@ import vcr
|
|||||||
from six.moves.urllib.request import urlopen
|
from six.moves.urllib.request import urlopen
|
||||||
|
|
||||||
|
|
||||||
def test_recorded_request_uri_with_redirected_request(tmpdir):
|
def test_recorded_request_uri_with_redirected_request(tmpdir, httpbin):
|
||||||
with vcr.use_cassette(str(tmpdir.join('test.yml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('test.yml'))) as cass:
|
||||||
assert len(cass) == 0
|
assert len(cass) == 0
|
||||||
urlopen('http://httpbin.org/redirect/3')
|
urlopen(httpbin.url + '/redirect/3')
|
||||||
assert cass.requests[0].uri == 'http://httpbin.org/redirect/3'
|
assert cass.requests[0].uri == httpbin.url + '/redirect/3'
|
||||||
assert cass.requests[3].uri == 'http://httpbin.org/get'
|
assert cass.requests[3].uri == httpbin.url + '/get'
|
||||||
assert len(cass) == 4
|
assert len(cass) == 4
|
||||||
|
|
||||||
|
|
||||||
def test_records_multiple_header_values(tmpdir, httpserver):
|
def test_records_multiple_header_values(tmpdir, httpbin):
|
||||||
httpserver.serve_content('Hello!', headers=[('foo', 'bar'), ('foo', 'baz')])
|
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('test.yml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('test.yml'))) as cass:
|
||||||
assert len(cass) == 0
|
assert len(cass) == 0
|
||||||
|
urlopen(httpbin.url + '/response-headers?foo=bar&foo=baz')
|
||||||
urlopen(httpserver.url)
|
|
||||||
assert len(cass) == 1
|
assert len(cass) == 1
|
||||||
assert cass.responses[0]['headers']['foo'] == ['bar', 'baz']
|
assert cass.responses[0]['headers']['foo'] == ['bar', 'baz']
|
||||||
|
|||||||
@@ -8,15 +8,9 @@ from assertions import assert_cassette_empty, assert_is_json
|
|||||||
requests = pytest.importorskip("requests")
|
requests = pytest.importorskip("requests")
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(params=["https", "http"])
|
def test_status_code(httpbin_both, tmpdir):
|
||||||
def scheme(request):
|
|
||||||
'''Fixture that returns both http and https.'''
|
|
||||||
return request.param
|
|
||||||
|
|
||||||
|
|
||||||
def test_status_code(scheme, tmpdir):
|
|
||||||
'''Ensure that we can read the status code'''
|
'''Ensure that we can read the status code'''
|
||||||
url = scheme + '://httpbin.org/'
|
url = httpbin_both.url + '/'
|
||||||
with vcr.use_cassette(str(tmpdir.join('atts.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('atts.yaml'))):
|
||||||
status_code = requests.get(url).status_code
|
status_code = requests.get(url).status_code
|
||||||
|
|
||||||
@@ -24,9 +18,9 @@ def test_status_code(scheme, tmpdir):
|
|||||||
assert status_code == requests.get(url).status_code
|
assert status_code == requests.get(url).status_code
|
||||||
|
|
||||||
|
|
||||||
def test_headers(scheme, tmpdir):
|
def test_headers(httpbin_both, tmpdir):
|
||||||
'''Ensure that we can read the headers back'''
|
'''Ensure that we can read the headers back'''
|
||||||
url = scheme + '://httpbin.org/'
|
url = httpbin_both + '/'
|
||||||
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
||||||
headers = requests.get(url).headers
|
headers = requests.get(url).headers
|
||||||
|
|
||||||
@@ -34,9 +28,9 @@ def test_headers(scheme, tmpdir):
|
|||||||
assert headers == requests.get(url).headers
|
assert headers == requests.get(url).headers
|
||||||
|
|
||||||
|
|
||||||
def test_body(tmpdir, scheme):
|
def test_body(tmpdir, httpbin_both):
|
||||||
'''Ensure the responses are all identical enough'''
|
'''Ensure the responses are all identical enough'''
|
||||||
url = scheme + '://httpbin.org/bytes/1024'
|
url = httpbin_both + '/bytes/1024'
|
||||||
with vcr.use_cassette(str(tmpdir.join('body.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('body.yaml'))):
|
||||||
content = requests.get(url).content
|
content = requests.get(url).content
|
||||||
|
|
||||||
@@ -44,21 +38,21 @@ def test_body(tmpdir, scheme):
|
|||||||
assert content == requests.get(url).content
|
assert content == requests.get(url).content
|
||||||
|
|
||||||
|
|
||||||
def test_effective_url(scheme, tmpdir):
|
def test_effective_url(tmpdir, httpbin_both):
|
||||||
'''Ensure that the effective_url is captured'''
|
'''Ensure that the effective_url is captured'''
|
||||||
url = scheme + '://httpbin.org/redirect-to?url=/html'
|
url = httpbin_both.url + '/redirect-to?url=/html'
|
||||||
with vcr.use_cassette(str(tmpdir.join('url.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('url.yaml'))):
|
||||||
effective_url = requests.get(url).url
|
effective_url = requests.get(url).url
|
||||||
assert effective_url == scheme + '://httpbin.org/html'
|
assert effective_url == httpbin_both.url + '/html'
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('url.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('url.yaml'))):
|
||||||
assert effective_url == requests.get(url).url
|
assert effective_url == requests.get(url).url
|
||||||
|
|
||||||
|
|
||||||
def test_auth(tmpdir, scheme):
|
def test_auth(tmpdir, httpbin_both):
|
||||||
'''Ensure that we can handle basic auth'''
|
'''Ensure that we can handle basic auth'''
|
||||||
auth = ('user', 'passwd')
|
auth = ('user', 'passwd')
|
||||||
url = scheme + '://httpbin.org/basic-auth/user/passwd'
|
url = httpbin_both + '/basic-auth/user/passwd'
|
||||||
with vcr.use_cassette(str(tmpdir.join('auth.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('auth.yaml'))):
|
||||||
one = requests.get(url, auth=auth)
|
one = requests.get(url, auth=auth)
|
||||||
|
|
||||||
@@ -68,10 +62,10 @@ def test_auth(tmpdir, scheme):
|
|||||||
assert one.status_code == two.status_code
|
assert one.status_code == two.status_code
|
||||||
|
|
||||||
|
|
||||||
def test_auth_failed(tmpdir, scheme):
|
def test_auth_failed(tmpdir, httpbin_both):
|
||||||
'''Ensure that we can save failed auth statuses'''
|
'''Ensure that we can save failed auth statuses'''
|
||||||
auth = ('user', 'wrongwrongwrong')
|
auth = ('user', 'wrongwrongwrong')
|
||||||
url = scheme + '://httpbin.org/basic-auth/user/passwd'
|
url = httpbin_both + '/basic-auth/user/passwd'
|
||||||
with vcr.use_cassette(str(tmpdir.join('auth-failed.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('auth-failed.yaml'))) as cass:
|
||||||
# Ensure that this is empty to begin with
|
# Ensure that this is empty to begin with
|
||||||
assert_cassette_empty(cass)
|
assert_cassette_empty(cass)
|
||||||
@@ -81,10 +75,10 @@ def test_auth_failed(tmpdir, scheme):
|
|||||||
assert one.status_code == two.status_code == 401
|
assert one.status_code == two.status_code == 401
|
||||||
|
|
||||||
|
|
||||||
def test_post(tmpdir, scheme):
|
def test_post(tmpdir, httpbin_both):
|
||||||
'''Ensure that we can post and cache the results'''
|
'''Ensure that we can post and cache the results'''
|
||||||
data = {'key1': 'value1', 'key2': 'value2'}
|
data = {'key1': 'value1', 'key2': 'value2'}
|
||||||
url = scheme + '://httpbin.org/post'
|
url = httpbin_both + '/post'
|
||||||
with vcr.use_cassette(str(tmpdir.join('requests.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('requests.yaml'))):
|
||||||
req1 = requests.post(url, data).content
|
req1 = requests.post(url, data).content
|
||||||
|
|
||||||
@@ -94,11 +88,11 @@ def test_post(tmpdir, scheme):
|
|||||||
assert req1 == req2
|
assert req1 == req2
|
||||||
|
|
||||||
|
|
||||||
def test_post_chunked_binary(tmpdir, scheme):
|
def test_post_chunked_binary(tmpdir, httpbin_both):
|
||||||
'''Ensure that we can send chunked binary without breaking while trying to concatenate bytes with str.'''
|
'''Ensure that we can send chunked binary without breaking while trying to concatenate bytes with str.'''
|
||||||
data1 = iter([b'data', b'to', b'send'])
|
data1 = iter([b'data', b'to', b'send'])
|
||||||
data2 = iter([b'data', b'to', b'send'])
|
data2 = iter([b'data', b'to', b'send'])
|
||||||
url = scheme + '://httpbin.org/post'
|
url = httpbin_both.url + '/post'
|
||||||
with vcr.use_cassette(str(tmpdir.join('requests.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('requests.yaml'))):
|
||||||
req1 = requests.post(url, data1).content
|
req1 = requests.post(url, data1).content
|
||||||
print(req1)
|
print(req1)
|
||||||
@@ -109,9 +103,9 @@ def test_post_chunked_binary(tmpdir, scheme):
|
|||||||
assert req1 == req2
|
assert req1 == req2
|
||||||
|
|
||||||
|
|
||||||
def test_redirects(tmpdir, scheme):
|
def test_redirects(tmpdir, httpbin_both):
|
||||||
'''Ensure that we can handle redirects'''
|
'''Ensure that we can handle redirects'''
|
||||||
url = scheme + '://httpbin.org/redirect-to?url=bytes/1024'
|
url = httpbin_both + '/redirect-to?url=bytes/1024'
|
||||||
with vcr.use_cassette(str(tmpdir.join('requests.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('requests.yaml'))):
|
||||||
content = requests.get(url).content
|
content = requests.get(url).content
|
||||||
|
|
||||||
@@ -123,24 +117,24 @@ def test_redirects(tmpdir, scheme):
|
|||||||
assert cass.play_count == 2
|
assert cass.play_count == 2
|
||||||
|
|
||||||
|
|
||||||
def test_cross_scheme(tmpdir, scheme):
|
def test_cross_scheme(tmpdir, httpbin_secure, httpbin):
|
||||||
'''Ensure that requests between schemes are treated separately'''
|
'''Ensure that requests between schemes are treated separately'''
|
||||||
# First fetch a url under http, and then again under https and then
|
# First fetch a url under http, and then again under https and then
|
||||||
# ensure that we haven't served anything out of cache, and we have two
|
# ensure that we haven't served anything out of cache, and we have two
|
||||||
# requests / response pairs in the cassette
|
# requests / response pairs in the cassette
|
||||||
with vcr.use_cassette(str(tmpdir.join('cross_scheme.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('cross_scheme.yaml'))) as cass:
|
||||||
requests.get('https://httpbin.org/')
|
requests.get(httpbin_secure + '/')
|
||||||
requests.get('http://httpbin.org/')
|
requests.get(httpbin + '/')
|
||||||
assert cass.play_count == 0
|
assert cass.play_count == 0
|
||||||
assert len(cass) == 2
|
assert len(cass) == 2
|
||||||
|
|
||||||
|
|
||||||
def test_gzip(tmpdir, scheme):
|
def test_gzip(tmpdir, httpbin_both):
|
||||||
'''
|
'''
|
||||||
Ensure that requests (actually urllib3) is able to automatically decompress
|
Ensure that requests (actually urllib3) is able to automatically decompress
|
||||||
the response body
|
the response body
|
||||||
'''
|
'''
|
||||||
url = scheme + '://httpbin.org/gzip'
|
url = httpbin_both + '/gzip'
|
||||||
response = requests.get(url)
|
response = requests.get(url)
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('gzip.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('gzip.yaml'))):
|
||||||
@@ -151,7 +145,7 @@ def test_gzip(tmpdir, scheme):
|
|||||||
assert_is_json(response.content)
|
assert_is_json(response.content)
|
||||||
|
|
||||||
|
|
||||||
def test_session_and_connection_close(tmpdir, scheme):
|
def test_session_and_connection_close(tmpdir, httpbin):
|
||||||
'''
|
'''
|
||||||
This tests the issue in https://github.com/kevin1024/vcrpy/issues/48
|
This tests the issue in https://github.com/kevin1024/vcrpy/issues/48
|
||||||
|
|
||||||
@@ -162,29 +156,29 @@ def test_session_and_connection_close(tmpdir, scheme):
|
|||||||
with vcr.use_cassette(str(tmpdir.join('session_connection_closed.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('session_connection_closed.yaml'))):
|
||||||
session = requests.session()
|
session = requests.session()
|
||||||
|
|
||||||
session.get('http://httpbin.org/get', headers={'Connection': 'close'})
|
session.get(httpbin + '/get', headers={'Connection': 'close'})
|
||||||
session.get('http://httpbin.org/get', headers={'Connection': 'close'})
|
session.get(httpbin + '/get', headers={'Connection': 'close'})
|
||||||
|
|
||||||
|
|
||||||
def test_https_with_cert_validation_disabled(tmpdir):
|
def test_https_with_cert_validation_disabled(tmpdir, httpbin_secure):
|
||||||
with vcr.use_cassette(str(tmpdir.join('cert_validation_disabled.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('cert_validation_disabled.yaml'))):
|
||||||
requests.get('https://httpbin.org', verify=False)
|
requests.get(httpbin_secure.url, verify=False)
|
||||||
|
|
||||||
|
|
||||||
def test_session_can_make_requests_after_requests_unpatched(tmpdir):
|
def test_session_can_make_requests_after_requests_unpatched(tmpdir, httpbin):
|
||||||
with vcr.use_cassette(str(tmpdir.join('test_session_after_unpatched.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('test_session_after_unpatched.yaml'))):
|
||||||
session = requests.session()
|
session = requests.session()
|
||||||
session.get('http://httpbin.org/get')
|
session.get(httpbin + '/get')
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('test_session_after_unpatched.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('test_session_after_unpatched.yaml'))):
|
||||||
session = requests.session()
|
session = requests.session()
|
||||||
session.get('http://httpbin.org/get')
|
session.get(httpbin + '/get')
|
||||||
|
|
||||||
session.get('http://httpbin.org/status/200')
|
session.get(httpbin + '/status/200')
|
||||||
|
|
||||||
|
|
||||||
def test_session_created_before_use_cassette_is_patched(tmpdir, scheme):
|
def test_session_created_before_use_cassette_is_patched(tmpdir, httpbin_both):
|
||||||
url = scheme + '://httpbin.org/bytes/1024'
|
url = httpbin_both + '/bytes/1024'
|
||||||
# Record arbitrary, random data to the cassette
|
# Record arbitrary, random data to the cassette
|
||||||
with vcr.use_cassette(str(tmpdir.join('session_created_outside.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('session_created_outside.yaml'))):
|
||||||
session = requests.session()
|
session = requests.session()
|
||||||
@@ -193,20 +187,20 @@ def test_session_created_before_use_cassette_is_patched(tmpdir, scheme):
|
|||||||
# Create a session outside of any cassette context manager
|
# Create a session outside of any cassette context manager
|
||||||
session = requests.session()
|
session = requests.session()
|
||||||
# Make a request to make sure that a connectionpool is instantiated
|
# Make a request to make sure that a connectionpool is instantiated
|
||||||
session.get(scheme + '://httpbin.org/get')
|
session.get(httpbin_both + '/get')
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('session_created_outside.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('session_created_outside.yaml'))):
|
||||||
# These should only be the same if the patching succeeded.
|
# These should only be the same if the patching succeeded.
|
||||||
assert session.get(url).content == body
|
assert session.get(url).content == body
|
||||||
|
|
||||||
|
|
||||||
def test_nested_cassettes_with_session_created_before_nesting(scheme, tmpdir):
|
def test_nested_cassettes_with_session_created_before_nesting(httpbin_both, tmpdir):
|
||||||
'''
|
'''
|
||||||
This tests ensures that a session that was created while one cassette was
|
This tests ensures that a session that was created while one cassette was
|
||||||
active is patched to the use the responses of a second cassette when it
|
active is patched to the use the responses of a second cassette when it
|
||||||
is enabled.
|
is enabled.
|
||||||
'''
|
'''
|
||||||
url = scheme + '://httpbin.org/bytes/1024'
|
url = httpbin_both + '/bytes/1024'
|
||||||
with vcr.use_cassette(str(tmpdir.join('first_nested.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('first_nested.yaml'))):
|
||||||
session = requests.session()
|
session = requests.session()
|
||||||
first_body = session.get(url).content
|
first_body = session.get(url).content
|
||||||
@@ -222,12 +216,12 @@ def test_nested_cassettes_with_session_created_before_nesting(scheme, tmpdir):
|
|||||||
assert session.get(url).content == third_body
|
assert session.get(url).content == third_body
|
||||||
|
|
||||||
# Make sure that the session can now get content normally.
|
# Make sure that the session can now get content normally.
|
||||||
session.get('http://www.reddit.com')
|
assert 'User-agent' in session.get(httpbin_both.url + '/robots.txt').text
|
||||||
|
|
||||||
|
|
||||||
def test_post_file(tmpdir, scheme):
|
def test_post_file(tmpdir, httpbin_both):
|
||||||
'''Ensure that we handle posting a file.'''
|
'''Ensure that we handle posting a file.'''
|
||||||
url = scheme + '://httpbin.org/post'
|
url = httpbin_both + '/post'
|
||||||
with vcr.use_cassette(str(tmpdir.join('post_file.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('post_file.yaml'))) as cass:
|
||||||
# Don't use 2.7+ only style ',' separated with here because we support python 2.6
|
# Don't use 2.7+ only style ',' separated with here because we support python 2.6
|
||||||
with open('tox.ini') as f:
|
with open('tox.ini') as f:
|
||||||
@@ -244,7 +238,7 @@ def test_post_file(tmpdir, scheme):
|
|||||||
assert original_response == new_response
|
assert original_response == new_response
|
||||||
|
|
||||||
|
|
||||||
def test_filter_post_params(tmpdir, scheme):
|
def test_filter_post_params(tmpdir, httpbin_both):
|
||||||
'''
|
'''
|
||||||
This tests the issue in https://github.com/kevin1024/vcrpy/issues/158
|
This tests the issue in https://github.com/kevin1024/vcrpy/issues/158
|
||||||
|
|
||||||
@@ -252,7 +246,7 @@ def test_filter_post_params(tmpdir, scheme):
|
|||||||
with vcr.use_cassette(cass_file, filter_post_data_parameters=['id']) as cass:
|
with vcr.use_cassette(cass_file, filter_post_data_parameters=['id']) as cass:
|
||||||
assert b'id=secret' not in cass.requests[0].body
|
assert b'id=secret' not in cass.requests[0].body
|
||||||
'''
|
'''
|
||||||
url = scheme + '://httpbin.org/post'
|
url = httpbin_both.url + '/post'
|
||||||
cass_loc = str(tmpdir.join('filter_post_params.yaml'))
|
cass_loc = str(tmpdir.join('filter_post_params.yaml'))
|
||||||
with vcr.use_cassette(cass_loc, filter_post_data_parameters=['key']) as cass:
|
with vcr.use_cassette(cass_loc, filter_post_data_parameters=['key']) as cass:
|
||||||
requests.post(url, data={'key': 'value'})
|
requests.post(url, data={'key': 'value'})
|
||||||
|
|||||||
@@ -2,45 +2,45 @@ import vcr
|
|||||||
import six.moves.http_client as httplib
|
import six.moves.http_client as httplib
|
||||||
|
|
||||||
|
|
||||||
def _headers_are_case_insensitive():
|
def _headers_are_case_insensitive(host, port):
|
||||||
conn = httplib.HTTPConnection('httpbin.org')
|
conn = httplib.HTTPConnection(host, port)
|
||||||
conn.request('GET', "/cookies/set?k1=v1")
|
conn.request('GET', "/cookies/set?k1=v1")
|
||||||
r1 = conn.getresponse()
|
r1 = conn.getresponse()
|
||||||
cookie_data1 = r1.getheader('set-cookie')
|
cookie_data1 = r1.getheader('set-cookie')
|
||||||
conn = httplib.HTTPConnection('httpbin.org')
|
conn = httplib.HTTPConnection(host, port)
|
||||||
conn.request('GET', "/cookies/set?k1=v1")
|
conn.request('GET', "/cookies/set?k1=v1")
|
||||||
r2 = conn.getresponse()
|
r2 = conn.getresponse()
|
||||||
cookie_data2 = r2.getheader('Set-Cookie')
|
cookie_data2 = r2.getheader('Set-Cookie')
|
||||||
return cookie_data1 == cookie_data2
|
return cookie_data1 == cookie_data2
|
||||||
|
|
||||||
|
|
||||||
def test_case_insensitivity(tmpdir):
|
def test_case_insensitivity(tmpdir, httpbin):
|
||||||
testfile = str(tmpdir.join('case_insensitivity.yml'))
|
testfile = str(tmpdir.join('case_insensitivity.yml'))
|
||||||
# check if headers are case insensitive outside of vcrpy
|
# check if headers are case insensitive outside of vcrpy
|
||||||
outside = _headers_are_case_insensitive()
|
host, port = httpbin.host, httpbin.port
|
||||||
|
outside = _headers_are_case_insensitive(host, port)
|
||||||
with vcr.use_cassette(testfile):
|
with vcr.use_cassette(testfile):
|
||||||
# check if headers are case insensitive inside of vcrpy
|
# check if headers are case insensitive inside of vcrpy
|
||||||
inside = _headers_are_case_insensitive()
|
inside = _headers_are_case_insensitive(host, port)
|
||||||
# check if headers are case insensitive after vcrpy deserializes headers
|
# check if headers are case insensitive after vcrpy deserializes headers
|
||||||
inside2 = _headers_are_case_insensitive()
|
inside2 = _headers_are_case_insensitive(host, port)
|
||||||
|
|
||||||
# behavior should be the same both inside and outside
|
# behavior should be the same both inside and outside
|
||||||
assert outside == inside == inside2
|
assert outside == inside == inside2
|
||||||
|
|
||||||
|
|
||||||
def _multiple_header_value(httpserver):
|
def _multiple_header_value(httpbin):
|
||||||
conn = httplib.HTTPConnection('%s:%s' % httpserver.server_address)
|
conn = httplib.HTTPConnection(httpbin.host, httpbin.port)
|
||||||
conn.request('GET', "/")
|
conn.request('GET', "/response-headers?foo=bar&foo=baz")
|
||||||
r = conn.getresponse()
|
r = conn.getresponse()
|
||||||
return r.getheader('foo')
|
return r.getheader('foo')
|
||||||
|
|
||||||
|
|
||||||
def test_multiple_headers(tmpdir, httpserver):
|
def test_multiple_headers(tmpdir, httpbin):
|
||||||
testfile = str(tmpdir.join('multiple_headers.yaml'))
|
testfile = str(tmpdir.join('multiple_headers.yaml'))
|
||||||
httpserver.serve_content('Hello!', headers=[('foo', 'bar'), ('foo', 'baz')])
|
outside = _multiple_header_value(httpbin)
|
||||||
outside = _multiple_header_value(httpserver)
|
|
||||||
|
|
||||||
with vcr.use_cassette(testfile):
|
with vcr.use_cassette(testfile):
|
||||||
inside = _multiple_header_value(httpserver)
|
inside = _multiple_header_value(httpbin)
|
||||||
|
|
||||||
assert outside == inside
|
assert outside == inside
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
'''Integration tests with urllib2'''
|
'''Integration tests with urllib2'''
|
||||||
|
|
||||||
import pytest
|
|
||||||
from six.moves.urllib.request import urlopen
|
from six.moves.urllib.request import urlopen
|
||||||
from six.moves.urllib_parse import urlencode
|
from six.moves.urllib_parse import urlencode
|
||||||
|
import pytest_httpbin.certs
|
||||||
|
|
||||||
# Internal imports
|
# Internal imports
|
||||||
import vcr
|
import vcr
|
||||||
@@ -11,135 +11,136 @@ import vcr
|
|||||||
from assertions import assert_cassette_has_one_response
|
from assertions import assert_cassette_has_one_response
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(params=["https", "http"])
|
def urlopen_with_cafile(*args, **kwargs):
|
||||||
def scheme(request):
|
kwargs['cafile'] = pytest_httpbin.certs.where()
|
||||||
"""
|
try:
|
||||||
Fixture that returns both http and https
|
return urlopen(*args, **kwargs)
|
||||||
"""
|
except TypeError:
|
||||||
return request.param
|
# python2/pypi don't let us override this
|
||||||
|
del kwargs['cafile']
|
||||||
|
return urlopen(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
def test_response_code(scheme, tmpdir):
|
def test_response_code(httpbin_both, tmpdir):
|
||||||
'''Ensure we can read a response code from a fetch'''
|
'''Ensure we can read a response code from a fetch'''
|
||||||
url = scheme + '://httpbin.org/'
|
url = httpbin_both.url
|
||||||
with vcr.use_cassette(str(tmpdir.join('atts.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('atts.yaml'))):
|
||||||
code = urlopen(url).getcode()
|
code = urlopen_with_cafile(url).getcode()
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('atts.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('atts.yaml'))):
|
||||||
assert code == urlopen(url).getcode()
|
assert code == urlopen_with_cafile(url).getcode()
|
||||||
|
|
||||||
|
|
||||||
def test_random_body(scheme, tmpdir):
|
def test_random_body(httpbin_both, tmpdir):
|
||||||
'''Ensure we can read the content, and that it's served from cache'''
|
'''Ensure we can read the content, and that it's served from cache'''
|
||||||
url = scheme + '://httpbin.org/bytes/1024'
|
url = httpbin_both.url + '/bytes/1024'
|
||||||
with vcr.use_cassette(str(tmpdir.join('body.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('body.yaml'))):
|
||||||
body = urlopen(url).read()
|
body = urlopen_with_cafile(url).read()
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('body.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('body.yaml'))):
|
||||||
assert body == urlopen(url).read()
|
assert body == urlopen_with_cafile(url).read()
|
||||||
|
|
||||||
|
|
||||||
def test_response_headers(scheme, tmpdir):
|
def test_response_headers(httpbin_both, tmpdir):
|
||||||
'''Ensure we can get information from the response'''
|
'''Ensure we can get information from the response'''
|
||||||
url = scheme + '://httpbin.org/'
|
url = httpbin_both.url
|
||||||
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
||||||
open1 = urlopen(url).info().items()
|
open1 = urlopen_with_cafile(url).info().items()
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
||||||
open2 = urlopen(url).info().items()
|
open2 = urlopen_with_cafile(url).info().items()
|
||||||
|
|
||||||
assert sorted(open1) == sorted(open2)
|
assert sorted(open1) == sorted(open2)
|
||||||
|
|
||||||
|
|
||||||
def test_effective_url(scheme, tmpdir):
|
def test_effective_url(httpbin_both, tmpdir):
|
||||||
'''Ensure that the effective_url is captured'''
|
'''Ensure that the effective_url is captured'''
|
||||||
url = scheme + '://httpbin.org/redirect-to?url=/html'
|
url = httpbin_both.url + '/redirect-to?url=/html'
|
||||||
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
||||||
effective_url = urlopen(url).geturl()
|
effective_url = urlopen_with_cafile(url).geturl()
|
||||||
assert effective_url == scheme + '://httpbin.org/html'
|
assert effective_url == httpbin_both.url + '/html'
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
||||||
assert effective_url == urlopen(url).geturl()
|
assert effective_url == urlopen_with_cafile(url).geturl()
|
||||||
|
|
||||||
|
|
||||||
def test_multiple_requests(scheme, tmpdir):
|
def test_multiple_requests(httpbin_both, tmpdir):
|
||||||
'''Ensure that we can cache multiple requests'''
|
'''Ensure that we can cache multiple requests'''
|
||||||
urls = [
|
urls = [
|
||||||
scheme + '://httpbin.org/',
|
httpbin_both.url,
|
||||||
scheme + '://httpbin.org/',
|
httpbin_both.url,
|
||||||
scheme + '://httpbin.org/get',
|
httpbin_both.url + '/get',
|
||||||
scheme + '://httpbin.org/bytes/1024'
|
httpbin_both.url + '/bytes/1024',
|
||||||
]
|
]
|
||||||
with vcr.use_cassette(str(tmpdir.join('multiple.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('multiple.yaml'))) as cass:
|
||||||
[urlopen(url) for url in urls]
|
[urlopen_with_cafile(url) for url in urls]
|
||||||
assert len(cass) == len(urls)
|
assert len(cass) == len(urls)
|
||||||
|
|
||||||
|
|
||||||
def test_get_data(scheme, tmpdir):
|
def test_get_data(httpbin_both, tmpdir):
|
||||||
'''Ensure that it works with query data'''
|
'''Ensure that it works with query data'''
|
||||||
data = urlencode({'some': 1, 'data': 'here'})
|
data = urlencode({'some': 1, 'data': 'here'})
|
||||||
url = scheme + '://httpbin.org/get?' + data
|
url = httpbin_both.url + '/get?' + data
|
||||||
with vcr.use_cassette(str(tmpdir.join('get_data.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('get_data.yaml'))):
|
||||||
res1 = urlopen(url).read()
|
res1 = urlopen_with_cafile(url).read()
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('get_data.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('get_data.yaml'))):
|
||||||
res2 = urlopen(url).read()
|
res2 = urlopen_with_cafile(url).read()
|
||||||
|
|
||||||
assert res1 == res2
|
assert res1 == res2
|
||||||
|
|
||||||
|
|
||||||
def test_post_data(scheme, tmpdir):
|
def test_post_data(httpbin_both, tmpdir):
|
||||||
'''Ensure that it works when posting data'''
|
'''Ensure that it works when posting data'''
|
||||||
data = urlencode({'some': 1, 'data': 'here'}).encode('utf-8')
|
data = urlencode({'some': 1, 'data': 'here'}).encode('utf-8')
|
||||||
url = scheme + '://httpbin.org/post'
|
url = httpbin_both.url + '/post'
|
||||||
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))):
|
||||||
res1 = urlopen(url, data).read()
|
res1 = urlopen_with_cafile(url, data).read()
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))) as cass:
|
||||||
res2 = urlopen(url, data).read()
|
res2 = urlopen_with_cafile(url, data).read()
|
||||||
assert len(cass) == 1
|
assert len(cass) == 1
|
||||||
|
|
||||||
assert res1 == res2
|
assert res1 == res2
|
||||||
assert_cassette_has_one_response(cass)
|
assert_cassette_has_one_response(cass)
|
||||||
|
|
||||||
|
|
||||||
def test_post_unicode_data(scheme, tmpdir):
|
def test_post_unicode_data(httpbin_both, tmpdir):
|
||||||
'''Ensure that it works when posting unicode data'''
|
'''Ensure that it works when posting unicode data'''
|
||||||
data = urlencode({'snowman': u'☃'.encode('utf-8')}).encode('utf-8')
|
data = urlencode({'snowman': u'☃'.encode('utf-8')}).encode('utf-8')
|
||||||
url = scheme + '://httpbin.org/post'
|
url = httpbin_both.url + '/post'
|
||||||
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))):
|
||||||
res1 = urlopen(url, data).read()
|
res1 = urlopen_with_cafile(url, data).read()
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('post_data.yaml'))) as cass:
|
||||||
res2 = urlopen(url, data).read()
|
res2 = urlopen_with_cafile(url, data).read()
|
||||||
assert len(cass) == 1
|
assert len(cass) == 1
|
||||||
|
|
||||||
assert res1 == res2
|
assert res1 == res2
|
||||||
assert_cassette_has_one_response(cass)
|
assert_cassette_has_one_response(cass)
|
||||||
|
|
||||||
|
|
||||||
def test_cross_scheme(tmpdir):
|
def test_cross_scheme(tmpdir, httpbin_secure, httpbin):
|
||||||
'''Ensure that requests between schemes are treated separately'''
|
'''Ensure that requests between schemes are treated separately'''
|
||||||
# First fetch a url under https, and then again under https and then
|
# First fetch a url under https, and then again under https and then
|
||||||
# ensure that we haven't served anything out of cache, and we have two
|
# ensure that we haven't served anything out of cache, and we have two
|
||||||
# requests / response pairs in the cassette
|
# requests / response pairs in the cassette
|
||||||
with vcr.use_cassette(str(tmpdir.join('cross_scheme.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('cross_scheme.yaml'))) as cass:
|
||||||
urlopen('https://httpbin.org/')
|
urlopen_with_cafile(httpbin_secure.url)
|
||||||
urlopen('http://httpbin.org/')
|
urlopen_with_cafile(httpbin.url)
|
||||||
assert len(cass) == 2
|
assert len(cass) == 2
|
||||||
assert cass.play_count == 0
|
assert cass.play_count == 0
|
||||||
|
|
||||||
|
|
||||||
def test_decorator(scheme, tmpdir):
|
def test_decorator(httpbin_both, tmpdir):
|
||||||
'''Test the decorator version of VCR.py'''
|
'''Test the decorator version of VCR.py'''
|
||||||
url = scheme + '://httpbin.org/'
|
url = httpbin_both.url
|
||||||
|
|
||||||
@vcr.use_cassette(str(tmpdir.join('atts.yaml')))
|
@vcr.use_cassette(str(tmpdir.join('atts.yaml')))
|
||||||
def inner1():
|
def inner1():
|
||||||
return urlopen(url).getcode()
|
return urlopen_with_cafile(url).getcode()
|
||||||
|
|
||||||
@vcr.use_cassette(str(tmpdir.join('atts.yaml')))
|
@vcr.use_cassette(str(tmpdir.join('atts.yaml')))
|
||||||
def inner2():
|
def inner2():
|
||||||
return urlopen(url).getcode()
|
return urlopen_with_cafile(url).getcode()
|
||||||
|
|
||||||
assert inner1() == inner2()
|
assert inner1() == inner2()
|
||||||
|
|||||||
@@ -3,25 +3,17 @@
|
|||||||
# coding=utf-8
|
# coding=utf-8
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
import pytest_httpbin
|
||||||
import vcr
|
import vcr
|
||||||
from assertions import assert_cassette_empty, assert_is_json
|
from assertions import assert_cassette_empty, assert_is_json
|
||||||
certifi = pytest.importorskip("certifi")
|
|
||||||
urllib3 = pytest.importorskip("urllib3")
|
urllib3 = pytest.importorskip("urllib3")
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(params=["https", "http"])
|
|
||||||
def scheme(request):
|
|
||||||
"""
|
|
||||||
Fixture that returns both http and https
|
|
||||||
"""
|
|
||||||
return request.param
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope='module')
|
@pytest.fixture(scope='module')
|
||||||
def verify_pool_mgr():
|
def verify_pool_mgr():
|
||||||
return urllib3.PoolManager(
|
return urllib3.PoolManager(
|
||||||
cert_reqs='CERT_REQUIRED', # Force certificate check.
|
cert_reqs='CERT_REQUIRED', # Force certificate check.
|
||||||
ca_certs=certifi.where()
|
ca_certs=pytest_httpbin.certs.where()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -30,9 +22,9 @@ def pool_mgr():
|
|||||||
return urllib3.PoolManager()
|
return urllib3.PoolManager()
|
||||||
|
|
||||||
|
|
||||||
def test_status_code(scheme, tmpdir, verify_pool_mgr):
|
def test_status_code(httpbin_both, tmpdir, verify_pool_mgr):
|
||||||
'''Ensure that we can read the status code'''
|
'''Ensure that we can read the status code'''
|
||||||
url = scheme + '://httpbin.org/'
|
url = httpbin_both.url
|
||||||
with vcr.use_cassette(str(tmpdir.join('atts.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('atts.yaml'))):
|
||||||
status_code = verify_pool_mgr.request('GET', url).status
|
status_code = verify_pool_mgr.request('GET', url).status
|
||||||
|
|
||||||
@@ -40,9 +32,9 @@ def test_status_code(scheme, tmpdir, verify_pool_mgr):
|
|||||||
assert status_code == verify_pool_mgr.request('GET', url).status
|
assert status_code == verify_pool_mgr.request('GET', url).status
|
||||||
|
|
||||||
|
|
||||||
def test_headers(scheme, tmpdir, verify_pool_mgr):
|
def test_headers(tmpdir, httpbin_both, verify_pool_mgr):
|
||||||
'''Ensure that we can read the headers back'''
|
'''Ensure that we can read the headers back'''
|
||||||
url = scheme + '://httpbin.org/'
|
url = httpbin_both.url
|
||||||
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('headers.yaml'))):
|
||||||
headers = verify_pool_mgr.request('GET', url).headers
|
headers = verify_pool_mgr.request('GET', url).headers
|
||||||
|
|
||||||
@@ -50,9 +42,9 @@ def test_headers(scheme, tmpdir, verify_pool_mgr):
|
|||||||
assert headers == verify_pool_mgr.request('GET', url).headers
|
assert headers == verify_pool_mgr.request('GET', url).headers
|
||||||
|
|
||||||
|
|
||||||
def test_body(tmpdir, scheme, verify_pool_mgr):
|
def test_body(tmpdir, httpbin_both, verify_pool_mgr):
|
||||||
'''Ensure the responses are all identical enough'''
|
'''Ensure the responses are all identical enough'''
|
||||||
url = scheme + '://httpbin.org/bytes/1024'
|
url = httpbin_both.url + '/bytes/1024'
|
||||||
with vcr.use_cassette(str(tmpdir.join('body.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('body.yaml'))):
|
||||||
content = verify_pool_mgr.request('GET', url).data
|
content = verify_pool_mgr.request('GET', url).data
|
||||||
|
|
||||||
@@ -60,11 +52,11 @@ def test_body(tmpdir, scheme, verify_pool_mgr):
|
|||||||
assert content == verify_pool_mgr.request('GET', url).data
|
assert content == verify_pool_mgr.request('GET', url).data
|
||||||
|
|
||||||
|
|
||||||
def test_auth(tmpdir, scheme, verify_pool_mgr):
|
def test_auth(tmpdir, httpbin_both, verify_pool_mgr):
|
||||||
'''Ensure that we can handle basic auth'''
|
'''Ensure that we can handle basic auth'''
|
||||||
auth = ('user', 'passwd')
|
auth = ('user', 'passwd')
|
||||||
headers = urllib3.util.make_headers(basic_auth='{0}:{1}'.format(*auth))
|
headers = urllib3.util.make_headers(basic_auth='{0}:{1}'.format(*auth))
|
||||||
url = scheme + '://httpbin.org/basic-auth/user/passwd'
|
url = httpbin_both.url + '/basic-auth/user/passwd'
|
||||||
with vcr.use_cassette(str(tmpdir.join('auth.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('auth.yaml'))):
|
||||||
one = verify_pool_mgr.request('GET', url, headers=headers)
|
one = verify_pool_mgr.request('GET', url, headers=headers)
|
||||||
|
|
||||||
@@ -74,11 +66,11 @@ def test_auth(tmpdir, scheme, verify_pool_mgr):
|
|||||||
assert one.status == two.status
|
assert one.status == two.status
|
||||||
|
|
||||||
|
|
||||||
def test_auth_failed(tmpdir, scheme, verify_pool_mgr):
|
def test_auth_failed(tmpdir, httpbin_both, verify_pool_mgr):
|
||||||
'''Ensure that we can save failed auth statuses'''
|
'''Ensure that we can save failed auth statuses'''
|
||||||
auth = ('user', 'wrongwrongwrong')
|
auth = ('user', 'wrongwrongwrong')
|
||||||
headers = urllib3.util.make_headers(basic_auth='{0}:{1}'.format(*auth))
|
headers = urllib3.util.make_headers(basic_auth='{0}:{1}'.format(*auth))
|
||||||
url = scheme + '://httpbin.org/basic-auth/user/passwd'
|
url = httpbin_both.url + '/basic-auth/user/passwd'
|
||||||
with vcr.use_cassette(str(tmpdir.join('auth-failed.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('auth-failed.yaml'))) as cass:
|
||||||
# Ensure that this is empty to begin with
|
# Ensure that this is empty to begin with
|
||||||
assert_cassette_empty(cass)
|
assert_cassette_empty(cass)
|
||||||
@@ -88,10 +80,10 @@ def test_auth_failed(tmpdir, scheme, verify_pool_mgr):
|
|||||||
assert one.status == two.status == 401
|
assert one.status == two.status == 401
|
||||||
|
|
||||||
|
|
||||||
def test_post(tmpdir, scheme, verify_pool_mgr):
|
def test_post(tmpdir, httpbin_both, verify_pool_mgr):
|
||||||
'''Ensure that we can post and cache the results'''
|
'''Ensure that we can post and cache the results'''
|
||||||
data = {'key1': 'value1', 'key2': 'value2'}
|
data = {'key1': 'value1', 'key2': 'value2'}
|
||||||
url = scheme + '://httpbin.org/post'
|
url = httpbin_both.url + '/post'
|
||||||
with vcr.use_cassette(str(tmpdir.join('verify_pool_mgr.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('verify_pool_mgr.yaml'))):
|
||||||
req1 = verify_pool_mgr.request('POST', url, data).data
|
req1 = verify_pool_mgr.request('POST', url, data).data
|
||||||
|
|
||||||
@@ -101,9 +93,9 @@ def test_post(tmpdir, scheme, verify_pool_mgr):
|
|||||||
assert req1 == req2
|
assert req1 == req2
|
||||||
|
|
||||||
|
|
||||||
def test_redirects(tmpdir, scheme, verify_pool_mgr):
|
def test_redirects(tmpdir, httpbin_both, verify_pool_mgr):
|
||||||
'''Ensure that we can handle redirects'''
|
'''Ensure that we can handle redirects'''
|
||||||
url = scheme + '://httpbin.org/redirect-to?url=bytes/1024'
|
url = httpbin_both.url + '/redirect-to?url=bytes/1024'
|
||||||
with vcr.use_cassette(str(tmpdir.join('verify_pool_mgr.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('verify_pool_mgr.yaml'))):
|
||||||
content = verify_pool_mgr.request('GET', url).data
|
content = verify_pool_mgr.request('GET', url).data
|
||||||
|
|
||||||
@@ -115,24 +107,24 @@ def test_redirects(tmpdir, scheme, verify_pool_mgr):
|
|||||||
assert cass.play_count == 2
|
assert cass.play_count == 2
|
||||||
|
|
||||||
|
|
||||||
def test_cross_scheme(tmpdir, scheme, verify_pool_mgr):
|
def test_cross_scheme(tmpdir, httpbin, httpbin_secure, verify_pool_mgr):
|
||||||
'''Ensure that requests between schemes are treated separately'''
|
'''Ensure that requests between schemes are treated separately'''
|
||||||
# First fetch a url under http, and then again under https and then
|
# First fetch a url under http, and then again under https and then
|
||||||
# ensure that we haven't served anything out of cache, and we have two
|
# ensure that we haven't served anything out of cache, and we have two
|
||||||
# requests / response pairs in the cassette
|
# requests / response pairs in the cassette
|
||||||
with vcr.use_cassette(str(tmpdir.join('cross_scheme.yaml'))) as cass:
|
with vcr.use_cassette(str(tmpdir.join('cross_scheme.yaml'))) as cass:
|
||||||
verify_pool_mgr.request('GET', 'https://httpbin.org/')
|
verify_pool_mgr.request('GET', httpbin_secure.url)
|
||||||
verify_pool_mgr.request('GET', 'http://httpbin.org/')
|
verify_pool_mgr.request('GET', httpbin.url)
|
||||||
assert cass.play_count == 0
|
assert cass.play_count == 0
|
||||||
assert len(cass) == 2
|
assert len(cass) == 2
|
||||||
|
|
||||||
|
|
||||||
def test_gzip(tmpdir, scheme, verify_pool_mgr):
|
def test_gzip(tmpdir, httpbin_both, verify_pool_mgr):
|
||||||
'''
|
'''
|
||||||
Ensure that requests (actually urllib3) is able to automatically decompress
|
Ensure that requests (actually urllib3) is able to automatically decompress
|
||||||
the response body
|
the response body
|
||||||
'''
|
'''
|
||||||
url = scheme + '://httpbin.org/gzip'
|
url = httpbin_both.url + '/gzip'
|
||||||
response = verify_pool_mgr.request('GET', url)
|
response = verify_pool_mgr.request('GET', url)
|
||||||
|
|
||||||
with vcr.use_cassette(str(tmpdir.join('gzip.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('gzip.yaml'))):
|
||||||
@@ -143,6 +135,6 @@ def test_gzip(tmpdir, scheme, verify_pool_mgr):
|
|||||||
assert_is_json(response.data)
|
assert_is_json(response.data)
|
||||||
|
|
||||||
|
|
||||||
def test_https_with_cert_validation_disabled(tmpdir, pool_mgr):
|
def test_https_with_cert_validation_disabled(tmpdir, httpbin_secure, pool_mgr):
|
||||||
with vcr.use_cassette(str(tmpdir.join('cert_validation_disabled.yaml'))):
|
with vcr.use_cassette(str(tmpdir.join('cert_validation_disabled.yaml'))):
|
||||||
pool_mgr.request('GET', 'https://httpbin.org')
|
pool_mgr.request('GET', httpbin_secure.url)
|
||||||
|
|||||||
@@ -24,14 +24,14 @@ def test_domain_redirect():
|
|||||||
assert len(cass) == 2
|
assert len(cass) == 2
|
||||||
|
|
||||||
|
|
||||||
def test_flickr_multipart_upload():
|
def test_flickr_multipart_upload(httpbin, tmpdir):
|
||||||
"""
|
"""
|
||||||
The python-flickr-api project does a multipart
|
The python-flickr-api project does a multipart
|
||||||
upload that confuses vcrpy
|
upload that confuses vcrpy
|
||||||
"""
|
"""
|
||||||
def _pretend_to_be_flickr_library():
|
def _pretend_to_be_flickr_library():
|
||||||
content_type, body = "text/plain", "HELLO WORLD"
|
content_type, body = "text/plain", "HELLO WORLD"
|
||||||
h = httplib.HTTPConnection("httpbin.org")
|
h = httplib.HTTPConnection(httpbin.host, httpbin.port)
|
||||||
headers = {
|
headers = {
|
||||||
"Content-Type": content_type,
|
"Content-Type": content_type,
|
||||||
"content-length": str(len(body))
|
"content-length": str(len(body))
|
||||||
@@ -44,11 +44,12 @@ def test_flickr_multipart_upload():
|
|||||||
|
|
||||||
return data
|
return data
|
||||||
|
|
||||||
with vcr.use_cassette('fixtures/vcr_cassettes/flickr.yaml') as cass:
|
testfile = str(tmpdir.join('flickr.yml'))
|
||||||
|
with vcr.use_cassette(testfile) as cass:
|
||||||
_pretend_to_be_flickr_library()
|
_pretend_to_be_flickr_library()
|
||||||
assert len(cass) == 1
|
assert len(cass) == 1
|
||||||
|
|
||||||
with vcr.use_cassette('fixtures/vcr_cassettes/flickr.yaml') as cass:
|
with vcr.use_cassette(testfile) as cass:
|
||||||
assert len(cass) == 1
|
assert len(cass) == 1
|
||||||
_pretend_to_be_flickr_library()
|
_pretend_to_be_flickr_library()
|
||||||
assert cass.play_count == 1
|
assert cass.play_count == 1
|
||||||
@@ -61,13 +62,13 @@ def test_flickr_should_respond_with_200(tmpdir):
|
|||||||
assert r.status_code == 200
|
assert r.status_code == 200
|
||||||
|
|
||||||
|
|
||||||
def test_cookies(tmpdir):
|
def test_cookies(tmpdir, httpbin):
|
||||||
testfile = str(tmpdir.join('cookies.yml'))
|
testfile = str(tmpdir.join('cookies.yml'))
|
||||||
with vcr.use_cassette(testfile):
|
with vcr.use_cassette(testfile):
|
||||||
s = requests.Session()
|
s = requests.Session()
|
||||||
s.get("http://httpbin.org/cookies/set?k1=v1&k2=v2")
|
s.get(httpbin.url + "/cookies/set?k1=v1&k2=v2")
|
||||||
|
|
||||||
r2 = s.get("http://httpbin.org/cookies")
|
r2 = s.get(httpbin.url + "/cookies")
|
||||||
assert len(r2.json()['cookies']) == 2
|
assert len(r2.json()['cookies']) == 2
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
4
tox.ini
4
tox.ini
@@ -11,11 +11,11 @@ deps = flake8
|
|||||||
|
|
||||||
[testenv]
|
[testenv]
|
||||||
commands =
|
commands =
|
||||||
py.test {posargs}
|
./runtests.sh {posargs}
|
||||||
deps =
|
deps =
|
||||||
mock
|
mock
|
||||||
pytest
|
pytest
|
||||||
pytest-localserver
|
pytest-httpbin
|
||||||
PyYAML
|
PyYAML
|
||||||
requests1: requests==1.2.3
|
requests1: requests==1.2.3
|
||||||
requests27: requests==2.7.0
|
requests27: requests==2.7.0
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ class VCRHTTPSConnectionWithTimeout(VCRHTTPSConnection,
|
|||||||
'strict',
|
'strict',
|
||||||
'timeout',
|
'timeout',
|
||||||
'source_address',
|
'source_address',
|
||||||
|
'ca_certs',
|
||||||
))
|
))
|
||||||
unknown_keys = set(kwargs.keys()) - safe_keys
|
unknown_keys = set(kwargs.keys()) - safe_keys
|
||||||
safe_kwargs = kwargs.copy()
|
safe_kwargs = kwargs.copy()
|
||||||
|
|||||||
Reference in New Issue
Block a user