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

@@ -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)

View File

@@ -8,7 +8,7 @@ from ._jobs import jobs
@main.route("/services/<int:service_id>/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',

View File

@@ -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/<int:service_id>/send-email")
@login_required
def sendemail(service_id):
def send_email(service_id):
return render_template('views/send-email.html')
@main.route("/services/<int:service_id>/check-email")
@login_required
def checkemail(service_id):
def check_email(service_id):
return render_template('views/check-email.html')
@main.route("/services/<int:service_id>/manage-users")
@login_required
def manageusers(service_id):
def manage_users(service_id):
return render_template('views/manage-users.html', service_id=service_id)

View File

@@ -47,7 +47,7 @@ messages = [
@main.route("/services/<int:service_id>/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/<int:service_id>/jobs/<job_id>")
@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/<int:service_id>/jobs/<job_id>/notification/<string:notification_id>")
@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=[

View File

@@ -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))

View File

@@ -43,7 +43,7 @@ message_templates = [
@main.route("/services/<int:service_id>/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/<int:service_id>/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):

View File

@@ -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'))

View File

@@ -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 @@
</div>
</div>
<div class="column-half management-navigation-account">
<a href="{{ url_for('main.userprofile') }}">{{ current_user.name }}</a>
<a href="{{ url_for('main.user_profile') }}">{{ current_user.name }}</a>
<a href="{{ url_for('main.sign_out')}}">Sign out</a>
</div>
</div>

View File

@@ -1,17 +1,17 @@
<nav class="navigation">
<ul>
<li><a href="{{ url_for('.dashboard', service_id=123) }}">Dashboard</a></li>
<li><a href="{{ url_for('.service_dashboard', service_id=123) }}">Dashboard</a></li>
</ul>
<ul>
<li><a href="{{ url_for('.sendsms', service_id=123) }}">Send text messages</a></li>
<li><a href="{{ url_for('.sendemail', service_id=123) }}">Send emails</a></li>
<li><a href="{{ url_for('.showjobs', service_id=123) }}">Activity</a></li>
<li><a href="{{ url_for('.send_sms', service_id=123) }}">Send text messages</a></li>
<li><a href="{{ url_for('.send_email', service_id=123) }}">Send emails</a></li>
<li><a href="{{ url_for('.view_jobs', service_id=123) }}">Activity</a></li>
</ul>
<ul>
<li><a href="{{ url_for('.apikeys', service_id=123) }}">API keys and documentation</a></li>
</ul>
<ul>
<li><a href="{{ url_for('.manageusers', service_id=123) }}">Manage users</a></li>
<li><a href="{{ url_for('.manage_users', service_id=123) }}">Manage users</a></li>
<li><a href="{{ url_for('.service_settings', service_id=123) }}">Service settings</a></li>
</ul>
</nav>

View File

@@ -12,7 +12,7 @@ GOV.UK Notify | API keys and documentation
<p>Here's where developers can access information about the API and access keys</p>
{{ 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'
) }}

View File

@@ -17,7 +17,7 @@
{% for rejected in upload_result.rejects %}
<p>Line {{rejected.line_number}}: {{rejected.phone }}</a>
{% endfor %}
<p><a href="{{url_for('.sendsms', service_id=service_id)}}" class="button">Go back and resolve errors</a></p>
<p><a href="{{url_for('.send_sms', service_id=service_id)}}" class="button">Go back and resolve errors</a></p>
{% 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)
)}}
<input type='hidden' name='recipients' value='{{filename}}'>

View File

@@ -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([

View File

@@ -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'
) }}
</form>

View File

@@ -52,10 +52,10 @@ GOV.UK Notify | Notifications activity
]
) %}
{% call field() %}
<a href="{{ url_for('.shownotification', service_id=service_id, job_id=456, notification_id=item.id) }}">{{item.phone}}</a>
<a href="{{ url_for('.view_notification', service_id=service_id, job_id=456, notification_id=item.id) }}">{{item.phone}}</a>
{% endcall %}
{% call field() %}
<a href="{{ url_for('.shownotification', service_id=service_id, job_id=456, notification_id=item.id) }}">{{item.message[:50]}}…</a>
<a href="{{ url_for('.view_notification', service_id=service_id, job_id=456, notification_id=item.id) }}">{{item.message[:50]}}…</a>
{% endcall %}
{% call field(
align='right',

View File

@@ -16,10 +16,10 @@ GOV.UK Notify | Notifications activity
field_headings=['Job', 'File', 'Time', 'Status']
) %}
{% call field() %}
<a href="{{ url_for('.showjob', service_id=service_id, job_id=456) }}">{{ item.file }}</a>
<a href="{{ url_for('.view_job', service_id=service_id, job_id=456) }}">{{ item.file }}</a>
{% endcall %}
{% call field() %}
<a href="{{ url_for('.showjob', service_id=service_id, job_id=456) }}">{{ item.job }}</a>
<a href="{{ url_for('.view_job', service_id=service_id, job_id=456) }}">{{ item.job }}</a>
{% endcall %}
{% call field() %}
{{ item.time }}

View File

@@ -12,7 +12,7 @@ GOV.UK Notify | Manage users
<p>Here's where you can add or remove users of a service.</p>
{{ 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'
) }}

View File

@@ -26,7 +26,7 @@ GOV.UK Notify | Notifications activity
</div>
{{ 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'
) }}

View File

@@ -30,10 +30,10 @@
field_headings=['Job', 'File', 'Time', 'Status']
) %}
{% call field() %}
<a href="{{ url_for('.showjob', service_id=service_id, job_id=456) }}">{{ item.file }}</a>
<a href="{{ url_for('.view_job', service_id=service_id, job_id=456) }}">{{ item.file }}</a>
{% endcall %}
{% call field() %}
<a href="{{ url_for('.showjob', service_id=service_id, job_id=456) }}">{{ item.job }}</a>
<a href="{{ url_for('.view_job', service_id=service_id, job_id=456) }}">{{ item.job }}</a>
{% endcall %}
{% call field() %}
{{ item.time }}
@@ -43,7 +43,7 @@
{% endcall %}
{% endcall %}
<p>
<a href={{ url_for('.showjobs', service_id=service_id) }}>See all notifications activity</a>
<a href={{ url_for('.view_jobs', service_id=service_id) }}>See all notifications activity</a>
</p>

View File

@@ -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'],

View File

@@ -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"
) }}
</form>

View File

@@ -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"
) }}
</form>

View File

@@ -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')
) }}
</form>
</div>

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