test_user_create_api.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. from django.contrib.auth import get_user_model
  2. from django.core import mail
  3. from django.urls import reverse
  4. from misago.conf import settings
  5. from misago.users.models import Ban, Online
  6. from misago.users.testutils import UserTestCase
  7. UserModel = get_user_model()
  8. class UserCreateTests(UserTestCase):
  9. """tests for new user registration (POST to /api/users/)"""
  10. def setUp(self):
  11. super(UserCreateTests, self).setUp()
  12. self.api_link = '/api/users/'
  13. def test_empty_request(self):
  14. """empty request errors with code 400"""
  15. response = self.client.post(self.api_link)
  16. self.assertEqual(response.status_code, 400)
  17. def test_authenticated_request(self):
  18. """authentiated user request errors with code 403"""
  19. self.login_user(self.get_authenticated_user())
  20. response = self.client.post(self.api_link)
  21. self.assertEqual(response.status_code, 403)
  22. def test_registration_off_request(self):
  23. """registrations off request errors with code 403"""
  24. settings.override_setting('account_activation', 'closed')
  25. response = self.client.post(self.api_link)
  26. self.assertContains(response, 'closed', status_code=403)
  27. def test_registration_validates_ip_ban(self):
  28. """api validates ip ban"""
  29. Ban.objects.create(
  30. check_type=Ban.IP,
  31. banned_value='127.*',
  32. user_message="You can't register account like this.",
  33. )
  34. response = self.client.post(
  35. self.api_link,
  36. data={
  37. 'username': 'totallyNew',
  38. 'email': 'loremipsum@dolor.met',
  39. 'password': 'LoremP4ssword',
  40. },
  41. )
  42. self.assertEqual(response.status_code, 403)
  43. def test_registration_validates_ip_registration_ban(self):
  44. """api validates ip registration-only ban"""
  45. Ban.objects.create(
  46. check_type=Ban.IP,
  47. banned_value='127.*',
  48. user_message="You can't register account like this.",
  49. registration_only=True,
  50. )
  51. response = self.client.post(
  52. self.api_link,
  53. data={
  54. 'username': 'totallyNew',
  55. 'email': 'loremipsum@dolor.met',
  56. 'password': 'LoremP4ssword',
  57. },
  58. )
  59. self.assertEqual(response.status_code, 400)
  60. self.assertEqual(response.json(), {
  61. '__all__': ["You can't register account like this."],
  62. })
  63. def test_registration_validates_username(self):
  64. """api validates usernames"""
  65. user = self.get_authenticated_user()
  66. response = self.client.post(
  67. self.api_link,
  68. data={
  69. 'username': user.username,
  70. 'email': 'loremipsum@dolor.met',
  71. 'password': 'LoremP4ssword',
  72. },
  73. )
  74. self.assertEqual(response.status_code, 400)
  75. self.assertEqual(response.json(), {
  76. 'username': ["This username is not available."],
  77. })
  78. def test_registration_validates_username_ban(self):
  79. """api validates username ban"""
  80. Ban.objects.create(
  81. banned_value='totally*',
  82. user_message="You can't register account like this.",
  83. )
  84. response = self.client.post(
  85. self.api_link,
  86. data={
  87. 'username': 'totallyNew',
  88. 'email': 'loremipsum@dolor.met',
  89. 'password': 'LoremP4ssword',
  90. },
  91. )
  92. self.assertEqual(response.status_code, 400)
  93. self.assertEqual(response.json(), {
  94. 'username': ["You can't register account like this."],
  95. })
  96. def test_registration_validates_username_registration_ban(self):
  97. """api validates username registration-only ban"""
  98. Ban.objects.create(
  99. banned_value='totally*',
  100. user_message="You can't register account like this.",
  101. registration_only=True,
  102. )
  103. response = self.client.post(
  104. self.api_link,
  105. data={
  106. 'username': 'totallyNew',
  107. 'email': 'loremipsum@dolor.met',
  108. 'password': 'LoremP4ssword',
  109. },
  110. )
  111. self.assertEqual(response.status_code, 400)
  112. self.assertEqual(response.json(), {
  113. 'username': ["You can't register account like this."],
  114. })
  115. def test_registration_validates_email(self):
  116. """api validates usernames"""
  117. user = self.get_authenticated_user()
  118. response = self.client.post(
  119. self.api_link,
  120. data={
  121. 'username': 'totallyNew',
  122. 'email': user.email,
  123. 'password': 'LoremP4ssword',
  124. },
  125. )
  126. self.assertEqual(response.status_code, 400)
  127. self.assertEqual(response.json(), {
  128. 'email': ["This e-mail address is not available."],
  129. })
  130. def test_registration_validates_email_ban(self):
  131. """api validates email ban"""
  132. Ban.objects.create(
  133. check_type=Ban.EMAIL,
  134. banned_value='lorem*',
  135. user_message="You can't register account like this.",
  136. )
  137. response = self.client.post(
  138. self.api_link,
  139. data={
  140. 'username': 'totallyNew',
  141. 'email': 'loremipsum@dolor.met',
  142. 'password': 'LoremP4ssword',
  143. },
  144. )
  145. self.assertEqual(response.status_code, 400)
  146. self.assertEqual(response.json(), {
  147. 'email': ["You can't register account like this."],
  148. })
  149. def test_registration_validates_email_registration_ban(self):
  150. """api validates email registration-only ban"""
  151. Ban.objects.create(
  152. check_type=Ban.EMAIL,
  153. banned_value='lorem*',
  154. user_message="You can't register account like this.",
  155. registration_only=True,
  156. )
  157. response = self.client.post(
  158. self.api_link,
  159. data={
  160. 'username': 'totallyNew',
  161. 'email': 'loremipsum@dolor.met',
  162. 'password': 'LoremP4ssword',
  163. },
  164. )
  165. self.assertEqual(response.status_code, 400)
  166. self.assertEqual(response.json(), {
  167. 'email': ["You can't register account like this."],
  168. })
  169. def test_registration_validates_password(self):
  170. """api uses django's validate_password to validate registrations"""
  171. response = self.client.post(
  172. self.api_link,
  173. data={
  174. 'username': 'Bob',
  175. 'email': 'l.o.r.e.m.i.p.s.u.m@gmail.com',
  176. 'password': '123',
  177. },
  178. )
  179. self.assertContains(response, "password is too short", status_code=400)
  180. self.assertContains(response, "password is entirely numeric", status_code=400)
  181. self.assertContains(response, "email is not allowed", status_code=400)
  182. def test_registration_validates_password_similiarity(self):
  183. """api uses validate_password to validate registrations"""
  184. response = self.client.post(
  185. self.api_link,
  186. data={
  187. 'username': 'BobBoberson',
  188. 'email': 'l.o.r.e.m.i.p.s.u.m@gmail.com',
  189. 'password': 'BobBoberson',
  190. },
  191. )
  192. self.assertContains(response, "password is too similar to the username", status_code=400)
  193. def test_registration_calls_validate_new_registration(self):
  194. """api uses validate_new_registration to validate registrations"""
  195. response = self.client.post(
  196. self.api_link,
  197. data={
  198. 'username': 'Bob',
  199. 'email': 'l.o.r.e.m.i.p.s.u.m@gmail.com',
  200. 'password': 'pas123',
  201. },
  202. )
  203. self.assertContains(response, "email is not allowed", status_code=400)
  204. def test_registration_creates_active_user(self):
  205. """api creates active and signed in user on POST"""
  206. settings.override_setting('account_activation', 'none')
  207. response = self.client.post(
  208. self.api_link,
  209. data={
  210. 'username': 'Bob',
  211. 'email': 'bob@bob.com',
  212. 'password': 'pass123',
  213. },
  214. )
  215. self.assertContains(response, 'active')
  216. self.assertContains(response, 'Bob')
  217. self.assertContains(response, 'bob@bob.com')
  218. UserModel.objects.get_by_username('Bob')
  219. test_user = UserModel.objects.get_by_email('bob@bob.com')
  220. self.assertEqual(Online.objects.filter(user=test_user).count(), 1)
  221. response = self.client.get(reverse('misago:index'))
  222. self.assertContains(response, 'Bob')
  223. self.assertIn('Welcome', mail.outbox[0].subject)
  224. def test_registration_creates_inactive_user(self):
  225. """api creates inactive user on POST"""
  226. settings.override_setting('account_activation', 'user')
  227. response = self.client.post(
  228. self.api_link,
  229. data={
  230. 'username': 'Bob',
  231. 'email': 'bob@bob.com',
  232. 'password': 'pass123',
  233. },
  234. )
  235. self.assertContains(response, 'user')
  236. self.assertContains(response, 'Bob')
  237. self.assertContains(response, 'bob@bob.com')
  238. UserModel.objects.get_by_username('Bob')
  239. UserModel.objects.get_by_email('bob@bob.com')
  240. self.assertIn('Welcome', mail.outbox[0].subject)
  241. def test_registration_creates_admin_activated_user(self):
  242. """api creates admin activated user on POST"""
  243. settings.override_setting('account_activation', 'admin')
  244. response = self.client.post(
  245. self.api_link,
  246. data={
  247. 'username': 'Bob',
  248. 'email': 'bob@bob.com',
  249. 'password': 'pass123',
  250. },
  251. )
  252. self.assertContains(response, 'admin')
  253. self.assertContains(response, 'Bob')
  254. self.assertContains(response, 'bob@bob.com')
  255. UserModel.objects.get_by_username('Bob')
  256. UserModel.objects.get_by_email('bob@bob.com')
  257. self.assertIn('Welcome', mail.outbox[0].subject)