/common/djangoapps/third_party_auth/tests/test_lti.py

https://gitlab.com/unofficial-mirrors/edx-platform · Python · 135 lines · 115 code · 14 blank · 6 comment · 0 complexity · 5d7e4d549c338aa3be1d187789075781 MD5 · raw file

  1. """
  2. Unit tests for third_party_auth LTI auth providers
  3. """
  4. import unittest
  5. from oauthlib.common import Request
  6. from third_party_auth.lti import LTI_PARAMS_KEY, LTIAuthBackend
  7. from third_party_auth.tests.testutil import ThirdPartyAuthTestMixin
  8. class UnitTestLTI(unittest.TestCase, ThirdPartyAuthTestMixin):
  9. """
  10. Unit tests for third_party_auth LTI auth providers
  11. """
  12. def test_get_user_details_missing_keys(self):
  13. lti = LTIAuthBackend()
  14. details = lti.get_user_details({LTI_PARAMS_KEY: {
  15. 'lis_person_name_full': 'Full name'
  16. }})
  17. self.assertEquals(details, {
  18. 'fullname': 'Full name'
  19. })
  20. def test_get_user_details_extra_keys(self):
  21. lti = LTIAuthBackend()
  22. details = lti.get_user_details({LTI_PARAMS_KEY: {
  23. 'lis_person_name_full': 'Full name',
  24. 'lis_person_name_given': 'Given',
  25. 'lis_person_name_family': 'Family',
  26. 'email': 'user@example.com',
  27. 'other': 'something else'
  28. }})
  29. self.assertEquals(details, {
  30. 'fullname': 'Full name',
  31. 'first_name': 'Given',
  32. 'last_name': 'Family',
  33. 'email': 'user@example.com'
  34. })
  35. def test_get_user_id(self):
  36. lti = LTIAuthBackend()
  37. user_id = lti.get_user_id(None, {LTI_PARAMS_KEY: {
  38. 'oauth_consumer_key': 'consumer',
  39. 'user_id': 'user'
  40. }})
  41. self.assertEquals(user_id, 'consumer:user')
  42. def test_validate_lti_valid_request(self):
  43. request = Request(
  44. uri='https://example.com/lti',
  45. http_method='POST',
  46. body=self.read_data_file('lti_valid_request.txt')
  47. )
  48. parameters = LTIAuthBackend._get_validated_lti_params_from_values( # pylint: disable=protected-access
  49. request=request, current_time=1436823554,
  50. lti_consumer_valid=True, lti_consumer_secret='secret',
  51. lti_max_timestamp_age=10
  52. )
  53. self.assertTrue(parameters)
  54. self.assertDictContainsSubset({
  55. 'custom_extra': 'parameter',
  56. 'user_id': '292832126'
  57. }, parameters)
  58. def test_validate_lti_valid_request_with_get_params(self):
  59. request = Request(
  60. uri='https://example.com/lti?user_id=292832126&lti_version=LTI-1p0',
  61. http_method='POST',
  62. body=self.read_data_file('lti_valid_request_with_get_params.txt')
  63. )
  64. parameters = LTIAuthBackend._get_validated_lti_params_from_values( # pylint: disable=protected-access
  65. request=request, current_time=1436823554,
  66. lti_consumer_valid=True, lti_consumer_secret='secret',
  67. lti_max_timestamp_age=10
  68. )
  69. self.assertTrue(parameters)
  70. self.assertDictContainsSubset({
  71. 'custom_extra': 'parameter',
  72. 'user_id': '292832126'
  73. }, parameters)
  74. def test_validate_lti_old_timestamp(self):
  75. request = Request(
  76. uri='https://example.com/lti',
  77. http_method='POST',
  78. body=self.read_data_file('lti_old_timestamp.txt')
  79. )
  80. parameters = LTIAuthBackend._get_validated_lti_params_from_values( # pylint: disable=protected-access
  81. request=request, current_time=1436900000,
  82. lti_consumer_valid=True, lti_consumer_secret='secret',
  83. lti_max_timestamp_age=10
  84. )
  85. self.assertFalse(parameters)
  86. def test_validate_lti_invalid_signature(self):
  87. request = Request(
  88. uri='https://example.com/lti',
  89. http_method='POST',
  90. body=self.read_data_file('lti_invalid_signature.txt')
  91. )
  92. parameters = LTIAuthBackend._get_validated_lti_params_from_values( # pylint: disable=protected-access
  93. request=request, current_time=1436823554,
  94. lti_consumer_valid=True, lti_consumer_secret='secret',
  95. lti_max_timestamp_age=10
  96. )
  97. self.assertFalse(parameters)
  98. def test_validate_lti_cannot_add_get_params(self):
  99. request = Request(
  100. uri='https://example.com/lti?custom_another=parameter',
  101. http_method='POST',
  102. body=self.read_data_file('lti_cannot_add_get_params.txt')
  103. )
  104. parameters = LTIAuthBackend._get_validated_lti_params_from_values( # pylint: disable=protected-access
  105. request=request, current_time=1436823554,
  106. lti_consumer_valid=True, lti_consumer_secret='secret',
  107. lti_max_timestamp_age=10
  108. )
  109. self.assertFalse(parameters)
  110. def test_validate_lti_garbage(self):
  111. request = Request(
  112. uri='https://example.com/lti',
  113. http_method='POST',
  114. body=self.read_data_file('lti_garbage.txt')
  115. )
  116. parameters = LTIAuthBackend._get_validated_lti_params_from_values( # pylint: disable=protected-access
  117. request=request, current_time=1436823554,
  118. lti_consumer_valid=True, lti_consumer_secret='secret',
  119. lti_max_timestamp_age=10
  120. )
  121. self.assertFalse(parameters)