test_bans.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. from datetime import timedelta
  2. from django.contrib.auth import get_user_model
  3. from django.test import TestCase
  4. from django.utils import timezone
  5. from ..bans import (
  6. ban_ip, ban_user, get_email_ban, get_ip_ban,
  7. get_request_ip_ban, get_user_ban, get_username_ban)
  8. from ..models import Ban
  9. class GetBanTests(TestCase):
  10. def test_get_username_ban(self):
  11. """get_username_ban returns valid ban"""
  12. nonexistent_ban = get_username_ban('nonexistent')
  13. self.assertIsNone(nonexistent_ban)
  14. Ban.objects.create(
  15. banned_value='expired',
  16. expires_on=timezone.now() - timedelta(days=7)
  17. )
  18. expired_ban = get_username_ban('expired')
  19. self.assertIsNone(expired_ban)
  20. Ban.objects.create(
  21. banned_value='wrongtype',
  22. check_type=Ban.BAN_EMAIL
  23. )
  24. wrong_type_ban = get_username_ban('wrongtype')
  25. self.assertIsNone(wrong_type_ban)
  26. valid_ban = Ban.objects.create(
  27. banned_value='admi*',
  28. expires_on=timezone.now() + timedelta(days=7)
  29. )
  30. self.assertEqual(get_username_ban('admiral').pk, valid_ban.pk)
  31. def test_get_email_ban(self):
  32. """get_email_ban returns valid ban"""
  33. nonexistent_ban = get_email_ban('non@existent.com')
  34. self.assertIsNone(nonexistent_ban)
  35. Ban.objects.create(
  36. banned_value='ex@pired.com',
  37. check_type=Ban.BAN_EMAIL,
  38. expires_on=timezone.now() - timedelta(days=7)
  39. )
  40. expired_ban = get_email_ban('ex@pired.com')
  41. self.assertIsNone(expired_ban)
  42. Ban.objects.create(
  43. banned_value='wrong@type.com',
  44. check_type=Ban.BAN_IP
  45. )
  46. wrong_type_ban = get_email_ban('wrong@type.com')
  47. self.assertIsNone(wrong_type_ban)
  48. valid_ban = Ban.objects.create(
  49. banned_value='*.ru',
  50. check_type=Ban.BAN_EMAIL,
  51. expires_on=timezone.now() + timedelta(days=7)
  52. )
  53. self.assertEqual(get_email_ban('banned@mail.ru').pk, valid_ban.pk)
  54. def test_get_ip_ban(self):
  55. """get_ip_ban returns valid ban"""
  56. nonexistent_ban = get_ip_ban('123.0.0.1')
  57. self.assertIsNone(nonexistent_ban)
  58. Ban.objects.create(
  59. banned_value='124.0.0.1',
  60. check_type=Ban.BAN_IP,
  61. expires_on=timezone.now() - timedelta(days=7)
  62. )
  63. expired_ban = get_ip_ban('124.0.0.1')
  64. self.assertIsNone(expired_ban)
  65. Ban.objects.create(
  66. banned_value='wrongtype',
  67. check_type=Ban.BAN_EMAIL
  68. )
  69. wrong_type_ban = get_ip_ban('wrongtype')
  70. self.assertIsNone(wrong_type_ban)
  71. valid_ban = Ban.objects.create(
  72. banned_value='125.0.0.*',
  73. check_type=Ban.BAN_IP,
  74. expires_on=timezone.now() + timedelta(days=7)
  75. )
  76. self.assertEqual(get_ip_ban('125.0.0.1').pk, valid_ban.pk)
  77. class UserBansTests(TestCase):
  78. def setUp(self):
  79. User = get_user_model()
  80. self.user = User.objects.create_user('Bob',
  81. 'bob@boberson.com',
  82. 'pass123')
  83. def test_no_ban(self):
  84. """user is not caught by ban"""
  85. self.assertIsNone(get_user_ban(self.user))
  86. self.assertFalse(self.user.ban_cache.is_banned)
  87. def test_permanent_ban(self):
  88. """user is caught by permanent ban"""
  89. Ban.objects.create(
  90. banned_value='bob',
  91. user_message='User reason',
  92. staff_message='Staff reason'
  93. )
  94. user_ban = get_user_ban(self.user)
  95. self.assertIsNotNone(user_ban)
  96. self.assertEqual(user_ban.user_message, 'User reason')
  97. self.assertEqual(user_ban.staff_message, 'Staff reason')
  98. self.assertTrue(self.user.ban_cache.is_banned)
  99. def test_temporary_ban(self):
  100. """user is caught by temporary ban"""
  101. Ban.objects.create(
  102. banned_value='bo*',
  103. user_message='User reason',
  104. staff_message='Staff reason',
  105. expires_on=timezone.now() + timedelta(days=7)
  106. )
  107. user_ban = get_user_ban(self.user)
  108. self.assertIsNotNone(user_ban)
  109. self.assertEqual(user_ban.user_message, 'User reason')
  110. self.assertEqual(user_ban.staff_message, 'Staff reason')
  111. self.assertTrue(self.user.ban_cache.is_banned)
  112. def test_expired_ban(self):
  113. """user is not caught by expired ban"""
  114. Ban.objects.create(
  115. banned_value='bo*',
  116. expires_on=timezone.now() - timedelta(days=7)
  117. )
  118. self.assertIsNone(get_user_ban(self.user))
  119. self.assertFalse(self.user.ban_cache.is_banned)
  120. def test_expired_non_flagged_ban(self):
  121. """user is not caught by expired but checked ban"""
  122. Ban.objects.create(
  123. banned_value='bo*',
  124. expires_on=timezone.now() - timedelta(days=7)
  125. )
  126. Ban.objects.update(is_checked=True)
  127. self.assertIsNone(get_user_ban(self.user))
  128. self.assertFalse(self.user.ban_cache.is_banned)
  129. class FakeRequest(object):
  130. def __init__(self):
  131. self.user_ip = '127.0.0.1'
  132. self.session = {}
  133. class RequestIPBansTests(TestCase):
  134. def test_no_ban(self):
  135. """no ban found"""
  136. ip_ban = get_request_ip_ban(FakeRequest())
  137. self.assertIsNone(ip_ban)
  138. def test_permanent_ban(self):
  139. """ip is caught by permanent ban"""
  140. Ban.objects.create(
  141. check_type=Ban.BAN_IP,
  142. banned_value='127.0.0.1',
  143. user_message='User reason'
  144. )
  145. ip_ban = get_request_ip_ban(FakeRequest())
  146. self.assertTrue(ip_ban['is_banned'])
  147. self.assertEqual(ip_ban['ip'], '127.0.0.1')
  148. self.assertEqual(ip_ban['message'], 'User reason')
  149. # repeated call uses cache
  150. get_request_ip_ban(FakeRequest())
  151. def test_temporary_ban(self):
  152. """ip is caught by temporary ban"""
  153. Ban.objects.create(
  154. check_type=Ban.BAN_IP,
  155. banned_value='127.0.0.1',
  156. user_message='User reason',
  157. expires_on=timezone.now() + timedelta(days=7)
  158. )
  159. ip_ban = get_request_ip_ban(FakeRequest())
  160. self.assertTrue(ip_ban['is_banned'])
  161. self.assertEqual(ip_ban['ip'], '127.0.0.1')
  162. self.assertEqual(ip_ban['message'], 'User reason')
  163. # repeated call uses cache
  164. get_request_ip_ban(FakeRequest())
  165. def test_expired_ban(self):
  166. """ip is not caught by expired ban"""
  167. Ban.objects.create(
  168. check_type=Ban.BAN_IP,
  169. banned_value='127.0.0.1',
  170. user_message='User reason',
  171. expires_on=timezone.now() - timedelta(days=7)
  172. )
  173. ip_ban = get_request_ip_ban(FakeRequest())
  174. self.assertIsNone(ip_ban)
  175. # repeated call uses cache
  176. get_request_ip_ban(FakeRequest())
  177. class BanUserTests(TestCase):
  178. def test_ban_user(self):
  179. """ban_user utility bans user"""
  180. User = get_user_model()
  181. user = User.objects.create_user('Bob', 'bob@boberson.com', 'pass123')
  182. ban = ban_user(user, 'User reason', 'Staff reason')
  183. self.assertEqual(ban.user_message, 'User reason')
  184. self.assertEqual(ban.staff_message, 'Staff reason')
  185. db_ban = get_user_ban(user)
  186. self.assertEqual(ban.pk, db_ban.ban_id)
  187. class BanIpTests(TestCase):
  188. def test_ban_ip(self):
  189. """ban_ip utility bans IP address"""
  190. ban = ban_ip('127.0.0.1', 'User reason', 'Staff reason')
  191. self.assertEqual(ban.user_message, 'User reason')
  192. self.assertEqual(ban.staff_message, 'Staff reason')
  193. db_ban = get_ip_ban('127.0.0.1')
  194. self.assertEqual(ban.pk, db_ban.pk)