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 %}
+
+ {% 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