test_mobile_application.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. # -*- coding: utf-8 -*-
  2. import os
  3. from unittest.mock import patch
  4. from oauthlib import signals
  5. from oauthlib.oauth2 import MobileApplicationClient
  6. from tests.unittest import TestCase
  7. @patch('time.time', new=lambda: 1000)
  8. class MobileApplicationClientTest(TestCase):
  9. client_id = "someclientid"
  10. uri = "https://example.com/path?query=world"
  11. uri_id = uri + "&response_type=token&client_id=" + client_id
  12. uri_redirect = uri_id + "&redirect_uri=http%3A%2F%2Fmy.page.com%2Fcallback"
  13. redirect_uri = "http://my.page.com/callback"
  14. scope = ["/profile"]
  15. state = "xyz"
  16. uri_scope = uri_id + "&scope=%2Fprofile"
  17. uri_state = uri_id + "&state=" + state
  18. kwargs = {
  19. "some": "providers",
  20. "require": "extra arguments"
  21. }
  22. uri_kwargs = uri_id + "&some=providers&require=extra+arguments"
  23. code = "zzzzaaaa"
  24. response_uri = ('https://client.example.com/cb?#'
  25. 'access_token=2YotnFZFEjr1zCsicMWpAA&'
  26. 'token_type=example&'
  27. 'expires_in=3600&'
  28. 'scope=%2Fprofile&'
  29. 'example_parameter=example_value')
  30. token = {
  31. "access_token": "2YotnFZFEjr1zCsicMWpAA",
  32. "token_type": "example",
  33. "expires_in": 3600,
  34. "expires_at": 4600,
  35. "scope": scope,
  36. "example_parameter": "example_value"
  37. }
  38. def test_implicit_token_uri(self):
  39. client = MobileApplicationClient(self.client_id)
  40. # Basic, no extra arguments
  41. uri = client.prepare_request_uri(self.uri)
  42. self.assertURLEqual(uri, self.uri_id)
  43. # With redirection uri
  44. uri = client.prepare_request_uri(self.uri, redirect_uri=self.redirect_uri)
  45. self.assertURLEqual(uri, self.uri_redirect)
  46. # With scope
  47. uri = client.prepare_request_uri(self.uri, scope=self.scope)
  48. self.assertURLEqual(uri, self.uri_scope)
  49. # With state
  50. uri = client.prepare_request_uri(self.uri, state=self.state)
  51. self.assertURLEqual(uri, self.uri_state)
  52. # With extra parameters through kwargs
  53. uri = client.prepare_request_uri(self.uri, **self.kwargs)
  54. self.assertURLEqual(uri, self.uri_kwargs)
  55. def test_populate_attributes(self):
  56. client = MobileApplicationClient(self.client_id)
  57. response_uri = (self.response_uri + "&code=EVIL-CODE")
  58. client.parse_request_uri_response(response_uri, scope=self.scope)
  59. # We must not accidentally pick up any further security
  60. # credentials at this point.
  61. self.assertIsNone(client.code)
  62. def test_parse_token_response(self):
  63. client = MobileApplicationClient(self.client_id)
  64. # Parse code and state
  65. response = client.parse_request_uri_response(self.response_uri, scope=self.scope)
  66. self.assertEqual(response, self.token)
  67. self.assertEqual(client.access_token, response.get("access_token"))
  68. self.assertEqual(client.refresh_token, response.get("refresh_token"))
  69. self.assertEqual(client.token_type, response.get("token_type"))
  70. # Mismatching scope
  71. self.assertRaises(Warning, client.parse_request_uri_response, self.response_uri, scope="invalid")
  72. os.environ['OAUTHLIB_RELAX_TOKEN_SCOPE'] = '4'
  73. token = client.parse_request_uri_response(self.response_uri, scope='invalid')
  74. self.assertTrue(token.scope_changed)
  75. scope_changes_recorded = []
  76. def record_scope_change(sender, message, old, new):
  77. scope_changes_recorded.append((message, old, new))
  78. signals.scope_changed.connect(record_scope_change)
  79. try:
  80. client.parse_request_uri_response(self.response_uri, scope="invalid")
  81. self.assertEqual(len(scope_changes_recorded), 1)
  82. message, old, new = scope_changes_recorded[0]
  83. self.assertEqual(message, 'Scope has changed from "invalid" to "/profile".')
  84. self.assertEqual(old, ['invalid'])
  85. self.assertEqual(new, ['/profile'])
  86. finally:
  87. signals.scope_changed.disconnect(record_scope_change)
  88. del os.environ['OAUTHLIB_RELAX_TOKEN_SCOPE']