1
0
mirror of https://github.com/kevin1024/vcrpy.git synced 2025-12-10 09:35:34 +00:00
Files
vcrpy/tests/test_urllib2.py
Dan Lecocq b488ca67fe Substantial refactoring
This refactoring includes some PEP-8 compliance changes, as well as some more
complete testing to ensure that we're in fact serving everything out of
cassettes when we thing we are.

Incidentally, it also includes fixes for #3 and #4
2013-08-11 15:05:39 -10:00

142 lines
5.8 KiB
Python

'''Integration tests with urllib2'''
# coding=utf-8
# Internal imports
import vcr
from .common import TestVCR
# Testing urllib2 fetching
import os
import urllib2
from urllib import urlencode
class TestUrllib2(TestVCR):
'''Base class for tests for urllib2'''
fixtures = os.path.join('tests', 'fixtures', 'urllib2')
class TestUrllib2Http(TestUrllib2):
'''Tests for integration with urllib2'''
scheme = 'http'
def test_response_code(self):
'''Ensure we can read a response code from a fetch'''
url = self.scheme + '://httpbin.org/'
with vcr.use_cassette(self.fixture('atts.yaml')) as cass:
# Ensure that this is empty to begin with
self.assertEqual(len(cass), 0)
self.assertEqual(len(cass.cached()), 0)
self.assertEqual(
urllib2.urlopen(url).getcode(),
urllib2.urlopen(url).getcode())
# Ensure that we've now cached a single response
self.assertEqual(len(cass), 1)
self.assertEqual(len(cass.cached()), 1)
def test_random_body(self):
'''Ensure we can read the content, and that it's served from cache'''
url = self.scheme + '://httpbin.org/bytes/1024'
with vcr.use_cassette(self.fixture('body.yaml')) as cass:
# Ensure that this is empty to begin with
self.assertEqual(len(cass), 0)
self.assertEqual(len(cass.cached()), 0)
self.assertEqual(
urllib2.urlopen(url).read(),
urllib2.urlopen(url).read())
# Ensure that we've now cached a single response
self.assertEqual(len(cass), 1)
self.assertEqual(len(cass.cached()), 1)
def test_response_headers(self):
'''Ensure we can get information from the response'''
url = self.scheme + '://httpbin.org/'
with vcr.use_cassette(self.fixture('headers.yaml')) as cass:
# Ensure that this is empty to begin with
self.assertEqual(len(cass), 0)
self.assertEqual(len(cass.cached()), 0)
self.assertEqual(
urllib2.urlopen(url).info().items(),
urllib2.urlopen(url).info().items())
# Ensure that we've now cached a single response
self.assertEqual(len(cass), 1)
def test_multiple_requests(self):
'''Ensure that we can cache multiple requests'''
urls = [
self.scheme + '://httpbin.org/',
self.scheme + '://httpbin.org/get',
self.scheme + '://httpbin.org/bytes/1024'
]
with vcr.use_cassette(self.fixture('multiple.yaml')) as cass:
for index in range(len(urls)):
url = urls[index]
self.assertEqual(len(cass), index)
self.assertEqual(len(cass.cached()), index)
self.assertEqual(
urllib2.urlopen(url).read(),
urllib2.urlopen(url).read())
self.assertEqual(len(cass), index + 1)
self.assertEqual(len(cass.cached()), index + 1)
def test_get_data(self):
'''Ensure that it works with query data'''
data = urlencode({'some': 1, 'data': 'here'})
url = self.scheme + '://httpbin.org/get?' + data
with vcr.use_cassette(self.fixture('get_data.yaml')) as cass:
# Ensure that this is empty to begin with
self.assertEqual(len(cass), 0)
self.assertEqual(len(cass.cached()), 0)
self.assertEqual(
urllib2.urlopen(url).read(),
urllib2.urlopen(url).read())
# Ensure that we've now cached a single response
self.assertEqual(len(cass), 1)
self.assertEqual(len(cass.cached()), 1)
def test_post_data(self):
'''Ensure that it works when posting data'''
data = urlencode({'some': 1, 'data': 'here'})
url = self.scheme + '://httpbin.org/post'
with vcr.use_cassette(self.fixture('post_data.yaml')) as cass:
# Ensure that this is empty to begin with
self.assertEqual(len(cass), 0)
self.assertEqual(len(cass.cached()), 0)
self.assertEqual(
urllib2.urlopen(url, data).read(),
urllib2.urlopen(url, data).read())
# Ensure that we've now cached a single response
self.assertEqual(len(cass), 1)
self.assertEqual(len(cass.cached()), 1)
def test_post_unicode_data(self):
'''Ensure that it works when posting unicode data'''
data = urlencode({'snowman': u''.encode('utf-8')})
url = self.scheme + '://httpbin.org/post'
with vcr.use_cassette(self.fixture('post_data.yaml')) as cass:
# Ensure that this is empty to begin with
self.assertEqual(len(cass), 0)
self.assertEqual(len(cass.cached()), 0)
self.assertEqual(
urllib2.urlopen(url, data).read(),
urllib2.urlopen(url, data).read())
# Ensure that we've now cached a single response
self.assertEqual(len(cass), 1)
self.assertEqual(len(cass.cached()), 1)
class TestUrllib2Https(TestUrllib2Http):
'''Similar tests but for http status codes'''
scheme = 'https'
def test_cross_scheme(self):
'''Ensure that requests between schemes are treated separately'''
# 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
# requests / response pairs in the cassette
with vcr.use_cassette(self.fixture('cross_scheme.yaml')) as cass:
urllib2.urlopen('https://httpbin.org/')
urllib2.urlopen('http://httpbin.org/')
self.assertEqual(len(cass), 2)
self.assertEqual(len(cass.cached()), 0)