diff --git a/app/main/__init__.py b/app/main/__init__.py index 5cf60b5fe..1305744ce 100644 --- a/app/main/__init__.py +++ b/app/main/__init__.py @@ -3,4 +3,4 @@ from flask import Blueprint main = Blueprint('main', __name__) -from app.main.views import index, sign_in +from app.main.views import index, sign_in, register diff --git a/app/main/encryption.py b/app/main/encryption.py index 27aff9e25..0d3c72631 100644 --- a/app/main/encryption.py +++ b/app/main/encryption.py @@ -6,4 +6,5 @@ def hashpw(password): def checkpw(password, hashed_password): + # If salt is invalid throws a 500 should add try/catch here return check_password_hash(hashed_password, password) diff --git a/app/main/forms.py b/app/main/forms.py index 6b7119817..bc013fccc 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -1,6 +1,6 @@ from flask_wtf import Form from wtforms import StringField, PasswordField -from wtforms.validators import DataRequired, Email, Length +from wtforms.validators import DataRequired, Email, Length, Regexp class LoginForm(Form): @@ -12,3 +12,24 @@ class LoginForm(Form): password = PasswordField('Password', validators=[ DataRequired(message='Please enter your password') ]) + + +gov_uk_email = "(^[^@^\\s]+@[^@^\\.^\\s]+(\\.[^@^\\.^\\s]*)*.gov.uk)" +mobile_number = "^\\+44[\\d]{10}$" + + +class RegisterUserForm(Form): + name = StringField('Name', + validators=[DataRequired(message='Name can not be empty')]) + email_address = StringField('Email address', validators=[ + Length(min=5, max=255), + DataRequired(message='Email cannot be empty'), + Email(message='Please enter a valid email address'), + Regexp(regex=gov_uk_email, message='Please enter a gov.uk email address') + ]) + mobile_number = StringField('Mobile phone number', + validators=[DataRequired(message='Please enter your mobile number'), + Regexp(regex=mobile_number, message='Please enter a +44 mobile number')]) + password = PasswordField('Password', + validators=[DataRequired(message='Please enter your password'), + Length(10, 255, message='Password must be at least 10 characters')]) diff --git a/app/main/views/index.py b/app/main/views/index.py index e12b97a7d..2ffe73da4 100644 --- a/app/main/views/index.py +++ b/app/main/views/index.py @@ -14,11 +14,6 @@ def govuk(): return render_template('govuk_template.html') -@main.route("/register") -def register(): - return render_template('register.html') - - @main.route("/register-from-invite") @login_required def registerfrominvite(): diff --git a/app/main/views/register.py b/app/main/views/register.py new file mode 100644 index 000000000..0c8f1ccbf --- /dev/null +++ b/app/main/views/register.py @@ -0,0 +1,33 @@ +from datetime import datetime + +from flask import render_template, redirect, jsonify + +from app.main import main +from app.main.dao import users_dao +from app.main.forms import RegisterUserForm +from app.models import User + + +@main.route("/register", methods=['GET']) +def render_register(): + return render_template('register.html', form=RegisterUserForm()) + + +@main.route('/register', methods=['POST']) +def process_register(): + form = RegisterUserForm() + + if form.validate_on_submit(): + user = User(name=form.name.data, + email_address=form.email_address.data, + mobile_number=form.mobile_number.data, + password=form.password.data, + created_at=datetime.now(), + role_id=1) + try: + users_dao.insert_user(user) + return redirect('/two-factor') + except Exception as e: + return jsonify(database_error=e.message), 400 + else: + return jsonify(form.errors), 400 diff --git a/app/templates/register.html b/app/templates/register.html index 04727ba9d..7a8f41f8b 100644 --- a/app/templates/register.html +++ b/app/templates/register.html @@ -14,27 +14,29 @@ GOV.UK Notify | Create an account
You need to have access to your email account and a mobile phone to register.
-- - -
-
-
-
- Your email address must end in .gov.uk
-
- - -
-- - -
- -- Continue -
+ diff --git a/tests/app/main/views/test_register.py b/tests/app/main/views/test_register.py new file mode 100644 index 000000000..2c6e384a0 --- /dev/null +++ b/tests/app/main/views/test_register.py @@ -0,0 +1,39 @@ + + +def test_render_register_returns_template_with_form(notifications_admin, notifications_admin_db): + response = notifications_admin.test_client().get('/register') + + assert response.status_code == 200 + assert 'Create an account' in response.get_data(as_text=True) + + +def test_process_register_creates_new_user(notifications_admin, notifications_admin_db): + response = notifications_admin.test_client().post('/register', + data={'name': 'Some One Valid', + 'email_address': 'someone@example.gov.uk', + 'mobile_number': '+441231231231', + 'password': 'validPassword!'}) + assert response.status_code == 302 + assert response.location == 'http://localhost/two-factor' + + +def test_process_register_returns_400_when_mobile_number_is_invalid(notifications_admin, notifications_admin_db): + response = notifications_admin.test_client().post('/register', + data={'name': 'Bad Mobile', + 'email_address': 'bad_mobile@example.gov.uk', + 'mobile_number': 'not good', + 'password': 'validPassword!'}) + + assert response.status_code == 400 + assert 'Please enter a +44 mobile number' in response.get_data(as_text=True) + + +def test_should_return_400_when_email_is_not_gov_uk(notifications_admin, notifications_admin_db): + response = notifications_admin.test_client().post('/register', + data={'name': 'Bad Mobile', + 'email_address': 'bad_mobile@example.not.right', + 'mobile_number': '+44123412345', + 'password': 'validPassword!'}) + + assert response.status_code == 400 + assert 'Please enter a gov.uk email address' in response.get_data(as_text=True) diff --git a/tests/conftest.py b/tests/conftest.py index 338e4d63b..8712733e3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,5 @@ import pytest +from _pytest.monkeypatch import monkeypatch from sqlalchemy.schema import MetaData, DropConstraint from app import create_app, db