annotate 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
rev   line source
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 ])