test_stop_forum_spam_validator.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import json
  2. from unittest.mock import Mock
  3. import pytest
  4. from django.forms import ValidationError
  5. from requests.exceptions import Timeout
  6. from ...conf.test import override_dynamic_settings
  7. from ..validators import validate_with_sfs
  8. cleaned_data = {"email": "test@test.com"}
  9. @pytest.fixture
  10. def request_mock(dynamic_settings):
  11. return Mock(settings=dynamic_settings, user_ip="127.0.0.1")
  12. @pytest.fixture
  13. def api_mock(mocker):
  14. return mocker.patch(
  15. "misago.users.validators.requests",
  16. get=Mock(
  17. return_value=Mock(
  18. content=json.dumps(
  19. {"email": {"confidence": 55}, "ip": {"confidence": 45}}
  20. )
  21. )
  22. ),
  23. )
  24. @override_dynamic_settings(enable_stop_forum_spam=False)
  25. def test_api_is_not_called_if_sfs_is_disabled(api_mock, request_mock):
  26. validate_with_sfs(request_mock, cleaned_data, None)
  27. api_mock.get.assert_not_called()
  28. @override_dynamic_settings(enable_stop_forum_spam=True)
  29. def test_api_is_not_called_if_email_is_not_available(api_mock, request_mock):
  30. validate_with_sfs(request_mock, {}, None)
  31. api_mock.get.assert_not_called()
  32. @override_dynamic_settings(enable_stop_forum_spam=True, stop_forum_spam_confidence=90)
  33. def test_api_is_called_if_sfs_is_enabled_and_email_is_provided(api_mock, request_mock):
  34. validate_with_sfs(request_mock, cleaned_data, None)
  35. api_mock.get.assert_called_once()
  36. @override_dynamic_settings(enable_stop_forum_spam=True, stop_forum_spam_confidence=50)
  37. def test_validator_raises_error_if_ip_score_is_greater_than_confidence(
  38. api_mock, request_mock
  39. ):
  40. with pytest.raises(ValidationError):
  41. validate_with_sfs(request_mock, cleaned_data, None)
  42. @override_dynamic_settings(enable_stop_forum_spam=True, stop_forum_spam_confidence=52)
  43. def test_validator_raises_error_if_email_score_is_greater_than_confidence(
  44. api_mock, request_mock
  45. ):
  46. with pytest.raises(ValidationError):
  47. validate_with_sfs(request_mock, cleaned_data, None)
  48. @override_dynamic_settings(enable_stop_forum_spam=True)
  49. def test_validator_handles_api_error(mocker, request_mock):
  50. failing_api_mock = mocker.patch(
  51. "misago.users.validators.requests",
  52. get=Mock(return_value=Mock(raise_for_status=Mock(side_effect=Timeout()))),
  53. )
  54. validate_with_sfs(request_mock, cleaned_data, None)
  55. failing_api_mock.get.assert_called_once()
  56. @override_dynamic_settings(enable_stop_forum_spam=True)
  57. def test_validator_logs_api_error(mocker, request_mock):
  58. failing_api_mock = mocker.patch(
  59. "misago.users.validators.requests",
  60. get=Mock(return_value=Mock(raise_for_status=Mock(side_effect=Timeout()))),
  61. )
  62. logger_mock = mocker.patch("misago.users.validators.logger", exception=Mock())
  63. validate_with_sfs(request_mock, cleaned_data, None)
  64. failing_api_mock.get.assert_called_once()
  65. logger_mock.exception.assert_called_once()
  66. @override_dynamic_settings(enable_stop_forum_spam=True)
  67. def test_validator_handles_malformed_api_response(mocker, request_mock):
  68. failing_api_mock = mocker.patch(
  69. "misago.users.validators.requests", get=Mock(return_value=Mock(content="{}"))
  70. )
  71. validate_with_sfs(request_mock, cleaned_data, None)
  72. failing_api_mock.get.assert_called_once()