def test_email_is_unique_double_registration(self): from django.contrib.auth import get_user_model from rest_framework import test from rest_framework import status # disable existing attributes models.Attribute.objects.update(disabled=True) user = self.reguser3 cred = self.reguser3_cred User = get_user_model() user_count = User.objects.count() client = test.APIClient() password = '******' username = '******' email = '*****@*****.**' return_url = 'http://sp.org/register/' payload = { 'email': email, 'username': username, 'ou': self.ou.slug, 'password': password, 'return_url': return_url, } outbox_level = len(mail.outbox) client.credentials(HTTP_AUTHORIZATION='Basic %s' % cred) response = client.post(reverse('a2-api-register'), content_type='application/json', data=json.dumps(payload)) self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) self.assertIn('result', response.data) self.assertEqual(response.data['result'], 1) self.assertIn('token', response.data) token = response.data['token'] self.assertEqual(len(mail.outbox), outbox_level + 1) outbox_level = len(mail.outbox) # Second registration response2 = client.post(reverse('a2-api-register'), content_type='application/json', data=json.dumps(payload)) self.assertEqual(response2.status_code, status.HTTP_202_ACCEPTED) self.assertIn('result', response2.data) self.assertEqual(response2.data['result'], 1) self.assertIn('token', response2.data) token2 = response2.data['token'] self.assertEqual(len(mail.outbox), outbox_level + 1) activation_mail1, activation_mail2 = mail.outbox # User side - user click on first email client = Client() activation_url = get_link_from_mail(activation_mail1) response = client.get(activation_url) self.assertEqual(response.status_code, status.HTTP_200_OK) assert utils.make_url(return_url, params={'token': token}) in response.content self.assertEqual(User.objects.count(), user_count + 1) response = client.get(reverse('auth_homepage')) self.assertContains(response, username) last_user = User.objects.order_by('id').last() self.assertEqual(last_user.username, username) self.assertEqual(last_user.email, email) self.assertEqual(last_user.ou.slug, self.ou.slug) self.assertTrue(last_user.check_password(password)) # User click on second email client = Client() activation_url = get_link_from_mail(activation_mail2) response = client.get(activation_url) self.assertEqual(response.status_code, status.HTTP_302_FOUND) self.assertEqual(response['Location'], utils.make_url(return_url, params={'token': token2})) self.assertEqual(User.objects.count(), user_count + 1) response = client.get(reverse('auth_homepage')) self.assertContains(response, username) last_user2 = User.objects.order_by('id').last() self.assertEqual(User.objects.filter(email=payload['email']).count(), 1) self.assertEqual(last_user.id, last_user2.id) self.assertEqual(last_user2.username, username) self.assertEqual(last_user2.email, email) self.assertEqual(last_user2.ou.slug, self.ou.slug) self.assertTrue(last_user2.check_password(password)) # Test email is unique with case change client = test.APIClient() client.credentials(HTTP_AUTHORIZATION='Basic %s' % cred) payload = { 'email': email.upper(), 'username': username + '1', 'ou': self.ou.slug, 'password': password, 'return_url': return_url, } response = client.post(reverse('a2-api-register'), content_type='application/json', data=json.dumps(payload)) self.assertEqual(response.data['errors']['__all__'], [_('You already have an account')]) # Username is required payload = { 'email': '1' + email, 'ou': self.ou.slug, 'password': password, 'return_url': return_url, } response = client.post(reverse('a2-api-register'), content_type='application/json', data=json.dumps(payload)) self.assertEqual(response.data['errors']['__all__'], [_('Username is required in this ou')]) # Test username is unique payload = { 'email': '1' + email, 'username': username, 'ou': self.ou.slug, 'password': password, 'return_url': return_url, } response = client.post(reverse('a2-api-register'), content_type='application/json', data=json.dumps(payload)) self.assertEqual(response.data['errors']['__all__'], [_('You already have an account')])