-
-
Notifications
You must be signed in to change notification settings - Fork 524
/
test_stop_forum_spam_validator.py
98 lines (72 loc) · 3.21 KB
/
test_stop_forum_spam_validator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import json
from unittest.mock import Mock
import pytest
from django.forms import ValidationError
from requests.exceptions import Timeout
from ...conf.test import override_dynamic_settings
from ..validators import validate_with_sfs
cleaned_data = {"email": "test@test.com"}
@pytest.fixture
def request_mock(dynamic_settings):
return Mock(settings=dynamic_settings, user_ip="127.0.0.1")
@pytest.fixture
def api_mock(mocker):
return mocker.patch(
"misago.users.validators.requests",
get=Mock(
return_value=Mock(
content=json.dumps(
{"email": {"confidence": 55}, "ip": {"confidence": 45}}
)
)
),
)
@override_dynamic_settings(enable_stop_forum_spam=False)
def test_api_is_not_called_if_sfs_is_disabled(api_mock, request_mock):
validate_with_sfs(request_mock, cleaned_data, None)
api_mock.get.assert_not_called()
@override_dynamic_settings(enable_stop_forum_spam=True)
def test_api_is_not_called_if_email_is_not_available(api_mock, request_mock):
validate_with_sfs(request_mock, {}, None)
api_mock.get.assert_not_called()
@override_dynamic_settings(enable_stop_forum_spam=True, stop_forum_spam_confidence=90)
def test_api_is_called_if_sfs_is_enabled_and_email_is_provided(api_mock, request_mock):
validate_with_sfs(request_mock, cleaned_data, None)
api_mock.get.assert_called_once()
@override_dynamic_settings(enable_stop_forum_spam=True, stop_forum_spam_confidence=50)
def test_validator_raises_error_if_ip_score_is_greater_than_confidence(
api_mock, request_mock
):
with pytest.raises(ValidationError):
validate_with_sfs(request_mock, cleaned_data, None)
@override_dynamic_settings(enable_stop_forum_spam=True, stop_forum_spam_confidence=52)
def test_validator_raises_error_if_email_score_is_greater_than_confidence(
api_mock, request_mock
):
with pytest.raises(ValidationError):
validate_with_sfs(request_mock, cleaned_data, None)
@override_dynamic_settings(enable_stop_forum_spam=True)
def test_validator_handles_api_error(mocker, request_mock):
failing_api_mock = mocker.patch(
"misago.users.validators.requests",
get=Mock(return_value=Mock(raise_for_status=Mock(side_effect=Timeout()))),
)
validate_with_sfs(request_mock, cleaned_data, None)
failing_api_mock.get.assert_called_once()
@override_dynamic_settings(enable_stop_forum_spam=True)
def test_validator_logs_api_error(mocker, request_mock):
failing_api_mock = mocker.patch(
"misago.users.validators.requests",
get=Mock(return_value=Mock(raise_for_status=Mock(side_effect=Timeout()))),
)
logger_mock = mocker.patch("misago.users.validators.logger", exception=Mock())
validate_with_sfs(request_mock, cleaned_data, None)
failing_api_mock.get.assert_called_once()
logger_mock.exception.assert_called_once()
@override_dynamic_settings(enable_stop_forum_spam=True)
def test_validator_handles_malformed_api_response(mocker, request_mock):
failing_api_mock = mocker.patch(
"misago.users.validators.requests", get=Mock(return_value=Mock(content="{}"))
)
validate_with_sfs(request_mock, cleaned_data, None)
failing_api_mock.get.assert_called_once()