Skip to content

Commit

Permalink
Merge pull request #68 from incuna/validation-email-fix
Browse files Browse the repository at this point in the history
Update TestRegisterView to check mail outbox
  • Loading branch information
meshy committed Sep 23, 2014
2 parents 2160a1f + 309aae8 commit 7222ebc
Show file tree
Hide file tree
Showing 8 changed files with 65 additions and 55 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
## Upcoming version

* Add missing plaintext account validation email
* Add missing `/` to html account validation email

## v2.1.0

* Update `create_user` to set last_login with a default.
Expand Down
2 changes: 1 addition & 1 deletion test_requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ coverage==3.7.1
django==1.7.0
django-inmemorystorage==0.1.1
factory_boy==2.4.1
incuna-test-utils==0.4
incuna-test-utils==5.0.0
pillow==2.5.3
psycopg2==2.5.3
dj-database-url==0.3.0
Expand Down
12 changes: 6 additions & 6 deletions user_management/api/avatar/tests/test_urls.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
from incuna_test_utils.testcases.urls import URLsTestCase
from incuna_test_utils.testcases.urls import URLTestCase

from .. import views


class TestURLs(URLsTestCase):
class TestURLs(URLTestCase):
"""Ensure the urls work."""

def test_profile_avatar_url(self):
self.check_url(
view_class=views.ProfileAvatar,
self.assert_url_matches_view(
view=views.ProfileAvatar,
expected_url='/profile/avatar',
url_name='user_management_api:profile_avatar')

def test_user_avatar_url(self):
self.check_url(
view_class=views.UserAvatar,
self.assert_url_matches_view(
view=views.UserAvatar,
expected_url='/users/1/avatar',
url_name='user_management_api:user_avatar',
url_kwargs={'pk': 1})
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

Please click the following link to complete your registration:
{% endblocktrans %}
http://{{ site.domain }}#/register/verify/{{ uid }}/{{ token }}/
http://{{ site.domain }}/#/register/verify/{{ uid }}/{{ token }}/

{% endautoescape %}
{% endspaceless %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{% spaceless %}{% load i18n %}{% autoescape off %}{% blocktrans %}
You are receiving this email because your email address has been used to
register an account at {{ site.name }}.

Please click the following link to complete your registration:
{% endblocktrans %}
http://{{ site.domain }}/#/register/verify/{{ uid }}/{{ token }}/

{% endautoescape %}
{% endspaceless %}
36 changes: 18 additions & 18 deletions user_management/api/tests/test_urls.py
Original file line number Diff line number Diff line change
@@ -1,57 +1,57 @@
from incuna_test_utils.testcases.urls import URLsTestCase
from incuna_test_utils.testcases.urls import URLTestCase

from .. import views


class TestURLs(URLsTestCase):
class TestURLs(URLTestCase):
"""Ensure the urls work."""

def test_auth_token_url(self):
self.check_url(
view_class=views.GetToken,
self.assert_url_matches_view(
view=views.GetToken,
expected_url='/auth',
url_name='user_management_api:auth')

def test_password_reset_confirm_url(self):
self.check_url(
view_class=views.PasswordReset,
self.assert_url_matches_view(
view=views.PasswordReset,
expected_url='/auth/password_reset/confirm/a/x-y',
url_name='user_management_api:password_reset_confirm',
url_kwargs={'uidb64': 'a', 'token': 'x-y'})

def test_password_reset_url(self):
self.check_url(
view_class=views.PasswordResetEmail,
self.assert_url_matches_view(
view=views.PasswordResetEmail,
expected_url='/auth/password_reset',
url_name='user_management_api:password_reset')

def test_profile_detail_url(self):
self.check_url(
view_class=views.ProfileDetail,
self.assert_url_matches_view(
view=views.ProfileDetail,
expected_url='/profile',
url_name='user_management_api:profile_detail')

def test_password_change_url(self):
self.check_url(
view_class=views.PasswordChange,
self.assert_url_matches_view(
view=views.PasswordChange,
expected_url='/profile/password',
url_name='user_management_api:password_change')

def test_register_url(self):
self.check_url(
view_class=views.UserRegister,
self.assert_url_matches_view(
view=views.UserRegister,
expected_url='/register',
url_name='user_management_api:register')

def test_user_detail_url(self):
self.check_url(
view_class=views.UserDetail,
self.assert_url_matches_view(
view=views.UserDetail,
expected_url='/users/1',
url_name='user_management_api:user_detail',
url_kwargs={'pk': 1})

def test_user_list_url(self):
self.check_url(
view_class=views.UserList,
self.assert_url_matches_view(
view=views.UserList,
expected_url='/users',
url_name='user_management_api:user_list')
27 changes: 19 additions & 8 deletions user_management/api/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import re

from django.contrib.auth import get_user_model
from django.contrib.auth.hashers import check_password
from django.contrib.auth.tokens import default_token_generator
Expand Down Expand Up @@ -121,12 +123,23 @@ def test_unauthenticated_user_post(self):
"""Unauthenticated Users should be able to register."""
request = self.create_request('post', auth=False, data=self.data)

send_email_path = 'user_management.models.mixins.VerifyEmailMixin.send_validation_email'
with patch(send_email_path) as send:
response = self.view_class.as_view()(request)
response = self.view_class.as_view()(request)

self.assertEqual(response.status_code, status.HTTP_201_CREATED)
send.assert_called_once_with()
self.assertEqual(len(mail.outbox), 1)

email = mail.outbox[0]
verify_url_regex = re.compile(
r'''
http://example\.com/\#/register/verify/
[0-9A-Za-z_\-]+/ # uid
[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20}/ # token
''',
re.VERBOSE,
)
self.assertRegex(email.body, verify_url_regex)
html_email = email.alternatives[0][0]
self.assertRegex(html_email, verify_url_regex)

user = User.objects.get()
self.assertEqual(user.name, self.data['name'])
Expand All @@ -143,12 +156,10 @@ def test_unauthenticated_user_post_no_verify_email(self):
"""An email should not be sent if email_verification_required is False."""
request = self.create_request('post', auth=False, data=self.data)

send_email_path = 'user_management.models.mixins.VerifyEmailMixin.send_validation_email'
with patch(send_email_path) as send:
response = self.view_class.as_view()(request)
response = self.view_class.as_view()(request)

self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertFalse(send.called)
self.assertEqual(len(mail.outbox), 0)

def test_post_with_missing_data(self):
"""Password should not be sent back on failed request."""
Expand Down
26 changes: 5 additions & 21 deletions user_management/models/tests/utils.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,13 @@
from django.contrib.auth.models import AnonymousUser
from django.test import TestCase
from incuna_test_utils.testcases.request import RequestTestCase as RequestTestCaseBase
from rest_framework.test import APIRequestFactory, force_authenticate
from incuna_test_utils.compat import Python2AssertMixin
from incuna_test_utils.testcases.api_request import BaseAPIRequestTestCase
from incuna_test_utils.testcases.request import BaseRequestTestCase

from .factories import UserFactory


class APIRequestTestCase(TestCase):
class APIRequestTestCase(Python2AssertMixin, BaseAPIRequestTestCase):
user_factory = UserFactory

def create_request(self, method='get', url='/', user=None, auth=True, **kwargs):
if not user:
if auth:
user = self.user_factory.create()
else:
user = AnonymousUser()
kwargs['format'] = 'json'
request = getattr(APIRequestFactory(), method)(url, **kwargs)
request.user = user
if auth:
force_authenticate(request, user)
if 'data' in kwargs:
request.DATA = kwargs['data']
return request


class RequestTestCase(RequestTestCaseBase):
class RequestTestCase(Python2AssertMixin, BaseRequestTestCase):
user_factory = UserFactory

0 comments on commit 7222ebc

Please sign in to comment.