test_response.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. # Licensed under the Apache License, Version 2.0 (the "License"); you may
  2. # not use this file except in compliance with the License. You may obtain
  3. # a copy of the License at
  4. #
  5. # https://www.apache.org/licenses/LICENSE-2.0
  6. #
  7. # Unless required by applicable law or agreed to in writing, software
  8. # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  9. # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  10. # License for the specific language governing permissions and limitations
  11. # under the License.
  12. import pickle
  13. import six
  14. from requests_mock import exceptions
  15. from requests_mock import request
  16. from requests_mock import response
  17. from . import base
  18. class ResponseTests(base.TestCase):
  19. def setUp(self):
  20. super(ResponseTests, self).setUp()
  21. self.method = 'GET'
  22. self.url = 'http://test.url/path'
  23. self.request = request._RequestObjectProxy._create(self.method,
  24. self.url,
  25. {})
  26. def create_response(self, **kwargs):
  27. return response.create_response(self.request, **kwargs)
  28. def test_create_response_body_args(self):
  29. self.assertRaises(RuntimeError,
  30. self.create_response,
  31. raw='abc',
  32. body='abc')
  33. self.assertRaises(RuntimeError,
  34. self.create_response,
  35. text='abc',
  36. json={'a': 1})
  37. def test_content_type(self):
  38. self.assertRaises(TypeError, self.create_response, text=55)
  39. self.assertRaises(TypeError, self.create_response, text={'a': 1})
  40. # this only works on python 2 because bytes is a string
  41. if six.PY3:
  42. self.assertRaises(TypeError, self.create_response, text=six.b(''))
  43. def test_text_type(self):
  44. self.assertRaises(TypeError, self.create_response, content=six.u('t'))
  45. self.assertRaises(TypeError, self.create_response, content={'a': 1})
  46. self.assertRaises(TypeError, self.create_response, content=six.u(''))
  47. def test_json_body(self):
  48. data = {'a': 1}
  49. resp = self.create_response(json=data)
  50. self.assertEqual('{"a": 1}', resp.text)
  51. self.assertIsInstance(resp.text, six.string_types)
  52. self.assertIsInstance(resp.content, six.binary_type)
  53. self.assertEqual(data, resp.json())
  54. def test_body_body(self):
  55. value = 'data'
  56. body = six.BytesIO(six.b(value))
  57. resp = self.create_response(body=body)
  58. self.assertEqual(value, resp.text)
  59. self.assertIsInstance(resp.text, six.string_types)
  60. self.assertIsInstance(resp.content, six.binary_type)
  61. def test_setting_connection(self):
  62. conn = object()
  63. resp = self.create_response(connection=conn)
  64. self.assertIs(conn, resp.connection)
  65. def test_send_from_no_connection(self):
  66. resp = self.create_response()
  67. self.assertRaises(exceptions.InvalidRequest,
  68. resp.connection.send, self.request)
  69. def test_cookies_from_header(self):
  70. # domain must be same as request url to pass policy check
  71. headers = {'Set-Cookie': 'fig=newton; Path=/test; domain=.test.url'}
  72. resp = self.create_response(headers=headers)
  73. self.assertEqual('newton', resp.cookies['fig'])
  74. self.assertEqual(['/test'], resp.cookies.list_paths())
  75. self.assertEqual(['.test.url'], resp.cookies.list_domains())
  76. def test_cookies_from_dict(self):
  77. # This is a syntax we get from requests. I'm not sure i like it.
  78. resp = self.create_response(cookies={'fig': 'newton',
  79. 'sugar': 'apple'})
  80. self.assertEqual('newton', resp.cookies['fig'])
  81. self.assertEqual('apple', resp.cookies['sugar'])
  82. def test_cookies_with_jar(self):
  83. jar = response.CookieJar()
  84. jar.set('fig', 'newton', path='/foo', domain='.test.url')
  85. jar.set('sugar', 'apple', path='/bar', domain='.test.url')
  86. resp = self.create_response(cookies=jar)
  87. self.assertEqual('newton', resp.cookies['fig'])
  88. self.assertEqual('apple', resp.cookies['sugar'])
  89. self.assertEqual({'/foo', '/bar'}, set(resp.cookies.list_paths()))
  90. self.assertEqual(['.test.url'], resp.cookies.list_domains())
  91. def test_response_pickle(self):
  92. text = 'hello world'
  93. jar = response.CookieJar()
  94. jar.set('fig', 'newton', path='/foo', domain='.test.url')
  95. orig_resp = self.create_response(cookies=jar, text=text)
  96. d = pickle.dumps(orig_resp)
  97. new_resp = pickle.loads(d)
  98. self.assertEqual(text, new_resp.text)
  99. self.assertEqual('newton', new_resp.cookies['fig'])
  100. self.assertIsNone(new_resp.request.matcher)
  101. def test_response_encoding(self):
  102. headers = {"content-type": "text/html; charset=ISO-8859-1"}
  103. resp = self.create_response(headers=headers,
  104. text="<html><body></body></html")
  105. self.assertEqual('ISO-8859-1', resp.encoding)
  106. def test_default_reason(self):
  107. resp = self.create_response()
  108. self.assertEqual('OK', resp.reason)
  109. def test_custom_reason(self):
  110. reason = 'Live long and prosper'
  111. resp = self.create_response(status_code=201, reason=reason)
  112. self.assertEqual(201, resp.status_code)
  113. self.assertEqual(reason, resp.reason)
  114. def test_some_other_response_reasons(self):
  115. reasons = {
  116. 301: 'Moved Permanently',
  117. 410: 'Gone',
  118. 503: 'Service Unavailable',
  119. }
  120. for code, reason in six.iteritems(reasons):
  121. self.assertEqual(reason,
  122. self.create_response(status_code=code).reason)