From f8fc8e951a6c68bd402e3811d6fb87bbab87fd7e Mon Sep 17 00:00:00 2001 From: Adam Shimali Date: Fri, 22 Jan 2016 17:24:14 +0000 Subject: [PATCH] If user is logged in and visits / /sign-in or /register they will be redirected to choose service. --- app/main/views/index.py | 6 +- app/main/views/register.py | 8 ++- app/main/views/sign_in.py | 8 ++- tests/app/main/views/test_index.py | 17 +++++ tests/app/main/views/test_register.py | 24 +++++-- tests/app/main/views/test_sign_in.py | 96 ++++++++++++++++----------- 6 files changed, 110 insertions(+), 49 deletions(-) create mode 100644 tests/app/main/views/test_index.py diff --git a/app/main/views/index.py b/app/main/views/index.py index c4a543c24..8d9e55390 100644 --- a/app/main/views/index.py +++ b/app/main/views/index.py @@ -1,10 +1,14 @@ -from flask import render_template +from flask import render_template, url_for, redirect from app.main import main from flask_login import login_required +from flask.ext.login import current_user + @main.route('/') def index(): + if current_user and current_user.is_authenticated(): + return redirect(url_for('main.choose_service')) return render_template('views/signedout.html') diff --git a/app/main/views/register.py b/app/main/views/register.py index 6d67a976a..7681dc696 100644 --- a/app/main/views/register.py +++ b/app/main/views/register.py @@ -4,9 +4,12 @@ from flask import ( render_template, redirect, session, - abort + abort, + url_for ) +from flask.ext.login import current_user + from client.errors import HTTPError from app.main import main @@ -22,6 +25,9 @@ from app.notify_client.sender import send_sms_code, send_email_code @main.route('/register', methods=['GET', 'POST']) def register(): + if current_user and current_user.is_authenticated(): + return redirect(url_for('main.choose_service')) + form = RegisterUserForm(users_dao.get_user_by_email) if form.validate_on_submit(): diff --git a/app/main/views/sign_in.py b/app/main/views/sign_in.py index 74a944a08..74a183814 100644 --- a/app/main/views/sign_in.py +++ b/app/main/views/sign_in.py @@ -2,11 +2,13 @@ from flask import ( render_template, redirect, url_for, - session, - abort + session ) +from flask.ext.login import current_user + + from app.main import main from app.main.dao import users_dao from app.main.forms import LoginForm @@ -15,6 +17,8 @@ from app.notify_client.sender import send_sms_code @main.route('/sign-in', methods=(['GET', 'POST'])) def sign_in(): + if current_user and current_user.is_authenticated(): + return redirect(url_for('main.choose_service')) try: form = LoginForm() if form.validate_on_submit(): diff --git a/tests/app/main/views/test_index.py b/tests/app/main/views/test_index.py new file mode 100644 index 000000000..6d4a2b067 --- /dev/null +++ b/tests/app/main/views/test_index.py @@ -0,0 +1,17 @@ +from flask import url_for + + +def test_logged_in_user_redirects_to_choose_service(app_, + db_, + db_session, + mock_api_user, + mock_user_loader, + mock_user_dao_get_by_email): + with app_.test_request_context(): + with app_.test_client() as client: + client.login(mock_api_user) + response = client.get(url_for('main.index')) + assert response.status_code == 302 + + response = client.get(url_for('main.sign_in', follow_redirects=True)) + assert response.location == url_for('main.choose_service', _external=True) diff --git a/tests/app/main/views/test_register.py b/tests/app/main/views/test_register.py index 0d0f0766e..6c070ea98 100644 --- a/tests/app/main/views/test_register.py +++ b/tests/app/main/views/test_register.py @@ -1,13 +1,27 @@ from flask import url_for -from tests.conftest import mock_register_user as mock_user + +def test_render_register_returns_template_with_form(app_, db_, db_session): + response = app_.test_client().get('/register') + + assert response.status_code == 200 + assert 'Create an account' in response.get_data(as_text=True) -# def test_render_register_returns_template_with_form(app_, db_, db_session): -# response = app_.test_client().get('/register') +def test_logged_in_user_redirects_to_choose_service(app_, + db_, + db_session, + mock_api_user, + mock_user_loader, + mock_user_dao_get_by_email): + with app_.test_request_context(): + with app_.test_client() as client: + client.login(mock_api_user) + response = client.get(url_for('main.register')) + assert response.status_code == 302 -# assert response.status_code == 200 -# assert 'Create an account' in response.get_data(as_text=True) + response = client.get(url_for('main.sign_in', follow_redirects=True)) + assert response.location == url_for('main.choose_service', _external=True) def test_process_register_creates_new_user(app_, diff --git a/tests/app/main/views/test_sign_in.py b/tests/app/main/views/test_sign_in.py index 4ce61cf40..d569571fa 100644 --- a/tests/app/main/views/test_sign_in.py +++ b/tests/app/main/views/test_sign_in.py @@ -17,6 +17,22 @@ def test_render_sign_in_returns_sign_in_template(app_): assert 'Forgotten password?' in response.get_data(as_text=True) +def test_logged_in_user_redirects_to_choose_service(app_, + db_, + db_session, + mock_api_user, + mock_user_loader, + mock_user_dao_get_by_email): + with app_.test_request_context(): + with app_.test_client() as client: + client.login(mock_api_user) + response = client.get(url_for('main.sign_in')) + assert response.status_code == 302 + + response = client.get(url_for('main.sign_in', follow_redirects=True)) + assert response.location == url_for('main.choose_service', _external=True) + + def test_process_sign_in_return_2fa_template(app_, db_, db_session, @@ -35,7 +51,7 @@ def test_process_sign_in_return_2fa_template(app_, assert response.location == 'http://localhost/two-factor' -@pytest.mark.xfail(reason='User failed logins not implemented yet') +@pytest.mark.skip(True, reason='User failed logins not implemented yet') def test_should_return_locked_out_true_when_user_is_locked(app_, db_, db_session, @@ -64,47 +80,47 @@ def test_should_return_locked_out_true_when_user_is_locked(app_, assert 'Username or password is incorrect' in response.get_data(as_text=True) -# @pytest.mark.xfail(reason='User failed logins not implemented yet') -# def test_should_return_active_user_is_false_if_user_is_inactive(app_, -# db_, -# db_session, -# mock_user_dao_get_user, -# mock_inactive_user_dao_get_by_email): -# with app_.test_request_context(): -# response = app_.test_client().post( -# url_for('main.sign_in'), data={ -# 'email_address': 'inactive_user@example.gov.uk', -# 'password': 'val1dPassw0rd!'}) +@pytest.mark.skip(True, reason='User failed logins not implemented yet') +def test_should_return_active_user_is_false_if_user_is_inactive(app_, + db_, + db_session, + mock_user_dao_get_user, + mock_inactive_user_dao_get_by_email): + with app_.test_request_context(): + response = app_.test_client().post( + url_for('main.sign_in'), data={ + 'email_address': 'inactive_user@example.gov.uk', + 'password': 'val1dPassw0rd!'}) -# assert response.status_code == 200 -# assert 'Username or password is incorrect' in response.get_data(as_text=True) + assert response.status_code == 200 + assert 'Username or password is incorrect' in response.get_data(as_text=True) -# def test_should_return_200_when_user_does_not_exist(app_, db_, db_session, -# mock_user_dao_get_user, -# mock_user_dao_get_by_email): -# with app_.test_request_context(): -# response = app_.test_client().post( -# url_for('main.sign_in'), data={ -# 'email_address': 'does_not_exist@gov.uk', -# 'password': 'doesNotExist!'}) -# assert response.status_code == 200 -# assert 'Username or password is incorrect' in response.get_data(as_text=True) +def test_should_return_200_when_user_does_not_exist(app_, db_, db_session, + mock_user_dao_get_user, + mock_user_dao_get_by_email): + with app_.test_request_context(): + response = app_.test_client().post( + url_for('main.sign_in'), data={ + 'email_address': 'does_not_exist@gov.uk', + 'password': 'doesNotExist!'}) + assert response.status_code == 200 + assert 'Username or password is incorrect' in response.get_data(as_text=True) -# def test_should_return_200_when_user_is_not_active(app_, db_, db_session): -# user = User(email_address='PendingUser@example.gov.uk', -# password='val1dPassw0rd!', -# mobile_number='+441234123123', -# name='pending user', -# created_at=datetime.now(), -# role_id=1, -# state='pending') -# users_dao.insert_user(user) -# with app_.test_request_context(): -# response = app_.test_client().post( -# url_for('main.sign_in'), data={ -# 'email_address': 'PendingUser@example.gov.uk', -# 'password': 'val1dPassw0rd!'}) -# assert response.status_code == 200 -# assert 'Username or password is incorrect' in response.get_data(as_text=True) +def test_should_return_200_when_user_is_not_active(app_, db_, db_session): + user = User(email_address='PendingUser@example.gov.uk', + password='val1dPassw0rd!', + mobile_number='+441234123123', + name='pending user', + created_at=datetime.now(), + role_id=1, + state='pending') + users_dao.insert_user(user) + with app_.test_request_context(): + response = app_.test_client().post( + url_for('main.sign_in'), data={ + 'email_address': 'PendingUser@example.gov.uk', + 'password': 'val1dPassw0rd!'}) + assert response.status_code == 200 + assert 'Username or password is incorrect' in response.get_data(as_text=True)