Removed exceptions, found a better way to handle them.

Refactored the forms so that fields like email_address can be used in multiple forms.
Refactored form validation so that a query function is passed into the form to be run, this
way the form is not exposed to the dao layer and the query is more efficient.

This PR still requires some frontend attention. Will work with Chris to update the templates.
This commit is contained in:
Rebecca Law
2016-01-08 15:12:14 +00:00
parent ceb78f49b4
commit c858869a52
13 changed files with 96 additions and 121 deletions

View File

@@ -176,7 +176,7 @@ def test_should_update_password(notifications_admin, notifications_admin_db, not
saved = users_dao.get_user_by_id(user.id)
assert check_hash('somepassword', saved.password)
assert saved.password_changed_at is None
users_dao.update_password(saved.email_address, 'newpassword')
users_dao.update_password(saved, 'newpassword')
updated = users_dao.get_user_by_id(user.id)
assert check_hash('newpassword', updated.password)
assert updated.password_changed_at < datetime.now()

View File

@@ -1,10 +1,9 @@
from pytest import fail
from app.main.dao import users_dao
from app.main.forms import RegisterUserForm
def test_should_raise_validation_error_for_password(notifications_admin):
form = RegisterUserForm([], [])
form = RegisterUserForm(users_dao.get_user_by_email)
form.name.data = 'test'
form.email_address.data = 'teset@example.gov.uk'
form.mobile_number.data = '+441231231231'

View File

@@ -1,3 +1,6 @@
from flask import url_for
from app.main.views import generate_token
from tests.app.main import create_test_user
@@ -21,5 +24,20 @@ def test_should_redirect_to_password_reset_sent(notifications_admin,
assert 'You have been sent an email containing a url to reset your password.' in response.get_data(as_text=True)
def test_should_redirect_to_forgot_password_with_flash_message_when_token_is_expired(notifications_admin,
notifications_admin_db,
notify_db_session):
with notifications_admin.test_request_context():
with notifications_admin.test_client() as client:
notifications_admin.config['TOKEN_MAX_AGE_SECONDS'] = -1000
user = create_test_user('active')
token = generate_token(user.email_address)
response = client.post('/new-password/{}'.format(token),
data={'new_password': 'a-new_password'})
assert response.status_code == 302
assert response.location == url_for('.forgot_password', _external=True)
notifications_admin.config['TOKEN_MAX_AGE_SECONDS'] = 86400
def _set_up_mocker(mocker):
mocker.patch("app.admin_api_client.send_email")

View File

@@ -1,16 +1,30 @@
from pytest import fail
from flask import url_for
from app.main.dao import users_dao
from app.main.encryption import check_hash
from app.main.exceptions import NoDataFoundException
from app.main.views import generate_token
from tests.app.main import create_test_user
def test_should_render_new_password_template(notifications_admin, notifications_admin_db, notify_db_session):
response = notifications_admin.test_client().get('/new-password/some_token')
assert response.status_code == 200
assert ' You can now create a new password for your account.' in response.get_data(as_text=True)
with notifications_admin.test_request_context():
with notifications_admin.test_client() as client:
user = create_test_user('active')
token = generate_token(user.email_address)
response = client.get('/new-password/{}'.format(token))
assert response.status_code == 200
assert ' You can now create a new password for your account.' in response.get_data(as_text=True)
def test_should_render_new_password_template_with_message_of_bad_token(notifications_admin, notifications_admin_db,
notify_db_session):
with notifications_admin.test_request_context():
with notifications_admin.test_client() as client:
token = generate_token('no_user@d.gov.uk')
response = client.get('/new-password/{}'.format(token))
assert response.status_code == 200
assert 'Message about email address does not exist. Some one needs to figure out the words here.' in \
response.get_data(as_text=True)
def test_should_redirect_to_two_factor_when_password_reset_is_successful(notifications_admin,
@@ -25,7 +39,7 @@ def test_should_redirect_to_two_factor_when_password_reset_is_successful(notific
response = client.post('/new-password/{}'.format(token),
data={'new_password': 'a-new_password'})
assert response.status_code == 302
assert response.location == 'http://localhost/two-factor'
assert response.location == url_for('.two_factor', _external=True)
saved_user = users_dao.get_user_by_id(user.id)
assert check_hash('a-new_password', saved_user.password)
@@ -41,23 +55,9 @@ def test_should_redirect_to_forgot_password_with_flash_message_when_token_is_exp
response = client.post('/new-password/{}'.format(token),
data={'new_password': 'a-new_password'})
assert response.status_code == 302
assert response.location == 'http://localhost/forgot-password'
assert response.location == url_for('.forgot_password', _external=True)
notifications_admin.config['TOKEN_MAX_AGE_SECONDS'] = 86400
def test_should_return_raise_no_data_found_exception_when_email_address_does_not_exist(notifications_admin,
notifications_admin_db,
notify_db_session):
with notifications_admin.test_request_context():
with notifications_admin.test_client() as client:
token = generate_token('doesnotexist@it.gov.uk')
try:
client.post('/new-password/{}'.format(token),
data={'new_password': 'a-new_password'})
fail('Expected NoDataFoundException')
except NoDataFoundException:
pass
def _set_up_mocker(mocker):
mocker.patch("app.admin_api_client.send_sms")