From 4e2019c9498d7447bb040e2a8d859e9e09a32047 Mon Sep 17 00:00:00 2001 From: Nicholas Staples Date: Fri, 15 Jan 2016 17:46:09 +0000 Subject: [PATCH] Work in progress, all tests passing and implemented mocks for services_dao. --- app/main/views/add_service.py | 6 +-- app/main/views/dashboard.py | 4 +- app/main/views/index.py | 10 ++-- app/main/views/jobs.py | 6 +-- app/main/views/service_settings.py | 2 +- app/main/views/sms.py | 12 ++--- app/main/views/user_profile.py | 38 +++++++-------- app/templates/admin_template.html | 4 +- app/templates/main_nav.html | 10 ++-- app/templates/views/api-keys.html | 2 +- app/templates/views/check-sms.html | 6 +-- app/templates/views/choose-service.html | 4 +- app/templates/views/edit-template.html | 2 +- app/templates/views/job.html | 4 +- app/templates/views/jobs.html | 4 +- app/templates/views/manage-users.html | 2 +- app/templates/views/notification.html | 2 +- ...{dashboard.html => service_dashboard.html} | 6 +-- app/templates/views/user-profile.html | 8 ++-- .../views/user-profile/change-password.html | 2 +- app/templates/views/user-profile/change.html | 2 +- app/templates/views/user-profile/confirm.html | 2 +- tests/app/main/test_add_service_form.py | 4 +- tests/app/main/test_two_factor_form.py | 12 ++--- tests/app/main/test_verify_form.py | 18 +++---- tests/app/main/views/test_add_service.py | 16 +++---- tests/app/main/views/test_choose_services.py | 10 ++-- .../app/main/views/test_code_not_received.py | 48 +++++++++++-------- tests/app/main/views/test_dashboard.py | 11 +++-- tests/app/main/views/test_forgot_password.py | 2 +- tests/app/main/views/test_jobs.py | 26 ++++++---- tests/app/main/views/test_new_password.py | 15 +++--- tests/app/main/views/test_register.py | 32 ++++++++----- tests/app/main/views/test_service_settings.py | 2 +- tests/app/main/views/test_sign_out.py | 8 ++-- tests/app/main/views/test_sms.py | 2 +- tests/app/main/views/test_templates.py | 2 +- tests/app/main/views/test_two_factor.py | 2 +- tests/app/main/views/test_verify.py | 2 +- tests/conftest.py | 3 +- 40 files changed, 189 insertions(+), 164 deletions(-) rename app/templates/views/{dashboard.html => service_dashboard.html} (77%) diff --git a/app/main/views/add_service.py b/app/main/views/add_service.py index b8367e211..f011a2ab8 100644 --- a/app/main/views/add_service.py +++ b/app/main/views/add_service.py @@ -8,11 +8,11 @@ from app.main.forms import AddServiceForm @main.route("/add-service", methods=['GET', 'POST']) @login_required def add_service(): - # TODO fix up this + # TODO fix up this form = AddServiceForm(services_dao.find_all_service_names) if form.validate_on_submit(): user = users_dao.get_user_by_id(session['user_id']) - services_dao.insert_new_service(form.service_name.data, user) - return redirect(url_for('.dashboard', service_id=123)) + service_id = services_dao.insert_new_service(form.service_name.data, user) + return redirect(url_for('main.service_dashboard', service_id=service_id)) else: return render_template('views/add-service.html', form=form) diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index 9b1bb5235..1c8842d4a 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -8,7 +8,7 @@ from ._jobs import jobs @main.route("/services//dashboard") @login_required -def dashboard(service_id): +def service_dashboard(service_id): try: service = get_service_by_id(service_id) except HTTPError as e: @@ -17,7 +17,7 @@ def dashboard(service_id): else: raise e return render_template( - 'views/dashboard.html', + 'views/service_dashboard.html', jobs=jobs, free_text_messages_remaining=560, spent_this_month='0.00', diff --git a/app/main/views/index.py b/app/main/views/index.py index 0dba1e396..a41d929c0 100644 --- a/app/main/views/index.py +++ b/app/main/views/index.py @@ -10,31 +10,31 @@ def index(): @main.route("/register-from-invite") @login_required -def registerfrominvite(): +def register_from_invite(): return render_template('views/register-from-invite.html') @main.route("/verify-mobile") @login_required -def verifymobile(): +def verify_mobile(): return render_template('views/verify-mobile.html') @main.route("/services//send-email") @login_required -def sendemail(service_id): +def send_email(service_id): return render_template('views/send-email.html') @main.route("/services//check-email") @login_required -def checkemail(service_id): +def check_email(service_id): return render_template('views/check-email.html') @main.route("/services//manage-users") @login_required -def manageusers(service_id): +def manage_users(service_id): return render_template('views/manage-users.html', service_id=service_id) diff --git a/app/main/views/jobs.py b/app/main/views/jobs.py index b5675ead4..c548cb44c 100644 --- a/app/main/views/jobs.py +++ b/app/main/views/jobs.py @@ -47,7 +47,7 @@ messages = [ @main.route("/services//jobs") @login_required -def showjobs(service_id): +def view_jobs(service_id): return render_template( 'views/jobs.html', jobs=jobs, @@ -57,7 +57,7 @@ def showjobs(service_id): @main.route("/services//jobs/") @login_required -def showjob(service_id, job_id): +def view_job(service_id, job_id): # TODO the uploaded file name could be part of job definition # so won't need to be passed on from last view via session @@ -86,7 +86,7 @@ def showjob(service_id, job_id): @main.route("/services//jobs//notification/") @login_required -def shownotification(service_id, job_id, notification_id): +def view_notification(service_id, job_id, notification_id): return render_template( 'views/notification.html', message=[ diff --git a/app/main/views/service_settings.py b/app/main/views/service_settings.py index 92bd302c9..8bf9f702f 100644 --- a/app/main/views/service_settings.py +++ b/app/main/views/service_settings.py @@ -128,4 +128,4 @@ def confirm_delete(service_id): service_id=service_id ) elif request.method == 'POST': - return redirect(url_for('.dashboard', service_id=service_id)) + return redirect(url_for('.service_dashboard', service_id=service_id)) diff --git a/app/main/views/sms.py b/app/main/views/sms.py index d5ca29981..7576eae32 100644 --- a/app/main/views/sms.py +++ b/app/main/views/sms.py @@ -43,7 +43,7 @@ message_templates = [ @main.route("/services//sms/send", methods=['GET', 'POST']) @login_required -def sendsms(service_id): +def send_sms(service_id): form = CsvUploadForm() if form.validate_on_submit(): try: @@ -53,7 +53,7 @@ def sendsms(service_id): filename) csv_file.save(filepath) _check_file(csv_file.filename, filepath) - return redirect(url_for('.checksms', + return redirect(url_for('.check_sms', service_id=service_id, recipients=filename)) except (IOError, ValueError) as e: @@ -63,7 +63,7 @@ def sendsms(service_id): if isinstance(e, ValueError): flash(str(e)) os.remove(filepath) - return redirect(url_for('.sendsms', service_id=service_id)) + return redirect(url_for('.send_sms', service_id=service_id)) return render_template('views/send-sms.html', message_templates=message_templates, @@ -73,7 +73,7 @@ def sendsms(service_id): @main.route("/services//sms/check", methods=['GET', 'POST']) @login_required -def checksms(service_id): +def check_sms(service_id): if request.method == 'GET': filename = request.args.get('recipients') if not filename: @@ -100,10 +100,10 @@ def checksms(service_id): # TODO when job is created record filename in job itself # so downstream pages can get the original filename that way session[upload_id] = filename - return redirect(url_for('main.showjob', service_id=service_id, job_id=upload_id)) + return redirect(url_for('main.view_job', service_id=service_id, job_id=upload_id)) except: flash('There as a problem saving the file') - return redirect(url_for('.checksms', recipients=filename)) + return redirect(url_for('.check_sms', recipients=filename)) def _check_file(filename, filepath): diff --git a/app/main/views/user_profile.py b/app/main/views/user_profile.py index 1b8db76cb..7053cf04c 100644 --- a/app/main/views/user_profile.py +++ b/app/main/views/user_profile.py @@ -8,12 +8,12 @@ from app.main.forms import ( @main.route("/user-profile") -def userprofile(): +def user_profile(): return render_template('views/user-profile.html') @main.route("/user-profile/name", methods=['GET', 'POST']) -def userprofile_name(): +def user_profile_name(): form = ChangeNameForm() @@ -26,11 +26,11 @@ def userprofile_name(): form_field=form.new_name ) elif request.method == 'POST': - return redirect(url_for('.userprofile')) + return redirect(url_for('.user_profile')) @main.route("/user-profile/email", methods=['GET', 'POST']) -def userprofile_email(): +def user_profile_email(): form = ChangeEmailForm() @@ -43,11 +43,11 @@ def userprofile_email(): form_field=form.email_address ) elif request.method == 'POST': - return redirect(url_for('.userprofile_email_authenticate')) + return redirect(url_for('.user_profile_email_authenticate')) @main.route("/user-profile/email/authenticate", methods=['GET', 'POST']) -def userprofile_email_authenticate(): +def user_profile_email_authenticate(): form = ConfirmPasswordForm() @@ -56,14 +56,14 @@ def userprofile_email_authenticate(): 'views/user-profile/authenticate.html', thing='email address', form=form, - back_link=url_for('.userprofile_email') + back_link=url_for('.user_profile_email') ) elif request.method == 'POST': - return redirect(url_for('.userprofile_email_confirm')) + return redirect(url_for('.user_profile_email_confirm')) @main.route("/user-profile/email/confirm", methods=['GET', 'POST']) -def userprofile_email_confirm(): +def user_profile_email_confirm(): form = ConfirmEmailForm() @@ -74,11 +74,11 @@ def userprofile_email_confirm(): thing='email address' ) elif request.method == 'POST': - return redirect(url_for('.userprofile')) + return redirect(url_for('.user_profile')) @main.route("/user-profile/mobile-number", methods=['GET', 'POST']) -def userprofile_mobile_number(): +def user_profile_mobile_number(): form = ChangeMobileNumberForm() @@ -91,11 +91,11 @@ def userprofile_mobile_number(): form_field=form.mobile_number ) elif request.method == 'POST': - return redirect(url_for('.userprofile_mobile_number_authenticate')) + return redirect(url_for('.user_profile_mobile_number_authenticate')) @main.route("/user-profile/mobile-number/authenticate", methods=['GET', 'POST']) -def userprofile_mobile_number_authenticate(): +def user_profile_mobile_number_authenticate(): form = ConfirmPasswordForm() @@ -104,14 +104,14 @@ def userprofile_mobile_number_authenticate(): 'views/user-profile/authenticate.html', thing='mobile number', form=form, - back_link=url_for('.userprofile_mobile_number_confirm') + back_link=url_for('.user_profile_mobile_number_confirm') ) elif request.method == 'POST': - return redirect(url_for('.userprofile_mobile_number_confirm')) + return redirect(url_for('.user_profile_mobile_number_confirm')) @main.route("/user-profile/mobile-number/confirm", methods=['GET', 'POST']) -def userprofile_mobile_number_confirm(): +def user_profile_mobile_number_confirm(): form = ConfirmMobileNumberForm() @@ -122,11 +122,11 @@ def userprofile_mobile_number_confirm(): thing='mobile number' ) elif request.method == 'POST': - return redirect(url_for('.userprofile')) + return redirect(url_for('.user_profile')) @main.route("/user-profile/password", methods=['GET', 'POST']) -def userprofile_password(): +def user_profile_password(): form = ChangePasswordForm() @@ -136,4 +136,4 @@ def userprofile_password(): form=form ) elif request.method == 'POST': - return redirect(url_for('.userprofile')) + return redirect(url_for('.user_profile')) diff --git a/app/templates/admin_template.html b/app/templates/admin_template.html index e273cae10..43eb174e7 100644 --- a/app/templates/admin_template.html +++ b/app/templates/admin_template.html @@ -42,7 +42,7 @@ {% if not current_user.is_authenticated() %} {% set homepage_url = url_for('main.index') %} {% else %} - {% set homepage_url = url_for('main.dashboard', service_id=123) %} + {% set homepage_url = url_for('main.choose_service') %} {% endif %} {% block content %} @@ -60,7 +60,7 @@ diff --git a/app/templates/main_nav.html b/app/templates/main_nav.html index 270a64690..36270da89 100644 --- a/app/templates/main_nav.html +++ b/app/templates/main_nav.html @@ -1,17 +1,17 @@ diff --git a/app/templates/views/api-keys.html b/app/templates/views/api-keys.html index c5615f741..c416504d1 100644 --- a/app/templates/views/api-keys.html +++ b/app/templates/views/api-keys.html @@ -12,7 +12,7 @@ GOV.UK Notify | API keys and documentation

Here's where developers can access information about the API and access keys

{{ page_footer( - back_link=url_for('.dashboard', service_id=service_id), + back_link=url_for('.service_dashboard', service_id=service_id), back_link_text='Back to dashboard' ) }} diff --git a/app/templates/views/check-sms.html b/app/templates/views/check-sms.html index 79d924f08..555c823de 100644 --- a/app/templates/views/check-sms.html +++ b/app/templates/views/check-sms.html @@ -17,7 +17,7 @@ {% for rejected in upload_result.rejects %}

Line {{rejected.line_number}}: {{rejected.phone }} {% endfor %} -

Go back and resolve errors

+

Go back and resolve errors

{% else %} @@ -26,7 +26,7 @@ {{ page_footer( button_text = "Send {} text messages".format(upload_result.valid|count), - back_link = url_for(".sendsms", service_id=service_id) + back_link = url_for(".send_sms", service_id=service_id) )}} {% if upload_result.valid | count > 6 %} @@ -56,7 +56,7 @@ {{ page_footer( button_text = "Send {} text messages".format(upload_result.valid|count), - back_link = url_for(".sendsms", service_id=service_id) + back_link = url_for(".send_sms", service_id=service_id) )}} diff --git a/app/templates/views/choose-service.html b/app/templates/views/choose-service.html index 325393c9f..6f9594da2 100644 --- a/app/templates/views/choose-service.html +++ b/app/templates/views/choose-service.html @@ -14,11 +14,11 @@ {{ browse_list([ { 'title': 'MOT Reminders', - 'link': url_for('.dashboard', service_id=123) + 'link': url_for('.service_dashboard', service_id=123) }, { 'title': 'Vehicle Tax', - 'link': url_for('.dashboard', service_id=123) + 'link': url_for('.service_dashboard', service_id=123) }, ]) }} {{ browse_list([ diff --git a/app/templates/views/edit-template.html b/app/templates/views/edit-template.html index e0059b91b..76876abca 100644 --- a/app/templates/views/edit-template.html +++ b/app/templates/views/edit-template.html @@ -15,7 +15,7 @@ GOV.UK Notify | Edit template {{ textbox(form.template_body, highlight_tags=True) }} {{ page_footer( 'Save and continue', - back_link=url_for('.dashboard', service_id=service_id), + back_link=url_for('.service_dashboard', service_id=service_id), back_link_text='Back to manage templates' ) }} diff --git a/app/templates/views/job.html b/app/templates/views/job.html index e0750ecbd..b5970e947 100644 --- a/app/templates/views/job.html +++ b/app/templates/views/job.html @@ -52,10 +52,10 @@ GOV.UK Notify | Notifications activity ] ) %} {% call field() %} - {{item.phone}} + {{item.phone}} {% endcall %} {% call field() %} - {{item.message[:50]}}… + {{item.message[:50]}}… {% endcall %} {% call field( align='right', diff --git a/app/templates/views/jobs.html b/app/templates/views/jobs.html index 1f66ec613..0879fee7a 100644 --- a/app/templates/views/jobs.html +++ b/app/templates/views/jobs.html @@ -16,10 +16,10 @@ GOV.UK Notify | Notifications activity field_headings=['Job', 'File', 'Time', 'Status'] ) %} {% call field() %} - {{ item.file }} + {{ item.file }} {% endcall %} {% call field() %} - {{ item.job }} + {{ item.job }} {% endcall %} {% call field() %} {{ item.time }} diff --git a/app/templates/views/manage-users.html b/app/templates/views/manage-users.html index 2cdb579b0..90259ee01 100644 --- a/app/templates/views/manage-users.html +++ b/app/templates/views/manage-users.html @@ -12,7 +12,7 @@ GOV.UK Notify | Manage users

Here's where you can add or remove users of a service.

{{ page_footer( - back_link = url_for('.dashboard', service_id=service_id), + back_link = url_for('.service_dashboard', service_id=service_id), back_link_text = 'Back to dashboard' ) }} diff --git a/app/templates/views/notification.html b/app/templates/views/notification.html index d633dd3ff..b10b80940 100644 --- a/app/templates/views/notification.html +++ b/app/templates/views/notification.html @@ -26,7 +26,7 @@ GOV.UK Notify | Notifications activity {{ page_footer( - back_link = url_for('.showjob', service_id=service_id, job_id=job_id), + back_link = url_for('.view_job', service_id=service_id, job_id=job_id), back_link_text = 'View other messages in this job' ) }} diff --git a/app/templates/views/dashboard.html b/app/templates/views/service_dashboard.html similarity index 77% rename from app/templates/views/dashboard.html rename to app/templates/views/service_dashboard.html index bf9e9c688..9e5510795 100644 --- a/app/templates/views/dashboard.html +++ b/app/templates/views/service_dashboard.html @@ -30,10 +30,10 @@ field_headings=['Job', 'File', 'Time', 'Status'] ) %} {% call field() %} - {{ item.file }} + {{ item.file }} {% endcall %} {% call field() %} - {{ item.job }} + {{ item.job }} {% endcall %} {% call field() %} {{ item.time }} @@ -43,7 +43,7 @@ {% endcall %} {% endcall %}

- See all notifications activity + See all notifications activity

diff --git a/app/templates/views/user-profile.html b/app/templates/views/user-profile.html index 751f2e2cb..45a3f5ea5 100644 --- a/app/templates/views/user-profile.html +++ b/app/templates/views/user-profile.html @@ -11,10 +11,10 @@ {% call(item) list_table( [ - {'label': 'Name', 'value': current_user.name, 'url': url_for('.userprofile_name')}, - {'label': 'Email address', 'value': current_user.email_address, 'url': url_for('.userprofile_email')}, - {'label': 'Mobile number', 'value': current_user.mobile_number, 'url': url_for('.userprofile_mobile_number')}, - {'label': 'Password', 'value': 'Last changed 1 January 2016, 10:00AM', 'url': url_for('.userprofile_password')}, + {'label': 'Name', 'value': current_user.name, 'url': url_for('.user_profile_name')}, + {'label': 'Email address', 'value': current_user.email_address, 'url': url_for('.user_profile_email')}, + {'label': 'Mobile number', 'value': current_user.mobile_number, 'url': url_for('.user_profile_mobile_number')}, + {'label': 'Password', 'value': 'Last changed 1 January 2016, 10:00AM', 'url': url_for('.user_profile_password')}, ], caption='Account settings', field_headings=['Setting', 'Value', 'Link to change'], diff --git a/app/templates/views/user-profile/change-password.html b/app/templates/views/user-profile/change-password.html index 9877fc81e..b8136bdd6 100644 --- a/app/templates/views/user-profile/change-password.html +++ b/app/templates/views/user-profile/change-password.html @@ -17,7 +17,7 @@ GOV.UK Notify | Service settings {{ textbox(form.new_password) }} {{ page_footer( 'Save', - back_link=url_for('.userprofile'), + back_link=url_for('.user_profile'), back_link_text="Back to your profile" ) }} diff --git a/app/templates/views/user-profile/change.html b/app/templates/views/user-profile/change.html index 2664b5013..3aca87428 100644 --- a/app/templates/views/user-profile/change.html +++ b/app/templates/views/user-profile/change.html @@ -21,7 +21,7 @@ GOV.UK Notify | Service settings {{ textbox(form_field) }} {{ page_footer( 'Save', - back_link=url_for('.userprofile'), + back_link=url_for('.user_profile'), back_link_text="Back to your profile" ) }} diff --git a/app/templates/views/user-profile/confirm.html b/app/templates/views/user-profile/confirm.html index eeccb3218..3204937c2 100644 --- a/app/templates/views/user-profile/confirm.html +++ b/app/templates/views/user-profile/confirm.html @@ -20,7 +20,7 @@ GOV.UK Notify | Service settings {{ page_footer( 'Confirm', destructive=destructive, - back_link=url_for('.userprofile') + back_link=url_for('.user_profile') ) }} diff --git a/tests/app/main/test_add_service_form.py b/tests/app/main/test_add_service_form.py index 33bc81c16..5f97b7c23 100644 --- a/tests/app/main/test_add_service_form.py +++ b/tests/app/main/test_add_service_form.py @@ -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 diff --git a/tests/app/main/test_two_factor_form.py b/tests/app/main/test_two_factor_form.py index badc66539..df4f32177 100644 --- a/tests/app/main/test_two_factor_form.py +++ b/tests/app/main/test_two_factor_form.py @@ -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', diff --git a/tests/app/main/test_verify_form.py b/tests/app/main/test_verify_form.py index 3159d7b32..2521a8a27 100644 --- a/tests/app/main/test_verify_form.py +++ b/tests/app/main/test_verify_form.py @@ -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') diff --git a/tests/app/main/views/test_add_service.py b/tests/app/main/views/test_add_service.py index 8762c3bf8..1f12bee39 100644 --- a/tests/app/main/views/test_add_service.py +++ b/tests/app/main/views/test_add_service.py @@ -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 diff --git a/tests/app/main/views/test_choose_services.py b/tests/app/main/views/test_choose_services.py index 54b550b8b..0db077aaa 100644 --- a/tests/app/main/views/test_choose_services.py +++ b/tests/app/main/views/test_choose_services.py @@ -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) diff --git a/tests/app/main/views/test_code_not_received.py b/tests/app/main/views/test_code_not_received.py index 120f59ab7..b941911e8 100644 --- a/tests/app/main/views/test_code_not_received.py +++ b/tests/app/main/views/test_code_not_received.py @@ -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 diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index db5a1ddcd..e0d163f99 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -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) diff --git a/tests/app/main/views/test_forgot_password.py b/tests/app/main/views/test_forgot_password.py index efdc3dde8..418addad4 100644 --- a/tests/app/main/views/test_forgot_password.py +++ b/tests/app/main/views/test_forgot_password.py @@ -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): diff --git a/tests/app/main/views/test_jobs.py b/tests/app/main/views/test_jobs.py index 6c69b1a58..039d47dbf 100644 --- a/tests/app/main/views/test_jobs.py +++ b/tests/app/main/views/test_jobs.py @@ -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) diff --git a/tests/app/main/views/test_new_password.py b/tests/app/main/views/test_new_password.py index f6efe8b17..353dd7a40 100644 --- a/tests/app/main/views/test_new_password.py +++ b/tests/app/main/views/test_new_password.py @@ -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: diff --git a/tests/app/main/views/test_register.py b/tests/app/main/views/test_register.py index 959e21373..e23362fcf 100644 --- a/tests/app/main/views/test_register.py +++ b/tests/app/main/views/test_register.py @@ -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', diff --git a/tests/app/main/views/test_service_settings.py b/tests/app/main/views/test_service_settings.py index 8109e63ed..f22963885 100644 --- a/tests/app/main/views/test_service_settings.py +++ b/tests/app/main/views/test_service_settings.py @@ -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): diff --git a/tests/app/main/views/test_sign_out.py b/tests/app/main/views/test_sign_out.py index 68c5d307c..2bc50cb5e 100644 --- a/tests/app/main/views/test_sign_out.py +++ b/tests/app/main/views/test_sign_out.py @@ -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 diff --git a/tests/app/main/views/test_sms.py b/tests/app/main/views/test_sms.py index e44b50a6a..3fbe7bcf3 100644 --- a/tests/app/main/views/test_sms.py +++ b/tests/app/main/views/test_sms.py @@ -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( diff --git a/tests/app/main/views/test_templates.py b/tests/app/main/views/test_templates.py index 3aa48f5f1..f7c14f6c9 100644 --- a/tests/app/main/views/test_templates.py +++ b/tests/app/main/views/test_templates.py @@ -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): diff --git a/tests/app/main/views/test_two_factor.py b/tests/app/main/views/test_two_factor.py index 093b41af6..031969451 100644 --- a/tests/app/main/views/test_two_factor.py +++ b/tests/app/main/views/test_two_factor.py @@ -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): diff --git a/tests/app/main/views/test_verify.py b/tests/app/main/views/test_verify.py index 3673f5abc..b72614547 100644 --- a/tests/app/main/views/test_verify.py +++ b/tests/app/main/views/test_verify.py @@ -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): diff --git a/tests/conftest.py b/tests/conftest.py index fc78f6a43..2c1ea47e1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -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