test_registration.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. from datetime import timedelta
  2. from django.conf import settings
  3. from django.core import mail
  4. from django.test import RequestFactory
  5. from django.utils import timezone
  6. from rest_framework.reverse import reverse
  7. from rest_framework.versioning import NamespaceVersioning
  8. from desecapi import models
  9. from desecapi.emails import send_account_lock_email
  10. from desecapi.tests.base import DesecTestCase
  11. class RegistrationTestCase(DesecTestCase):
  12. def assertRegistration(self, remote_addr='', status=201, **kwargs):
  13. url = reverse('v1:register')
  14. post_kwargs = {}
  15. if remote_addr:
  16. post_kwargs['REMOTE_ADDR'] = remote_addr
  17. response = self.client.post(url, kwargs, **post_kwargs)
  18. self.assertStatus(response, status)
  19. return response
  20. class SingleRegistrationTestCase(RegistrationTestCase):
  21. def setUp(self):
  22. super().setUp()
  23. email = self.random_username()
  24. self.assertRegistration(
  25. email=email,
  26. password=self.random_password(),
  27. remote_addr="1.3.3.7",
  28. )
  29. self.user = models.User.objects.get(email=email)
  30. def test_registration_successful(self):
  31. self.assertEqual(self.user.registration_remote_ip, "1.3.3.7")
  32. def test_token_email(self):
  33. self.assertEqual(len(mail.outbox), 1 if not self.user.locked else 2)
  34. self.assertTrue(self.user.get_or_create_first_token() in mail.outbox[-1].body)
  35. def test_send_captcha_email_manually(self):
  36. # TODO see if this can be replaced by a method of self.client
  37. r = RequestFactory().request(HTTP_HOST=settings.ALLOWED_HOSTS[0])
  38. r.version = 'v1'
  39. r.versioning_scheme = NamespaceVersioning()
  40. # end TODO
  41. mail.outbox = []
  42. send_account_lock_email(r, self.user)
  43. self.assertEqual(len(mail.outbox), 1)
  44. class MultipleRegistrationTestCase(RegistrationTestCase):
  45. def _registrations(self):
  46. return []
  47. def setUp(self):
  48. super().setUp()
  49. self.users = []
  50. for (ip, hours_ago, email_host) in self._registrations():
  51. email = self.random_username(email_host)
  52. ip = ip or self.random_ip()
  53. self.assertRegistration(
  54. email=email,
  55. password=self.random_password(),
  56. dyn=True,
  57. remote_addr=ip,
  58. )
  59. user = models.User.objects.get(email=email)
  60. self.assertEqual(user.registration_remote_ip, ip)
  61. user.created = timezone.now() - timedelta(hours=hours_ago)
  62. user.save()
  63. self.users.append(user)
  64. class MultipleRegistrationSameIPShortTime(MultipleRegistrationTestCase):
  65. NUM_REGISTRATIONS = 3
  66. def _registrations(self):
  67. return [('1.3.3.7', 0, None) for _ in range(self.NUM_REGISTRATIONS)]
  68. def test_is_locked(self):
  69. self.assertIsNone(self.users[0].locked)
  70. for i in range(1, self.NUM_REGISTRATIONS):
  71. self.assertIsNotNone(self.users[i].locked)
  72. class MultipleRegistrationDifferentIPShortTime(MultipleRegistrationTestCase):
  73. NUM_REGISTRATIONS = 10
  74. def _registrations(self):
  75. return [('1.3.3.%s' % i, 0, None) for i in range(self.NUM_REGISTRATIONS)]
  76. def test_is_not_locked(self):
  77. for user in self.users:
  78. self.assertIsNone(user.locked)
  79. class MultipleRegistrationSameIPLongTime(MultipleRegistrationTestCase):
  80. NUM_REGISTRATIONS = 10
  81. def _registrations(self):
  82. return [
  83. ('1.3.3.7', settings.ABUSE_BY_REMOTE_IP_PERIOD_HRS, None)
  84. for _ in range(self.NUM_REGISTRATIONS)
  85. ]
  86. def test_is_not_locked(self):
  87. for user in self.users:
  88. self.assertIsNone(user.locked)
  89. class MultipleRegistrationSameEmailHostShortTime(MultipleRegistrationTestCase):
  90. NUM_REGISTRATIONS = settings.ABUSE_BY_EMAIL_HOSTNAME_LIMIT + 3
  91. def _registrations(self):
  92. host = self.random_domain_name()
  93. return [
  94. (None, 0, host)
  95. for _ in range(self.NUM_REGISTRATIONS)
  96. ]
  97. def test_is_locked(self):
  98. for i in range(self.NUM_REGISTRATIONS):
  99. if i < settings.ABUSE_BY_EMAIL_HOSTNAME_LIMIT:
  100. self.assertIsNone(self.users[i].locked)
  101. else:
  102. self.assertIsNotNone(self.users[i].locked)
  103. class MultipleRegistrationsSameEmailHostLongTime(MultipleRegistrationTestCase):
  104. NUM_REGISTRATIONS = settings.ABUSE_BY_EMAIL_HOSTNAME_LIMIT + 3
  105. def _registrations(self):
  106. host = self.random_domain_name()
  107. return [
  108. (self.random_ip(), settings.ABUSE_BY_EMAIL_HOSTNAME_PERIOD_HRS + 1, host)
  109. for _ in range(self.NUM_REGISTRATIONS)
  110. ]
  111. def test_is_not_locked(self):
  112. for user in self.users:
  113. self.assertIsNone(user.locked)