From 59052297149607feaef1671dd29e0b61fca2958b Mon Sep 17 00:00:00 2001 From: Nicholas Staples Date: Wed, 6 Jan 2016 16:40:38 +0000 Subject: [PATCH] Logout functionality and test added. --- app/main/__init__.py | 3 +- app/main/views/dashboard.py | 4 ++- app/main/views/sign_out.py | 13 ++++++++ app/templates/admin_template.html | 5 ++++ tests/app/main/views/test_sign_out.py | 43 +++++++++++++++++++++++++++ tests/conftest.py | 17 +++++++++++ 6 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 app/main/views/sign_out.py create mode 100644 tests/app/main/views/test_sign_out.py diff --git a/app/main/__init__.py b/app/main/__init__.py index 7b77dcc48..93354853b 100644 --- a/app/main/__init__.py +++ b/app/main/__init__.py @@ -4,5 +4,6 @@ main = Blueprint('main', __name__) from app.main.views import ( - index, sign_in, register, two_factor, verify, sms, add_service, code_not_received, jobs, dashboard, templates + index, sign_in, sign_out, register, two_factor, verify, sms, add_service, + code_not_received, jobs, dashboard, templates ) diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index 0e0275f45..d5e7e2355 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -1,11 +1,13 @@ from flask import render_template - +from flask_login import login_required from app.main import main + from ._jobs import jobs @main.route("/dashboard") +@login_required def dashboard(): return render_template( 'views/dashboard.html', diff --git a/app/main/views/sign_out.py b/app/main/views/sign_out.py new file mode 100644 index 000000000..8f7b97cf4 --- /dev/null +++ b/app/main/views/sign_out.py @@ -0,0 +1,13 @@ +from flask import (render_template, redirect, url_for) +from flask import session +from flask_login import login_required, logout_user + +from app.main import main + + +@main.route('/sign-out', methods=(['GET'])) +@login_required +def sign_out(): + logout_user() + return redirect(url_for('main.render_sign_in')) + diff --git a/app/templates/admin_template.html b/app/templates/admin_template.html index 76947a435..1abfb3c9d 100644 --- a/app/templates/admin_template.html +++ b/app/templates/admin_template.html @@ -28,6 +28,11 @@
BETA
+ {% if current_user.is_authenticated %} +
+ Sign out +
+ {% endif %} {% endblock %} diff --git a/tests/app/main/views/test_sign_out.py b/tests/app/main/views/test_sign_out.py new file mode 100644 index 000000000..57925081a --- /dev/null +++ b/tests/app/main/views/test_sign_out.py @@ -0,0 +1,43 @@ +from datetime import datetime +from flask import url_for +from app.main.dao import users_dao +from app.models import User + +from .test_sign_in import _set_up_mocker + + +def test_render_sign_out_redirects_to_sign_in(notifications_admin): + with notifications_admin.test_request_context(): + response = notifications_admin.test_client().get( + url_for('main.sign_out')) + assert response.status_code == 302 + assert response.location == url_for( + 'main.render_sign_in', _external=True, next=url_for('main.sign_out')) + + +def test_sign_out_user(notifications_admin, + notifications_admin_db, + notify_db_session, + mocker): + with notifications_admin.test_request_context(): + _set_up_mocker(mocker) + email = 'valid@example.gov.uk' + password = 'val1dPassw0rd!' + user = User(email_address=email, + password=password, + mobile_number='+441234123123', + name='valid', + created_at=datetime.now(), + role_id=1, + state='active') + users_dao.insert_user(user) + with notifications_admin.test_client() as client: + client.login(user) + # Check we are logged in + response = client.get( + url_for('main.dashboard')) + assert response.status_code == 200 + response = client.get(url_for('main.sign_out')) + assert response.status_code == 302 + assert response.location == url_for( + 'main.render_sign_in', _external=True) diff --git a/tests/conftest.py b/tests/conftest.py index 33e3ea9a3..cd7d3cd09 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,12 +3,28 @@ import os import pytest from alembic.command import upgrade from alembic.config import Config +from flask import url_for from flask.ext.migrate import Migrate, MigrateCommand from flask.ext.script import Manager +from flask_login import login_user from sqlalchemy.schema import MetaData +from flask.testing import FlaskClient +from app.main.dao import verify_codes_dao from app import create_app, db +class TestClient(FlaskClient): + def login(self, user): + # Skipping authentication here and just log them in + with self.session_transaction() as session: + session['user_id'] = user.id + verify_codes_dao.add_code(user_id=user.id, code='12345', code_type='sms') + response = self.post('/two-factor', + data={'sms_code': '12345'}) + + def logout(self, user): + self.get(url_for("main.logout")) + @pytest.fixture(scope='session') def notifications_admin(request): @@ -21,6 +37,7 @@ def notifications_admin(request): ctx.pop() request.addfinalizer(teardown) + app.test_client_class = TestClient return app