test_core.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. import requests
  4. import requests_oauthlib
  5. import oauthlib
  6. import os.path
  7. from io import StringIO
  8. import unittest
  9. try:
  10. import mock
  11. except ImportError:
  12. from unittest import mock
  13. @mock.patch("oauthlib.oauth1.rfc5849.generate_timestamp")
  14. @mock.patch("oauthlib.oauth1.rfc5849.generate_nonce")
  15. class OAuth1Test(unittest.TestCase):
  16. def testFormEncoded(self, generate_nonce, generate_timestamp):
  17. """OAuth1 assumes form encoded if content type is not specified."""
  18. generate_nonce.return_value = "abc"
  19. generate_timestamp.return_value = "1"
  20. oauth = requests_oauthlib.OAuth1("client_key")
  21. headers = {"Content-type": "application/x-www-form-urlencoded"}
  22. r = requests.Request(
  23. method="POST",
  24. url="http://a.b/path?query=retain",
  25. auth=oauth,
  26. data="this=really&is=&+form=encoded",
  27. headers=headers,
  28. )
  29. a = r.prepare()
  30. self.assertEqual(a.url, "http://a.b/path?query=retain")
  31. self.assertEqual(a.body, b"this=really&is=&+form=encoded")
  32. self.assertEqual(
  33. a.headers.get("Content-Type"), b"application/x-www-form-urlencoded"
  34. )
  35. # guess content-type
  36. r = requests.Request(
  37. method="POST",
  38. url="http://a.b/path?query=retain",
  39. auth=oauth,
  40. data="this=really&is=&+form=encoded",
  41. )
  42. b = r.prepare()
  43. self.assertEqual(b.url, "http://a.b/path?query=retain")
  44. self.assertEqual(b.body, b"this=really&is=&+form=encoded")
  45. self.assertEqual(
  46. b.headers.get("Content-Type"), b"application/x-www-form-urlencoded"
  47. )
  48. self.assertEqual(a.headers.get("Authorization"), b.headers.get("Authorization"))
  49. def testNonFormEncoded(self, generate_nonce, generate_timestamp):
  50. """OAuth signature only depend on body if it is form encoded."""
  51. generate_nonce.return_value = "abc"
  52. generate_timestamp.return_value = "1"
  53. oauth = requests_oauthlib.OAuth1("client_key")
  54. r = requests.Request(
  55. method="POST",
  56. url="http://a.b/path?query=retain",
  57. auth=oauth,
  58. data="this really is not form encoded",
  59. )
  60. a = r.prepare()
  61. r = requests.Request(
  62. method="POST", url="http://a.b/path?query=retain", auth=oauth
  63. )
  64. b = r.prepare()
  65. self.assertEqual(a.headers.get("Authorization"), b.headers.get("Authorization"))
  66. r = requests.Request(
  67. method="POST",
  68. url="http://a.b/path?query=retain",
  69. auth=oauth,
  70. files={"test": StringIO("hello")},
  71. )
  72. c = r.prepare()
  73. self.assertEqual(b.headers.get("Authorization"), c.headers.get("Authorization"))
  74. @unittest.skip("test uses real http://httpbin.org")
  75. def testCanPostBinaryData(self, generate_nonce, generate_timestamp):
  76. """
  77. Test we can post binary data. Should prevent regression of the
  78. UnicodeDecodeError issue.
  79. """
  80. generate_nonce.return_value = "abc"
  81. generate_timestamp.return_value = "1"
  82. oauth = requests_oauthlib.OAuth1("client_key")
  83. import yatest.common
  84. dirname = yatest.common.test_source_path()
  85. fname = os.path.join(dirname, "test.bin")
  86. with open(fname, "rb") as f:
  87. r = requests.post(
  88. "http://httpbin.org/post",
  89. data={"hi": "there"},
  90. files={"media": (os.path.basename(f.name), f)},
  91. headers={"content-type": "application/octet-stream"},
  92. auth=oauth,
  93. )
  94. self.assertEqual(r.status_code, 200)
  95. @unittest.skip("test uses real http://httpbin.org")
  96. def test_url_is_native_str(self, generate_nonce, generate_timestamp):
  97. """
  98. Test that the URL is always a native string.
  99. """
  100. generate_nonce.return_value = "abc"
  101. generate_timestamp.return_value = "1"
  102. oauth = requests_oauthlib.OAuth1("client_key")
  103. r = requests.get("http://httpbin.org/get", auth=oauth)
  104. self.assertIsInstance(r.request.url, str)
  105. @unittest.skip("test uses real http://httpbin.org")
  106. def test_content_type_override(self, generate_nonce, generate_timestamp):
  107. """
  108. Content type should only be guessed if none is given.
  109. """
  110. generate_nonce.return_value = "abc"
  111. generate_timestamp.return_value = "1"
  112. oauth = requests_oauthlib.OAuth1("client_key")
  113. data = "a"
  114. r = requests.post("http://httpbin.org/get", data=data, auth=oauth)
  115. self.assertEqual(
  116. r.request.headers.get("Content-Type"), b"application/x-www-form-urlencoded"
  117. )
  118. r = requests.post(
  119. "http://httpbin.org/get",
  120. auth=oauth,
  121. data=data,
  122. headers={"Content-type": "application/json"},
  123. )
  124. self.assertEqual(r.request.headers.get("Content-Type"), b"application/json")
  125. def test_register_client_class(self, generate_timestamp, generate_nonce):
  126. class ClientSubclass(oauthlib.oauth1.Client):
  127. pass
  128. self.assertTrue(hasattr(requests_oauthlib.OAuth1, "client_class"))
  129. self.assertEqual(requests_oauthlib.OAuth1.client_class, oauthlib.oauth1.Client)
  130. normal = requests_oauthlib.OAuth1("client_key")
  131. self.assertIsInstance(normal.client, oauthlib.oauth1.Client)
  132. self.assertNotIsInstance(normal.client, ClientSubclass)
  133. requests_oauthlib.OAuth1.client_class = ClientSubclass
  134. self.assertEqual(requests_oauthlib.OAuth1.client_class, ClientSubclass)
  135. custom = requests_oauthlib.OAuth1("client_key")
  136. self.assertIsInstance(custom.client, oauthlib.oauth1.Client)
  137. self.assertIsInstance(custom.client, ClientSubclass)
  138. overridden = requests_oauthlib.OAuth1(
  139. "client_key", client_class=oauthlib.oauth1.Client
  140. )
  141. self.assertIsInstance(overridden.client, oauthlib.oauth1.Client)
  142. self.assertNotIsInstance(normal.client, ClientSubclass)