bgneal@472
|
1 """
|
bgneal@472
|
2 Tests for the antispam application.
|
bgneal@625
|
3
|
bgneal@472
|
4 """
|
bgneal@625
|
5 import datetime
|
bgneal@625
|
6
|
bgneal@472
|
7 from django.test import TestCase
|
bgneal@625
|
8 from django.contrib.auth.models import User
|
bgneal@625
|
9 from django.contrib.contenttypes.models import ContentType
|
bgneal@472
|
10 from django.core.cache import cache
|
bgneal@472
|
11
|
bgneal@1214
|
12 from mock import call, patch, Mock
|
bgneal@1214
|
13
|
bgneal@472
|
14 from antispam import SPAM_PHRASE_KEY
|
bgneal@472
|
15 from antispam.models import SpamPhrase
|
bgneal@1214
|
16 from antispam.utils import contains_spam, deactivate_spammer, spam_check
|
bgneal@625
|
17 from comments.models import Comment
|
bgneal@625
|
18 from polls.models import Poll
|
bgneal@625
|
19 from elsewhere.models import WebsiteProfile
|
bgneal@625
|
20 from shoutbox.models import Shout
|
bgneal@1214
|
21 from bio.models import STA_ACTIVE, STA_SPAMMER, STA_STRANGER, STA_SUSPENDED
|
bgneal@472
|
22
|
bgneal@472
|
23
|
bgneal@1214
|
24 class AntispamUtilsCase(TestCase):
|
bgneal@472
|
25
|
bgneal@472
|
26 def test_no_phrases(self):
|
bgneal@472
|
27 """
|
bgneal@472
|
28 Tests that an empty spam phrase table works.
|
bgneal@625
|
29
|
bgneal@472
|
30 """
|
bgneal@472
|
31 cache.delete(SPAM_PHRASE_KEY)
|
bgneal@472
|
32 self.assertFalse(contains_spam("Here is some random text."))
|
bgneal@472
|
33
|
bgneal@472
|
34 def test_phrases(self):
|
bgneal@472
|
35 """
|
bgneal@472
|
36 Simple test of some phrases.
|
bgneal@625
|
37
|
bgneal@472
|
38 """
|
bgneal@472
|
39 SpamPhrase.objects.create(phrase="grytner")
|
bgneal@472
|
40 SpamPhrase.objects.create(phrase="allday.ru")
|
bgneal@472
|
41 SpamPhrase.objects.create(phrase="stefa.pl")
|
bgneal@472
|
42
|
bgneal@1214
|
43 self.assertTrue(contains_spam("grytner"))
|
bgneal@1214
|
44 self.assertTrue(contains_spam("11grytner"))
|
bgneal@1214
|
45 self.assertTrue(contains_spam("11grytner>"))
|
bgneal@1214
|
46 self.assertTrue(contains_spam("1djkl jsd stefa.pl"))
|
bgneal@1214
|
47 self.assertTrue(contains_spam("1djkl jsd <stefa.pl---sd8"))
|
bgneal@1214
|
48 self.assertTrue(contains_spam("1dsdjallday.rukl jsd <stefa.pl---sd8"))
|
bgneal@1214
|
49 self.assertTrue(contains_spam(" 1djallday.rukl"))
|
bgneal@472
|
50 self.assertFalse(contains_spam("this one is spam free."))
|
bgneal@472
|
51
|
bgneal@625
|
52 def test_deactivate_spammer(self):
|
bgneal@625
|
53 """
|
bgneal@625
|
54 Test the deactivate_spammer() function.
|
bgneal@625
|
55
|
bgneal@625
|
56 """
|
bgneal@625
|
57 user = User.objects.create_user('spammer_guy', '', 'password')
|
bgneal@625
|
58 user.save()
|
bgneal@625
|
59
|
bgneal@789
|
60 profile = user.profile
|
bgneal@625
|
61 profile.location = 'Spamville'
|
bgneal@625
|
62 profile.country = 'US'
|
bgneal@625
|
63 profile.birthday = datetime.date.today()
|
bgneal@625
|
64 profile.occupation = 'Spammer'
|
bgneal@625
|
65 profile.interests = 'Spamming websites'
|
bgneal@625
|
66 profile.profile_text = 'I spam a lot.'
|
bgneal@625
|
67 profile.signature = 'I spammed you!'
|
bgneal@625
|
68 profile.save()
|
bgneal@625
|
69
|
bgneal@625
|
70 now=datetime.datetime.now()
|
bgneal@625
|
71
|
bgneal@625
|
72 # create a poll item to comment on
|
bgneal@625
|
73 poll = Poll(start_date=now,
|
bgneal@625
|
74 end_date=now,
|
bgneal@625
|
75 is_enabled=True,
|
bgneal@625
|
76 question='?')
|
bgneal@625
|
77 poll.save()
|
bgneal@625
|
78
|
bgneal@625
|
79 comment = Comment(
|
bgneal@625
|
80 content_type=ContentType.objects.get_for_model(poll),
|
bgneal@625
|
81 object_id=poll.pk,
|
bgneal@625
|
82 user=user,
|
bgneal@625
|
83 comment='Spam Spam Spam',
|
bgneal@625
|
84 ip_address='127.0.0.1',
|
bgneal@625
|
85 is_public=True,
|
bgneal@625
|
86 is_removed=False)
|
bgneal@625
|
87 comment.save()
|
bgneal@625
|
88
|
bgneal@625
|
89 website = WebsiteProfile(user=user, name='spam', url='spam')
|
bgneal@625
|
90 website.save()
|
bgneal@625
|
91
|
bgneal@625
|
92 shout = Shout(user=user, shout_date=now, shout='spam')
|
bgneal@625
|
93 shout.save()
|
bgneal@625
|
94
|
bgneal@625
|
95 deactivate_spammer(user)
|
bgneal@625
|
96
|
bgneal@789
|
97 profile = user.profile
|
bgneal@625
|
98 self.assertFalse(profile.location)
|
bgneal@625
|
99 self.assertFalse(profile.country)
|
bgneal@625
|
100 self.assertIsNone(profile.birthday)
|
bgneal@625
|
101 self.assertFalse(profile.occupation)
|
bgneal@625
|
102 self.assertFalse(profile.interests)
|
bgneal@625
|
103 self.assertFalse(profile.profile_text)
|
bgneal@625
|
104 self.assertFalse(profile.profile_html)
|
bgneal@625
|
105 self.assertFalse(profile.signature)
|
bgneal@625
|
106 self.assertFalse(profile.signature_html)
|
bgneal@625
|
107 self.assertEqual(profile.status, STA_SPAMMER)
|
bgneal@625
|
108
|
bgneal@625
|
109 status_date = datetime.date(year=profile.status_date.year,
|
bgneal@625
|
110 month=profile.status_date.month,
|
bgneal@625
|
111 day=profile.status_date.day)
|
bgneal@625
|
112 self.assertEqual(status_date, datetime.date.today())
|
bgneal@625
|
113
|
bgneal@625
|
114 self.assertEqual(Comment.objects.filter(user=user).count(), 0)
|
bgneal@625
|
115 self.assertEqual(WebsiteProfile.objects.filter(user=user).count(), 0)
|
bgneal@625
|
116 self.assertEqual(Shout.objects.filter(user=user).count(), 0)
|
bgneal@1214
|
117
|
bgneal@1214
|
118
|
bgneal@1214
|
119 class AntispamSpamCheckTestCase(TestCase):
|
bgneal@1214
|
120 def setUp(self):
|
bgneal@1214
|
121 user = User.objects.create_user('spammer_guy', '', 'password')
|
bgneal@1214
|
122 user.save()
|
bgneal@1214
|
123 SpamPhrase.objects.create(phrase="grytner")
|
bgneal@1214
|
124
|
bgneal@1214
|
125 @patch('antispam.utils.email_admins')
|
bgneal@1214
|
126 def test_not_a_stranger(self, email_admins_mock):
|
bgneal@1214
|
127 user = User.objects.get(username='spammer_guy')
|
bgneal@1214
|
128 user.profile.status = STA_ACTIVE
|
bgneal@1214
|
129 user.profile.save(content_update=False)
|
bgneal@1214
|
130
|
bgneal@1214
|
131 request = Mock()
|
bgneal@1214
|
132 request.user = user
|
bgneal@1214
|
133 result = spam_check(request, 'grytner')
|
bgneal@1214
|
134
|
bgneal@1214
|
135 self.assertFalse(result)
|
bgneal@1214
|
136 user = User.objects.get(username='spammer_guy')
|
bgneal@1214
|
137 self.assertTrue(user.is_active)
|
bgneal@1214
|
138 self.assertEqual(user.profile.status, STA_ACTIVE)
|
bgneal@1214
|
139 self.assertEqual(email_admins_mock.mock_calls, [])
|
bgneal@1214
|
140
|
bgneal@1214
|
141 @patch('antispam.utils.email_admins')
|
bgneal@1214
|
142 def test_stranger_no_spam(self, email_admins_mock):
|
bgneal@1214
|
143 user = User.objects.get(username='spammer_guy')
|
bgneal@1214
|
144 user.profile.status = STA_ACTIVE
|
bgneal@1214
|
145 user.profile.save(content_update=False)
|
bgneal@1214
|
146
|
bgneal@1214
|
147 request = Mock()
|
bgneal@1214
|
148 request.user = user
|
bgneal@1214
|
149 result = spam_check(request, 'not spam')
|
bgneal@1214
|
150
|
bgneal@1214
|
151 self.assertFalse(result)
|
bgneal@1214
|
152 user = User.objects.get(username='spammer_guy')
|
bgneal@1214
|
153 self.assertTrue(user.is_active)
|
bgneal@1214
|
154 self.assertEqual(user.profile.status, STA_ACTIVE)
|
bgneal@1214
|
155 self.assertEqual(email_admins_mock.mock_calls, [])
|
bgneal@1214
|
156
|
bgneal@1214
|
157 @patch('antispam.utils.email_admins')
|
bgneal@1214
|
158 def test_stranger_with_spam(self, email_admins_mock):
|
bgneal@1214
|
159 user = User.objects.get(username='spammer_guy')
|
bgneal@1214
|
160 user.profile.status = STA_STRANGER
|
bgneal@1214
|
161 user.profile.save(content_update=False)
|
bgneal@1214
|
162
|
bgneal@1214
|
163 request = Mock()
|
bgneal@1214
|
164 request.user = user
|
bgneal@1214
|
165 request.path = '/some/path'
|
bgneal@1214
|
166 request.META = {'REMOTE_ADDR': '127.0.0.1'}
|
bgneal@1214
|
167 result = spam_check(request, 'grytner')
|
bgneal@1214
|
168
|
bgneal@1214
|
169 self.assertTrue(result)
|
bgneal@1214
|
170 user = User.objects.get(username='spammer_guy')
|
bgneal@1214
|
171 self.assertFalse(user.is_active)
|
bgneal@1214
|
172 self.assertEqual(user.profile.status, STA_SUSPENDED)
|
bgneal@1214
|
173
|
bgneal@1214
|
174 expected_msg = ('SPAM FILTER TRIPPED by spammer_guy\n'
|
bgneal@1214
|
175 'PATH: /some/path\n'
|
bgneal@1214
|
176 'IP: 127.0.0.1\n'
|
bgneal@1214
|
177 'Message:\n'
|
bgneal@1214
|
178 'grytner\n')
|
bgneal@1214
|
179 self.assertEqual(email_admins_mock.mock_calls, [
|
bgneal@1214
|
180 call('SPAM FILTER TRIPPED BY spammer_guy', expected_msg),
|
bgneal@1214
|
181 ])
|