Files
requests/tests/test_utils.py
T
Cory Benfield c02520ed99 Make sure we reset environment variables.
Turns out nose runs all the tests in one process, so changing the
os.environ dictionary makes everything go horribly wrong.
2012-11-18 12:31:55 +00:00

123 lines
4.3 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import codecs
import os
import sys
import unittest
import random
# Path hack.
sys.path.insert(0, os.path.abspath('..'))
from requests.utils import get_environ_proxies
import requests.utils
from requests.compat import is_py3, bytes
if is_py3:
unichr = chr
byteschr = lambda c: bytes([c])
else:
byteschr = chr
class UtilityTests(unittest.TestCase):
"""Tests for the JSON UTF encoding guessing code."""
codecs = (
'utf-8', 'utf-8-sig',
'utf-16', 'utf-16-le', 'utf-16-be',
'utf-32', 'utf-32-le', 'utf-32-be'
)
def test_guess_encoding(self):
# Throw 4-character ASCII strings (encoded to a UTF encoding)
# at the guess routine; it should correctly guess all codecs.
guess = requests.utils.guess_json_utf
for c in range(33, 127): # printable only
sample = unichr(c) * 4
for codec in self.codecs:
res = guess(sample.encode(codec))
self.assertEqual(res, codec)
def test_smoke_encoding(self):
# Throw random 4-byte strings at the guess function.
# Any guess for a UTF encoding is verified, a decode exception
# is a test failure.
guess = requests.utils.guess_json_utf
for i in range(1000):
sample = bytes().join(
[byteschr(random.randrange(256)) for _ in range(4)])
res = guess(sample)
if res is not None:
# This should decode without errors if this is *really*
# something in this encoding. However, UTF-8 is a lot
# more picky, so we expect errors there. UTF-16 surrogate
# pairs also fail
try:
sample.decode(res)
except UnicodeDecodeError as e:
self.assertEqual(e.args[0].replace('-', '').lower(),
res.replace('-', '').lower())
if res == 'utf-8':
self.assertTrue(e.args[-1], (
'invalid continuation byte',
'invalid start byte'))
continue
if res == 'utf-16':
self.assertEqual(e.args[-1], 'unexpected end of data')
self.assertTrue(sample[:2] in (
codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE))
# the second two bytes are in the range \ud800-\udfff
# if someone wants to add tests for that as well. I don't
# see the need; we are not testing UTF decoding here.
continue
raise
def test_get_environ_proxies_respects_no_proxy(self):
'''This test confirms that the no_proxy environment setting is
respected by get_environ_proxies().'''
# Store the current environment settings.
try:
old_http_proxy = os.environ['http_proxy']
except KeyError:
old_http_proxy = None
try:
old_no_proxy = os.environ['no_proxy']
except KeyError:
old_no_proxy = None
# Set up some example environment settings.
os.environ['http_proxy'] = 'http://www.example.com/'
os.environ['no_proxy'] = r'localhost,.0.0.1:8080'
# Set up expected proxy return values.
proxy_yes = {'http': 'http://www.example.com/'}
proxy_no = {}
# Check that we get the right things back.
self.assertEqual(proxy_yes,
get_environ_proxies('http://www.google.com/'))
self.assertEqual(proxy_no,
get_environ_proxies('http://localhost/test'))
self.assertEqual(proxy_no,
get_environ_proxies('http://127.0.0.1:8080/'))
self.assertEqual(proxy_yes,
get_environ_proxies('http://127.0.0.1:8081/'))
# Return the settings to what they were.
if old_http_proxy:
os.environ['http_proxy'] = old_http_proxy
else:
del os.environ['http_proxy']
if old_no_proxy:
os.environ['no_proxy'] = old_no_proxy
else:
del os.environ['no_proxy']
if __name__ == '__main__':
unittest.main()