#!/usr/bin/env python # -*- coding: utf-8 -*- # from __future__ import unicode_literals # Path hack. import sys import os sys.path.insert(0, os.path.abspath('..')) import json import unittest import pickle import tempfile import requests from requests.compat import str, StringIO # import envoy from requests import HTTPError from requests import get, post, head, put from requests.auth import HTTPBasicAuth, HTTPDigestAuth from requests.exceptions import InvalidURL if 'HTTPBIN_URL' not in os.environ: os.environ['HTTPBIN_URL'] = 'http://httpbin.org/' HTTPBIN_URL = os.environ.get('HTTPBIN_URL') def httpbin(*suffix): """Returns url for HTTPBIN resource.""" return HTTPBIN_URL + '/'.join(suffix) SERVICES = (httpbin, ) _httpbin = False class TestSetup(object): """Requests test cases.""" # It goes to eleven. _multiprocess_can_split_ = True def setUp(self): global _httpbin if (not 'HTTPBIN_URL' in os.environ) and not _httpbin: # c = envoy.connect('httpbin %s' % (PORT)) # time.sleep(1) _httpbin = True class TestBaseMixin(object): def assertCookieHas(self, cookie, **kwargs): """Assert that a cookie has various specified properties.""" for attr, expected_value in kwargs.items(): cookie_attr = getattr(cookie, attr) message = 'Failed comparison for %s: %s != %s' % (attr, cookie_attr, expected_value) self.assertEqual(cookie_attr, expected_value, message) class RequestsTestSuite(TestSetup, TestBaseMixin, unittest.TestCase): """Requests test cases.""" def test_entry_points(self): requests.session requests.session().get requests.session().head requests.get requests.head requests.put requests.patch requests.post def test_invalid_url(self): self.assertRaises(ValueError, get, 'hiwpefhipowhefopw') def test_path_is_not_double_encoded(self): request = requests.Request("http://0.0.0.0/get/test case") self.assertEqual(request.path_url, "/get/test%20case") def test_params_are_added_before_fragment(self): request = requests.Request( "http://example.com/path#fragment", params={"a": "b"}) self.assertEqual(request.full_url, "http://example.com/path?a=b#fragment") request = requests.Request( "http://example.com/path?key=value#fragment", params={"a": "b"}) self.assertEqual(request.full_url, "http://example.com/path?key=value&a=b#fragment") def test_params_accepts_kv_list(self): request = requests.Request('http://example.com/path', params=[('a', 'b')]) self.assertEqual(request.full_url, 'http://example.com/path?a=b') def test_HTTP_200_OK_GET(self): r = get(httpbin('get')) self.assertEqual(r.status_code, 200) def test_response_sent(self): r = get(httpbin('get')) self.assertTrue(r.request.sent) def test_HTTP_302_ALLOW_REDIRECT_GET(self): r = get(httpbin('redirect', '1')) self.assertEqual(r.status_code, 200) def test_HTTP_302_GET(self): r = get(httpbin('redirect', '1'), allow_redirects=False) self.assertEqual(r.status_code, 302) def test_HTTP_200_OK_GET_WITH_PARAMS(self): heads = {'User-agent': 'Mozilla/5.0'} r = get(httpbin('user-agent'), headers=heads) assert heads['User-agent'] in r.text self.assertEqual(r.status_code, 200) def test_HTTP_200_OK_GET_WITH_MIXED_PARAMS(self): heads = {'User-agent': 'Mozilla/5.0'} r = get(httpbin('get') + '?test=true', params={'q': 'test'}, headers=heads) self.assertEqual(r.status_code, 200) # def test_unicode_headers(self): # # Simply calling requests with a unicode instance should simply work # # when the characters are all representable using latin-1: # heads = { u'User-Agent': u'Requests Test Suite' } # requests.get(url=httpbin('get'), headers=heads) # # Characters outside latin-1 should raise an exception: # heads = { u'User-Agent': u'\u30cd\u30c3\u30c8\u30ef\u30fc\u30af' } # self.assertRaises(UnicodeEncodeError, requests.get, # url=httpbin('get'), headers=heads) # def test_session_with_escaped_url(self): # # Test a URL that contains percent-escaped characters # # This URL should not be modified (double-escaped) # # Tests: # # - Quoted illegal characters ("%20" (' '), "%3C" ('<'), "%3E" ('>')) # # - Quoted reserved characters ("%25" ('%'), "%23" ('#'), "%2F" ('/')) # # - Quoted non-ASCII characters ("%C3%98", "%C3%A5") # path_fully_escaped = '%3Ca%25b%23c%2Fd%3E/%C3%98%20%C3%A5' # url = httpbin('get/' + path_fully_escaped) # response = get(url) # self.assertEqual(response.url, httpbin('get/' + path_fully_escaped)) # # Test that illegal characters in a path get properly percent-escaped # # Tests: # # - Bare illegal characters (space, '<') # # - Bare non-ASCII characters ('\u00d8') # path = u'