comparison antispam/tests/test_utils.py @ 1214:9a011e2de2f6 modernize tip

Add more coverage to antispam utils unit tests.
author Brian Neal <bgneal@gmail.com>
date Mon, 10 Feb 2025 19:34:14 -0600
parents 9e803323a0d0
children
comparison
equal deleted inserted replaced
1213:5e898f91fe36 1214:9a011e2de2f6
7 from django.test import TestCase 7 from django.test import TestCase
8 from django.contrib.auth.models import User 8 from django.contrib.auth.models import User
9 from django.contrib.contenttypes.models import ContentType 9 from django.contrib.contenttypes.models import ContentType
10 from django.core.cache import cache 10 from django.core.cache import cache
11 11
12 from mock import call, patch, Mock
13
12 from antispam import SPAM_PHRASE_KEY 14 from antispam import SPAM_PHRASE_KEY
13 from antispam.models import SpamPhrase 15 from antispam.models import SpamPhrase
14 from antispam.utils import contains_spam, deactivate_spammer 16 from antispam.utils import contains_spam, deactivate_spammer, spam_check
15
16 from comments.models import Comment 17 from comments.models import Comment
17 from polls.models import Poll 18 from polls.models import Poll
18 from elsewhere.models import WebsiteProfile 19 from elsewhere.models import WebsiteProfile
19 from shoutbox.models import Shout 20 from shoutbox.models import Shout
20 from bio.models import STA_SPAMMER 21 from bio.models import STA_ACTIVE, STA_SPAMMER, STA_STRANGER, STA_SUSPENDED
21 22
22 23
23 class AntispamCase(TestCase): 24 class AntispamUtilsCase(TestCase):
24 25
25 def test_no_phrases(self): 26 def test_no_phrases(self):
26 """ 27 """
27 Tests that an empty spam phrase table works. 28 Tests that an empty spam phrase table works.
28 29
37 """ 38 """
38 SpamPhrase.objects.create(phrase="grytner") 39 SpamPhrase.objects.create(phrase="grytner")
39 SpamPhrase.objects.create(phrase="allday.ru") 40 SpamPhrase.objects.create(phrase="allday.ru")
40 SpamPhrase.objects.create(phrase="stefa.pl") 41 SpamPhrase.objects.create(phrase="stefa.pl")
41 42
42 self.assert_(contains_spam("grytner")) 43 self.assertTrue(contains_spam("grytner"))
43 self.assert_(contains_spam("11grytner")) 44 self.assertTrue(contains_spam("11grytner"))
44 self.assert_(contains_spam("11grytner>")) 45 self.assertTrue(contains_spam("11grytner>"))
45 self.assert_(contains_spam("1djkl jsd stefa.pl")) 46 self.assertTrue(contains_spam("1djkl jsd stefa.pl"))
46 self.assert_(contains_spam("1djkl jsd <stefa.pl---sd8")) 47 self.assertTrue(contains_spam("1djkl jsd <stefa.pl---sd8"))
47 self.assert_(contains_spam("1dsdjallday.rukl jsd <stefa.pl---sd8")) 48 self.assertTrue(contains_spam("1dsdjallday.rukl jsd <stefa.pl---sd8"))
48 self.assert_(contains_spam(" 1djallday.rukl")) 49 self.assertTrue(contains_spam(" 1djallday.rukl"))
49 self.assertFalse(contains_spam("this one is spam free.")) 50 self.assertFalse(contains_spam("this one is spam free."))
50 51
51 def test_deactivate_spammer(self): 52 def test_deactivate_spammer(self):
52 """ 53 """
53 Test the deactivate_spammer() function. 54 Test the deactivate_spammer() function.
111 self.assertEqual(status_date, datetime.date.today()) 112 self.assertEqual(status_date, datetime.date.today())
112 113
113 self.assertEqual(Comment.objects.filter(user=user).count(), 0) 114 self.assertEqual(Comment.objects.filter(user=user).count(), 0)
114 self.assertEqual(WebsiteProfile.objects.filter(user=user).count(), 0) 115 self.assertEqual(WebsiteProfile.objects.filter(user=user).count(), 0)
115 self.assertEqual(Shout.objects.filter(user=user).count(), 0) 116 self.assertEqual(Shout.objects.filter(user=user).count(), 0)
117
118
119 class AntispamSpamCheckTestCase(TestCase):
120 def setUp(self):
121 user = User.objects.create_user('spammer_guy', '', 'password')
122 user.save()
123 SpamPhrase.objects.create(phrase="grytner")
124
125 @patch('antispam.utils.email_admins')
126 def test_not_a_stranger(self, email_admins_mock):
127 user = User.objects.get(username='spammer_guy')
128 user.profile.status = STA_ACTIVE
129 user.profile.save(content_update=False)
130
131 request = Mock()
132 request.user = user
133 result = spam_check(request, 'grytner')
134
135 self.assertFalse(result)
136 user = User.objects.get(username='spammer_guy')
137 self.assertTrue(user.is_active)
138 self.assertEqual(user.profile.status, STA_ACTIVE)
139 self.assertEqual(email_admins_mock.mock_calls, [])
140
141 @patch('antispam.utils.email_admins')
142 def test_stranger_no_spam(self, email_admins_mock):
143 user = User.objects.get(username='spammer_guy')
144 user.profile.status = STA_ACTIVE
145 user.profile.save(content_update=False)
146
147 request = Mock()
148 request.user = user
149 result = spam_check(request, 'not spam')
150
151 self.assertFalse(result)
152 user = User.objects.get(username='spammer_guy')
153 self.assertTrue(user.is_active)
154 self.assertEqual(user.profile.status, STA_ACTIVE)
155 self.assertEqual(email_admins_mock.mock_calls, [])
156
157 @patch('antispam.utils.email_admins')
158 def test_stranger_with_spam(self, email_admins_mock):
159 user = User.objects.get(username='spammer_guy')
160 user.profile.status = STA_STRANGER
161 user.profile.save(content_update=False)
162
163 request = Mock()
164 request.user = user
165 request.path = '/some/path'
166 request.META = {'REMOTE_ADDR': '127.0.0.1'}
167 result = spam_check(request, 'grytner')
168
169 self.assertTrue(result)
170 user = User.objects.get(username='spammer_guy')
171 self.assertFalse(user.is_active)
172 self.assertEqual(user.profile.status, STA_SUSPENDED)
173
174 expected_msg = ('SPAM FILTER TRIPPED by spammer_guy\n'
175 'PATH: /some/path\n'
176 'IP: 127.0.0.1\n'
177 'Message:\n'
178 'grytner\n')
179 self.assertEqual(email_admins_mock.mock_calls, [
180 call('SPAM FILTER TRIPPED BY spammer_guy', expected_msg),
181 ])