test_legacy_application.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import urllib.parse as urlparse
  4. from unittest.mock import patch
  5. from oauthlib import signals
  6. from oauthlib.oauth2 import LegacyApplicationClient
  7. from tests.unittest import TestCase
  8. @patch('time.time', new=lambda: 1000)
  9. class LegacyApplicationClientTest(TestCase):
  10. client_id = "someclientid"
  11. client_secret = 'someclientsecret'
  12. scope = ["/profile"]
  13. kwargs = {
  14. "some": "providers",
  15. "require": "extra arguments"
  16. }
  17. username = "user_username"
  18. password = "user_password"
  19. body = "not=empty"
  20. body_up = "not=empty&grant_type=password&username={}&password={}".format(username, password)
  21. body_kwargs = body_up + "&some=providers&require=extra+arguments"
  22. token_json = ('{ "access_token":"2YotnFZFEjr1zCsicMWpAA",'
  23. ' "token_type":"example",'
  24. ' "expires_in":3600,'
  25. ' "scope":"/profile",'
  26. ' "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",'
  27. ' "example_parameter":"example_value"}')
  28. token = {
  29. "access_token": "2YotnFZFEjr1zCsicMWpAA",
  30. "token_type": "example",
  31. "expires_in": 3600,
  32. "expires_at": 4600,
  33. "scope": scope,
  34. "refresh_token": "tGzv3JOkF0XG5Qx2TlKWIA",
  35. "example_parameter": "example_value"
  36. }
  37. def test_request_body(self):
  38. client = LegacyApplicationClient(self.client_id)
  39. # Basic, no extra arguments
  40. body = client.prepare_request_body(self.username, self.password,
  41. body=self.body)
  42. self.assertFormBodyEqual(body, self.body_up)
  43. # With extra parameters
  44. body = client.prepare_request_body(self.username, self.password,
  45. body=self.body, **self.kwargs)
  46. self.assertFormBodyEqual(body, self.body_kwargs)
  47. def test_parse_token_response(self):
  48. client = LegacyApplicationClient(self.client_id)
  49. # Parse code and state
  50. response = client.parse_request_body_response(self.token_json, scope=self.scope)
  51. self.assertEqual(response, self.token)
  52. self.assertEqual(client.access_token, response.get("access_token"))
  53. self.assertEqual(client.refresh_token, response.get("refresh_token"))
  54. self.assertEqual(client.token_type, response.get("token_type"))
  55. # Mismatching state
  56. self.assertRaises(Warning, client.parse_request_body_response, self.token_json, scope="invalid")
  57. os.environ['OAUTHLIB_RELAX_TOKEN_SCOPE'] = '5'
  58. token = client.parse_request_body_response(self.token_json, scope="invalid")
  59. self.assertTrue(token.scope_changed)
  60. scope_changes_recorded = []
  61. def record_scope_change(sender, message, old, new):
  62. scope_changes_recorded.append((message, old, new))
  63. signals.scope_changed.connect(record_scope_change)
  64. try:
  65. client.parse_request_body_response(self.token_json, scope="invalid")
  66. self.assertEqual(len(scope_changes_recorded), 1)
  67. message, old, new = scope_changes_recorded[0]
  68. self.assertEqual(message, 'Scope has changed from "invalid" to "/profile".')
  69. self.assertEqual(old, ['invalid'])
  70. self.assertEqual(new, ['/profile'])
  71. finally:
  72. signals.scope_changed.disconnect(record_scope_change)
  73. del os.environ['OAUTHLIB_RELAX_TOKEN_SCOPE']
  74. def test_prepare_request_body(self):
  75. """
  76. see issue #585
  77. https://github.com/oauthlib/oauthlib/issues/585
  78. """
  79. client = LegacyApplicationClient(self.client_id)
  80. # scenario 1, default behavior to not include `client_id`
  81. r1 = client.prepare_request_body(username=self.username, password=self.password)
  82. self.assertIn(r1, ('grant_type=password&username={}&password={}'.format(self.username, self.password),
  83. 'grant_type=password&password={}&username={}'.format(self.password, self.username),
  84. ))
  85. # scenario 2, include `client_id` in the body
  86. r2 = client.prepare_request_body(username=self.username, password=self.password, include_client_id=True)
  87. r2_params = dict(urlparse.parse_qsl(r2, keep_blank_values=True))
  88. self.assertEqual(len(r2_params.keys()), 4)
  89. self.assertEqual(r2_params['grant_type'], 'password')
  90. self.assertEqual(r2_params['username'], self.username)
  91. self.assertEqual(r2_params['password'], self.password)
  92. self.assertEqual(r2_params['client_id'], self.client_id)
  93. # scenario 3, include `client_id` + `client_secret` in the body
  94. r3 = client.prepare_request_body(username=self.username, password=self.password, include_client_id=True, client_secret=self.client_secret)
  95. r3_params = dict(urlparse.parse_qsl(r3, keep_blank_values=True))
  96. self.assertEqual(len(r3_params.keys()), 5)
  97. self.assertEqual(r3_params['grant_type'], 'password')
  98. self.assertEqual(r3_params['username'], self.username)
  99. self.assertEqual(r3_params['password'], self.password)
  100. self.assertEqual(r3_params['client_id'], self.client_id)
  101. self.assertEqual(r3_params['client_secret'], self.client_secret)
  102. # scenario 4, `client_secret` is an empty string
  103. r4 = client.prepare_request_body(username=self.username, password=self.password, include_client_id=True, client_secret='')
  104. r4_params = dict(urlparse.parse_qsl(r4, keep_blank_values=True))
  105. self.assertEqual(len(r4_params.keys()), 5)
  106. self.assertEqual(r4_params['grant_type'], 'password')
  107. self.assertEqual(r4_params['username'], self.username)
  108. self.assertEqual(r4_params['password'], self.password)
  109. self.assertEqual(r4_params['client_id'], self.client_id)
  110. self.assertEqual(r4_params['client_secret'], '')
  111. # scenario 4b`,` client_secret is `None`
  112. r4b = client.prepare_request_body(username=self.username, password=self.password, include_client_id=True, client_secret=None)
  113. r4b_params = dict(urlparse.parse_qsl(r4b, keep_blank_values=True))
  114. self.assertEqual(len(r4b_params.keys()), 4)
  115. self.assertEqual(r4b_params['grant_type'], 'password')
  116. self.assertEqual(r4b_params['username'], self.username)
  117. self.assertEqual(r4b_params['password'], self.password)
  118. self.assertEqual(r4b_params['client_id'], self.client_id)