test_user_data_validation.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. from unittest.mock import Mock, patch
  2. import pytest
  3. from django.core.exceptions import ValidationError
  4. from ..exceptions import OAuth2UserDataValidationError
  5. from ..validation import validate_user_data
  6. def test_new_user_valid_data_is_validated(db, dynamic_settings):
  7. valid_data = validate_user_data(
  8. Mock(settings=dynamic_settings),
  9. None,
  10. {
  11. "id": "1234",
  12. "name": "Test User",
  13. "email": "user@example.com",
  14. "avatar": None,
  15. },
  16. {},
  17. )
  18. assert valid_data == {
  19. "id": "1234",
  20. "name": "Test_User",
  21. "email": "user@example.com",
  22. "avatar": None,
  23. }
  24. def test_existing_user_valid_data_is_validated(user, dynamic_settings):
  25. valid_data = validate_user_data(
  26. Mock(settings=dynamic_settings),
  27. user,
  28. {
  29. "id": "1234",
  30. "name": user.username,
  31. "email": user.email,
  32. "avatar": None,
  33. },
  34. {},
  35. )
  36. assert valid_data == {
  37. "id": "1234",
  38. "name": user.username,
  39. "email": user.email,
  40. "avatar": None,
  41. }
  42. def user_noop_filter(*args):
  43. return None
  44. def test_error_was_raised_for_user_data_with_without_name(db, dynamic_settings):
  45. with pytest.raises(OAuth2UserDataValidationError) as excinfo:
  46. # Custom filters disable build in filters
  47. with patch(
  48. "misago.oauth2.validation.oauth2_user_data_filters",
  49. [user_noop_filter],
  50. ):
  51. validate_user_data(
  52. Mock(settings=dynamic_settings),
  53. None,
  54. {
  55. "id": "1234",
  56. "name": "",
  57. "email": "user@example.com",
  58. "avatar": None,
  59. },
  60. {},
  61. )
  62. assert excinfo.value.error_list == [
  63. "Username can only contain latin alphabet letters and digits."
  64. ]
  65. def test_error_was_raised_for_user_data_with_invalid_name(db, dynamic_settings):
  66. with pytest.raises(OAuth2UserDataValidationError) as excinfo:
  67. # Custom filters disable build in filters
  68. with patch(
  69. "misago.oauth2.validation.oauth2_user_data_filters",
  70. [user_noop_filter],
  71. ):
  72. validate_user_data(
  73. Mock(settings=dynamic_settings),
  74. None,
  75. {
  76. "id": "1234",
  77. "name": "Invalid!",
  78. "email": "user@example.com",
  79. "avatar": None,
  80. },
  81. {},
  82. )
  83. assert excinfo.value.error_list == [
  84. "Username can only contain latin alphabet letters and digits."
  85. ]
  86. def test_error_was_raised_for_user_data_with_too_long_name(db, dynamic_settings):
  87. with pytest.raises(OAuth2UserDataValidationError) as excinfo:
  88. # Custom filters disable build in filters
  89. with patch(
  90. "misago.oauth2.validation.oauth2_user_data_filters",
  91. [user_noop_filter],
  92. ):
  93. validate_user_data(
  94. Mock(settings=dynamic_settings),
  95. None,
  96. {
  97. "id": "1234",
  98. "name": "UserName" * 100,
  99. "email": "user@example.com",
  100. "avatar": None,
  101. },
  102. {},
  103. )
  104. assert excinfo.value.error_list == [
  105. "Username cannot be longer than 200 characters."
  106. ]
  107. def test_error_was_raised_for_user_data_without_email(db, dynamic_settings):
  108. with pytest.raises(OAuth2UserDataValidationError) as excinfo:
  109. validate_user_data(
  110. Mock(settings=dynamic_settings),
  111. None,
  112. {
  113. "id": "1234",
  114. "name": "Test User",
  115. "email": "",
  116. "avatar": None,
  117. },
  118. {},
  119. )
  120. assert excinfo.value.error_list == ["Enter a valid email address."]
  121. def test_error_was_raised_for_user_data_with_invalid_email(db, dynamic_settings):
  122. with pytest.raises(OAuth2UserDataValidationError) as excinfo:
  123. validate_user_data(
  124. Mock(settings=dynamic_settings),
  125. None,
  126. {
  127. "id": "1234",
  128. "name": "Test User",
  129. "email": "userexample.com",
  130. "avatar": None,
  131. },
  132. {},
  133. )
  134. assert excinfo.value.error_list == ["Enter a valid email address."]
  135. def custom_oauth2_validator(request, user, user_data, raw_data):
  136. if "bad" in user_data["name"].lower():
  137. raise ValidationError("Custom validation error!")
  138. def test_custom_oauth2_validator_passes_valid_data(db, dynamic_settings):
  139. user_data = {
  140. "id": "1234",
  141. "name": "UserName",
  142. "email": "user@example.com",
  143. "avatar": None,
  144. }
  145. with patch(
  146. "misago.oauth2.validation.oauth2_validators",
  147. [custom_oauth2_validator],
  148. ):
  149. assert (
  150. validate_user_data(
  151. Mock(settings=dynamic_settings),
  152. None,
  153. user_data,
  154. {},
  155. )
  156. == user_data
  157. )
  158. def test_custom_oauth2_validator_raises_error_for_invalid_data(db, dynamic_settings):
  159. with pytest.raises(OAuth2UserDataValidationError) as excinfo:
  160. with patch(
  161. "misago.oauth2.validation.oauth2_validators",
  162. [custom_oauth2_validator],
  163. ):
  164. validate_user_data(
  165. Mock(settings=dynamic_settings),
  166. None,
  167. {
  168. "id": "1234",
  169. "name": "UserNameBad",
  170. "email": "user@example.com",
  171. "avatar": None,
  172. },
  173. {},
  174. )
  175. assert excinfo.value.error_list == ["Custom validation error!"]