Work in progress, all tests passing and implemented mocks for services_dao.

This commit is contained in:
Nicholas Staples
2016-01-15 17:46:09 +00:00
parent 262bbbac45
commit 4e2019c949
40 changed files with 189 additions and 164 deletions

View File

@@ -5,8 +5,10 @@ from werkzeug.datastructures import MultiDict
def test_form_should_have_errors_when_duplicate_service_is_added(app_,
db_,
db_session):
def _get_form_names():
return ['some service', 'more names']
with app_.test_request_context():
form = AddServiceForm(['some service', 'more names'],
form = AddServiceForm(_get_form_names,
formdata=MultiDict([('service_name', 'some service')]))
form.validate()
assert {'service_name': ['Service name already exists']} == form.errors

View File

@@ -2,12 +2,12 @@ from datetime import datetime, timedelta
from app.main.dao import verify_codes_dao
from app.main.forms import TwoFactorForm
from tests.app.main import create_test_user
from tests import create_test_user
def test_form_is_valid_returns_no_errors(app_, db_, db_session):
with app_.test_request_context(method='POST',
data={'sms_code': '12345'}) as req:
data={'sms_code': '12345'}) as req:
user = set_up_test_data()
codes = verify_codes_dao.get_codes(user.id)
form = TwoFactorForm(codes)
@@ -17,7 +17,7 @@ def test_form_is_valid_returns_no_errors(app_, db_, db_session):
def test_returns_errors_when_code_is_too_short(app_, db_, db_session):
with app_.test_request_context(method='POST',
data={'sms_code': '145'}) as req:
data={'sms_code': '145'}) as req:
user = set_up_test_data()
codes = verify_codes_dao.get_codes(user.id)
form = TwoFactorForm(codes)
@@ -28,7 +28,7 @@ def test_returns_errors_when_code_is_too_short(app_, db_, db_session):
def test_returns_errors_when_code_is_missing(app_, db_, db_session):
with app_.test_request_context(method='POST',
data={}) as req:
data={}) as req:
user = set_up_test_data()
codes = verify_codes_dao.get_codes(user.id)
form = TwoFactorForm(codes)
@@ -39,7 +39,7 @@ def test_returns_errors_when_code_is_missing(app_, db_, db_session):
def test_returns_errors_when_code_contains_letters(app_, db_, db_session):
with app_.test_request_context(method='POST',
data={'sms_code': 'asdfg'}) as req:
data={'sms_code': 'asdfg'}) as req:
user = set_up_test_data()
codes = verify_codes_dao.get_codes(user.id)
form = TwoFactorForm(codes)
@@ -50,7 +50,7 @@ def test_returns_errors_when_code_contains_letters(app_, db_, db_session):
def test_should_return_errors_when_code_is_expired(app_, db_, db_session):
with app_.test_request_context(method='POST',
data={'sms_code': '23456'}) as req:
data={'sms_code': '23456'}) as req:
user = create_test_user('active')
verify_codes_dao.add_code_with_expiry(user_id=user.id,
code='23456',

View File

@@ -1,12 +1,12 @@
from datetime import datetime, timedelta
from app.main.dao import verify_codes_dao
from app.main.forms import VerifyForm
from tests.app.main import create_test_user
from tests import create_test_user
def test_form_should_have_error_when_code_is_not_valid(app_, db_, db_session):
with app_.test_request_context(method='POST',
data={'sms_code': '12345aa', 'email_code': 'abcde'}) as req:
data={'sms_code': '12345aa', 'email_code': 'abcde'}) as req:
user = set_up_test_data()
codes = verify_codes_dao.get_codes(user.id)
form = VerifyForm(codes)
@@ -21,7 +21,7 @@ def test_form_should_have_error_when_code_is_not_valid(app_, db_, db_session):
def test_should_return_errors_when_code_missing(app_, db_, db_session):
with app_.test_request_context(method='POST',
data={}) as req:
data={}) as req:
user = set_up_test_data()
codes = verify_codes_dao.get_codes(user.id)
form = VerifyForm(codes)
@@ -35,7 +35,7 @@ def test_should_return_errors_when_code_missing(app_, db_, db_session):
def test_should_return_errors_when_code_is_too_short(app_, db_, db_session):
with app_.test_request_context(method='POST',
data={'sms_code': '123', 'email_code': '123'}) as req:
data={'sms_code': '123', 'email_code': '123'}) as req:
user = set_up_test_data()
codes = verify_codes_dao.get_codes(user.id)
form = VerifyForm(codes)
@@ -49,7 +49,7 @@ def test_should_return_errors_when_code_is_too_short(app_, db_, db_session):
def test_should_return_errors_when_code_does_not_match(app_, db_, db_session):
with app_.test_request_context(method='POST',
data={'sms_code': '34567', 'email_code': '34567'}) as req:
data={'sms_code': '34567', 'email_code': '34567'}) as req:
user = set_up_test_data()
codes = verify_codes_dao.get_codes(user.id)
form = VerifyForm(codes)
@@ -63,8 +63,8 @@ def test_should_return_errors_when_code_does_not_match(app_, db_, db_session):
def test_should_return_errors_when_code_is_expired(app_, db_, db_session):
with app_.test_request_context(method='POST',
data={'sms_code': '23456',
'email_code': '23456'}) as req:
data={'sms_code': '23456',
'email_code': '23456'}) as req:
user = create_test_user('pending')
verify_codes_dao.add_code_with_expiry(user_id=user.id,
code='23456',
@@ -89,8 +89,8 @@ def test_should_return_valid_form_when_many_codes_exist(app_,
db_,
db_session):
with app_.test_request_context(method='POST',
data={'sms_code': '23456',
'email_code': '23456'}) as req:
data={'sms_code': '23456',
'email_code': '23456'}) as req:
user = set_up_test_data()
verify_codes_dao.add_code(user_id=user.id, code='23456', code_type='email')
verify_codes_dao.add_code(user_id=user.id, code='23456', code_type='sms')

View File

@@ -4,14 +4,12 @@ from tests import create_test_user
from app.models import User
def test_get_should_render_add_service_template(app_, db_, db_session):
def test_get_should_render_add_service_template(app_, db_, db_session, mock_get_service):
with app_.test_request_context():
with app_.test_client() as client:
user = create_test_user('active')
client.login(user)
verify_codes_dao.add_code(user_id=user.id, code='12345', code_type='sms')
client.post(url_for('main.two_factor'), data={'sms_code': '12345'})
response = client.get('/add-service')
response = client.get(url_for('main.add_service'))
assert response.status_code == 200
assert 'Set up notifications for your service' in response.get_data(as_text=True)
@@ -29,7 +27,7 @@ def test_should_add_service_and_redirect_to_next_page(app_,
url_for('main.add_service'),
data={'service_name': 'testing the post'})
assert response.status_code == 302
assert response.location == url_for('main.dashboard', service_id=123, _external=True)
assert response.location == url_for('main.service_dashboard', service_id=101, _external=True)
assert mock_create_service.called
assert mock_get_services.called
@@ -37,11 +35,12 @@ def test_should_add_service_and_redirect_to_next_page(app_,
def test_should_return_form_errors_when_service_name_is_empty(app_,
db_,
db_session,
active_user):
active_user,
mock_get_service):
with app_.test_request_context():
with app_.test_client() as client:
client.login(active_user)
response = client.post('/add-service', data={})
response = client.post(url_for('main.add_service'), data={})
assert response.status_code == 200
assert 'Service name can not be empty' in response.get_data(as_text=True)
@@ -54,7 +53,8 @@ def test_should_return_form_errors_with_duplicate_service_name(app_,
with app_.test_client() as client:
user = User.query.first()
client.login(user)
response = client.post('/add-service', data={'service_name': 'service_one'})
response = client.post(
url_for('main.add_service'), data={'service_name': 'service_one'})
assert response.status_code == 200
assert 'Service name already exists' in response.get_data(as_text=True)
assert mock_get_services.called

View File

@@ -1,15 +1,15 @@
from tests.app.main import create_test_user
from tests import create_test_user
from flask import url_for
def test_should_show_choose_services_page(app_,
db_,
db_session):
db_session,
active_user):
with app_.test_request_context():
with app_.test_client() as client:
user = create_test_user('active')
client.login(user)
response = client.get('/services')
client.login(active_user)
response = client.get(url_for('main.choose_service'))
assert response.status_code == 200
assert 'Choose service' in response.get_data(as_text=True)

View File

@@ -1,9 +1,10 @@
from app.main.dao import verify_codes_dao, users_dao
from tests.app.main import create_test_user
from tests import create_test_user
from flask import url_for
def test_should_render_email_code_not_received_template_and_populate_email_address(db_,
def test_should_render_email_code_not_received_template_and_populate_email_address(app_,
db_,
db_session,
mock_send_sms,
mock_send_email):
@@ -19,7 +20,8 @@ def test_should_render_email_code_not_received_template_and_populate_email_addre
assert 'value="test@user.gov.uk"' in response.get_data(as_text=True)
def test_should_check_and_resend_email_code_redirect_to_verify(db_,
def test_should_check_and_resend_email_code_redirect_to_verify(app_,
db_,
db_session,
mock_send_sms,
mock_send_email):
@@ -35,14 +37,14 @@ def test_should_check_and_resend_email_code_redirect_to_verify(db_,
assert response.location == url_for('main.verify', _external=True)
def test_should_render_text_code_not_received_template(db_,
def test_should_render_text_code_not_received_template(app_,
db_,
db_session,
mock_send_sms,
mock_send_email):
with app_.test_request_context():
with app_.test_client() as client:
with client.session_transaction() as session:
_set_up_mocker(mocker)
user = create_test_user('pending')
session['user_email'] = user.email_address
verify_codes_dao.add_code(user.id, code='12345', code_type='sms')
@@ -53,7 +55,8 @@ def test_should_render_text_code_not_received_template(db_,
assert 'value="+441234123412"'
def test_should_check_and_redirect_to_verify(db_,
def test_should_check_and_redirect_to_verify(app_,
db_,
db_session,
mock_send_sms,
mock_send_email):
@@ -69,7 +72,8 @@ def test_should_check_and_redirect_to_verify(db_,
assert response.location == url_for('main.verify', _external=True)
def test_should_update_email_address_resend_code(db_,
def test_should_update_email_address_resend_code(app_,
db_,
db_session,
mock_send_sms,
mock_send_email):
@@ -87,7 +91,8 @@ def test_should_update_email_address_resend_code(db_,
assert updated_user.email_address == 'new@address.gov.uk'
def test_should_update_mobile_number_resend_code(db_,
def test_should_update_mobile_number_resend_code(app_,
db_,
db_session,
mock_send_sms,
mock_send_email):
@@ -105,13 +110,14 @@ def test_should_update_mobile_number_resend_code(db_,
assert updated_user.mobile_number == '+44 7700 900 460'
def test_should_render_verification_code_not_received(db_,
db_session):
def test_should_render_verification_code_not_received(app_,
db_,
db_session,
active_user):
with app_.test_request_context():
with app_.test_client() as client:
with client.session_transaction() as session:
user = create_test_user('active')
session['user_email'] = user.email_address
session['user_email'] = active_user.email_address
response = client.get(url_for('main.verification_code_not_received'))
assert response.status_code == 200
assert 'Resend verification code' in response.get_data(as_text=True)
@@ -119,34 +125,36 @@ def test_should_render_verification_code_not_received(db_,
'speak to your service manager to reset the number.' in response.get_data(as_text=True)
def test_check_and_redirect_to_two_factor(db_,
def test_check_and_redirect_to_two_factor(app_,
db_,
db_session,
active_user,
mock_send_sms,
mock_send_email):
with app_.test_request_context():
with app_.test_client() as client:
with client.session_transaction() as session:
user = create_test_user('active')
session['user_email'] = user.email_address
session['user_email'] = active_user.email_address
response = client.get(url_for('main.check_and_resend_verification_code'))
assert response.status_code == 302
assert response.location == url_for('main.two_factor', _external=True)
def test_should_create_new_code_for_user(db_,
def test_should_create_new_code_for_user(app_,
db_,
db_session,
active_user,
mock_send_sms,
mock_send_email):
with app_.test_request_context():
with app_.test_client() as client:
with client.session_transaction() as session:
user = create_test_user('active')
session['user_email'] = user.email_address
verify_codes_dao.add_code(user_id=user.id, code='12345', code_type='sms')
session['user_email'] = active_user.email_address
verify_codes_dao.add_code(user_id=active_user.id, code='12345', code_type='sms')
response = client.get(url_for('main.check_and_resend_verification_code'))
assert response.status_code == 302
assert response.location == url_for('main.two_factor', _external=True)
codes = verify_codes_dao.get_codes(user_id=user.id, code_type='sms')
codes = verify_codes_dao.get_codes(user_id=active_user.id, code_type='sms')
assert len(codes) == 2
for x in ([used.code_used for used in codes]):
assert x is False

View File

@@ -1,15 +1,16 @@
from tests.app.main import create_test_user
from app.models import User
from flask import url_for
def test_should_show_recent_jobs_on_dashboard(app_,
db_,
db_session):
db_session,
active_user,
mock_get_service):
with app_.test_request_context():
with app_.test_client() as client:
user = create_test_user('active')
client.login(user)
response = client.get('/services/123/dashboard')
client.login(active_user)
response = client.get(url_for('main.service_dashboard', service_id=123))
assert response.status_code == 200
assert 'Test message 1' in response.get_data(as_text=True)

View File

@@ -1,6 +1,6 @@
from flask import url_for
from app.main.dao import users_dao
from tests.app.main import create_test_user
from tests import create_test_user
def test_should_render_forgot_password(app_, db_, db_session):

View File

@@ -1,39 +1,45 @@
from tests.app.main import create_test_user
from flask import url_for
from app.models import User
from tests import create_test_user
def test_should_return_list_of_all_jobs(app_, db_, db_session):
def test_should_return_list_of_all_jobs(app_, db_, db_session, service_one):
with app_.test_request_context():
with app_.test_client() as client:
user = create_test_user('active')
user = User.query.first()
client.login(user)
response = client.get('/services/123/jobs')
response = client.get(url_for('main.view_jobs', service_id=101))
assert response.status_code == 200
assert 'Test message 1' in response.get_data(as_text=True)
assert 'Final reminder' in response.get_data(as_text=True)
def test_should_show_page_for_one_job(app_, db_, db_session):
def test_should_show_page_for_one_job(app_, db_, db_session, service_one):
with app_.test_request_context():
with app_.test_client() as client:
# TODO filename will be part of job metadata not in session
with client.session_transaction() as s:
s[456] = 'dispatch_20151114.csv'
user = create_test_user('active')
user = User.query.first()
client.login(user)
response = client.get('/services/123/jobs/456')
response = client.get(url_for('main.view_job', service_id=123, job_id=456))
assert response.status_code == 200
assert 'dispatch_20151114.csv' in response.get_data(as_text=True)
assert 'Test message 1' in response.get_data(as_text=True)
def test_should_show_page_for_one_notification(app_, db_, db_session):
def test_should_show_page_for_one_notification(app_, db_, db_session, service_one):
with app_.test_request_context():
with app_.test_client() as client:
user = create_test_user('active')
user = User.query.first()
client.login(user)
response = client.get('/services/123/jobs/456/notification/3')
response = client.get(url_for(
'main.view_notification',
service_id=101,
job_id=123,
notification_id=3))
assert response.status_code == 200
assert 'Text message' in response.get_data(as_text=True)

View File

@@ -3,10 +3,10 @@ from flask import url_for
from app.main.dao import users_dao
from app.main.encryption import check_hash
from app.notify_client.sender import generate_token
from tests.app.main import create_test_user
from tests import create_test_user
def test_should_render_new_password_template(db_, db_session):
def test_should_render_new_password_template(app_, db_, db_session):
with app_.test_request_context():
with app_.test_client() as client:
user = create_test_user('request_password_reset')
@@ -16,7 +16,7 @@ def test_should_render_new_password_template(db_, db_session):
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(db_, db_session):
def test_should_render_new_password_template_with_message_of_bad_token(app_, db_, db_session):
with app_.test_request_context():
with app_.test_client() as client:
create_test_user('request_password_reset')
@@ -27,7 +27,8 @@ def test_should_render_new_password_template_with_message_of_bad_token(db_, db_s
response.get_data(as_text=True)
def test_should_redirect_to_two_factor_when_password_reset_is_successful(db_,
def test_should_redirect_to_two_factor_when_password_reset_is_successful(app_,
db_,
db_session,
mock_send_sms):
with app_.test_request_context():
@@ -42,7 +43,8 @@ def test_should_redirect_to_two_factor_when_password_reset_is_successful(db_,
assert saved_user.state == 'active'
def test_should_redirect_to_forgot_password_with_flash_message_when_token_is_expired(db_,
def test_should_redirect_to_forgot_password_with_flash_message_when_token_is_expired(app_,
db_,
db_session):
with app_.test_request_context():
with app_.test_client() as client:
@@ -55,7 +57,8 @@ def test_should_redirect_to_forgot_password_with_flash_message_when_token_is_exp
app_.config['TOKEN_MAX_AGE_SECONDS'] = 3600
def test_should_redirect_to_forgot_password_when_user_is_active_should_be_request_password_reset(db_,
def test_should_redirect_to_forgot_password_when_user_is_active_should_be_request_password_reset(app_,
db_,
db_session):
with app_.test_request_context():
with app_.test_client() as client:

View File

@@ -1,26 +1,30 @@
from flask import url_for
def test_render_register_returns_template_with_form(db_, db_session):
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_process_register_creates_new_user(db_,
def test_process_register_creates_new_user(app_,
db_,
db_session,
mock_send_sms,
mock_send_email):
response = app_.test_client().post('/register',
data={'name': 'Some One Valid',
'email_address': 'someone@example.gov.uk',
'mobile_number': '+4407700900460',
'password': 'validPassword!'})
assert response.status_code == 302
assert response.location == url_for('main.verify', _external=True)
with app_.test_request_context():
response = app_.test_client().post('/register',
data={'name': 'Some One Valid',
'email_address': 'someone@example.gov.uk',
'mobile_number': '+4407700900460',
'password': 'validPassword!'})
assert response.status_code == 302
assert response.location == url_for('main.verify', _external=True)
def test_process_register_returns_400_when_mobile_number_is_invalid(db_,
def test_process_register_returns_400_when_mobile_number_is_invalid(app_,
db_,
db_session,
mock_send_sms,
mock_send_email):
@@ -34,7 +38,8 @@ def test_process_register_returns_400_when_mobile_number_is_invalid(db_,
assert 'Must be a UK mobile number (eg 07700 900460)' in response.get_data(as_text=True)
def test_should_return_400_when_email_is_not_gov_uk(db_,
def test_should_return_400_when_email_is_not_gov_uk(app_,
db_,
db_session,
mock_send_sms,
mock_send_email):
@@ -48,7 +53,8 @@ def test_should_return_400_when_email_is_not_gov_uk(db_,
assert 'Enter a gov.uk email address' in response.get_data(as_text=True)
def test_should_add_verify_codes_on_session(db_,
def test_should_add_verify_codes_on_session(app_,
db_,
db_session,
mock_send_sms,
mock_send_email):
@@ -62,7 +68,7 @@ def test_should_add_verify_codes_on_session(db_,
assert 'notify_admin_session' in response.headers.get('Set-Cookie')
def test_should_return_400_if_password_is_blacklisted(db_, db_session):
def test_should_return_400_if_password_is_blacklisted(app_, db_, db_session):
response = app_.test_client().post('/register',
data={'name': 'Bad Mobile',
'email_address': 'bad_mobile@example.not.right',

View File

@@ -1,4 +1,4 @@
from tests.app.main import create_test_user
from tests import create_test_user
def test_should_show_overview(app_, db_, db_session):

View File

@@ -3,8 +3,6 @@ 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(app_):
with app_.test_request_context():
@@ -19,7 +17,8 @@ def test_sign_out_user(app_,
db_,
db_session,
mock_send_sms,
mock_send_email):
mock_send_email,
mock_get_service):
with app_.test_request_context():
email = 'valid@example.gov.uk'
password = 'val1dPassw0rd!'
@@ -34,7 +33,8 @@ def test_sign_out_user(app_,
with app_.test_client() as client:
client.login(user)
# Check we are logged in
response = client.get('/services/123/dashboard')
response = client.get(
url_for('main.service_dashboard', service_id="123"))
assert response.status_code == 200
response = client.get(url_for('main.sign_out'))
assert response.status_code == 302

View File

@@ -2,7 +2,7 @@ from io import BytesIO
from unittest import mock
from unittest.mock import mock_open
from tests.app.main import create_test_user
from tests import create_test_user
def test_upload_empty_csvfile_returns_to_upload_page(

View File

@@ -1,4 +1,4 @@
from tests.app.main import create_test_user
from tests import create_test_user
def test_should_return_list_of_all_templates(app_, db_, db_session):

View File

@@ -1,7 +1,7 @@
from flask import json, url_for
from app.main.dao import verify_codes_dao
from tests.app.main import create_test_user
from tests import create_test_user
def test_should_render_two_factor_page(app_, db_, db_session):

View File

@@ -1,6 +1,6 @@
from flask import json, url_for
from app.main.dao import users_dao, verify_codes_dao
from tests.app.main import create_test_user
from tests import create_test_user
def test_should_return_verify_template(app_, db_, db_session):

View File

@@ -124,5 +124,4 @@ def mock_get_services(mocker, active_user):
return {'data': [service_one, service_two]}
mock_class = mocker.patch(
'app.notifications_api_client.get_services', side_effect=_create)
return mock_class
return mock_class