test_core.py 6.0 KB

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