#!/usr/bin/env python # -*- coding: utf-8 -*- import io import json import time import os import sys import unittest import requests from requests.compat import str, bytes, StringIO # import envoy from requests import HTTPError from requests import get, post, head, put from requests.auth import HTTPBasicAuth, HTTPDigestAuth if (sys.platform == 'win32') and ('HTTPBIN_URL' not in os.environ): os.environ['HTTPBIN_URL'] = 'http://httpbin.org/' # TODO: Detect an open port. PORT = os.environ.get('HTTPBIN_PORT', '7077') HTTPBIN_URL = os.environ.get('HTTPBIN_URL', 'http://0.0.0.0:%s/' % (PORT)) 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 RequestsTestSuite(TestSetup, 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") assert request.path_url == "/get/test%20case" 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'