diff --git a/app/assets/stylesheets/_grids.scss b/app/assets/stylesheets/_grids.scss index 183a85630..4f571ca13 100644 --- a/app/assets/stylesheets/_grids.scss +++ b/app/assets/stylesheets/_grids.scss @@ -35,6 +35,10 @@ margin-bottom: $gutter-half; } +.bottom-gutter-2 { + margin-bottom: $gutter * 2; +} + .align-with-heading { display: block; text-align: center; diff --git a/app/main/forms.py b/app/main/forms.py index 820d47c9c..343deb062 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -327,17 +327,21 @@ class ProviderForm(Form): class ServiceReplyToEmailFrom(Form): - email_address = email_address() + email_address = email_address(label='Email reply to address') class ServiceSmsSender(Form): - sms_sender = StringField('', validators=[Length(max=11, - message="Text message sender can't be longer than 11 characters")]) + sms_sender = StringField( + 'Text message sender', + validators=[ + Length(max=11, message="Enter fewer than 11 characters") + ] + ) def validate_sms_sender(form, field): import re if field.data and not re.match('^[a-zA-Z0-9\s]+$', field.data): - raise ValidationError('Text message sender can only contain alpha-numeric characters') + raise ValidationError('Use letters and numbers only') class ServiceBrandingOrg(Form): diff --git a/app/main/views/service_settings.py b/app/main/views/service_settings.py index a49af5924..3f90d2bdf 100644 --- a/app/main/views/service_settings.py +++ b/app/main/views/service_settings.py @@ -34,7 +34,14 @@ from app import user_api_client, current_service, organisations_client @login_required @user_has_permissions('manage_settings', admin_override=True) def service_settings(service_id): - return render_template('views/service-settings.html') + if current_service['organisation']: + organisation = organisations_client.get_organisation(current_service['organisation'])['organisation'] + else: + organisation = None + return render_template( + 'views/service-settings.html', + organisation=organisation + ) @main.route("/services//service-settings/name", methods=['GET', 'POST']) @@ -157,41 +164,6 @@ def service_switch_research_mode(service_id): return redirect(url_for('.service_settings', service_id=service_id)) -@main.route("/services//service-settings/status", methods=['GET', 'POST']) -@login_required -@user_has_permissions('manage_settings', admin_override=True) -def service_status_change(service_id): - if request.method == 'GET': - return render_template( - 'views/service-settings/status.html' - ) - elif request.method == 'POST': - return redirect(url_for('.service_status_change_confirm', service_id=service_id)) - - -@main.route("/services//service-settings/status/confirm", methods=['GET', 'POST']) -@login_required -@user_has_permissions('manage_settings', admin_override=True) -def service_status_change_confirm(service_id): - # Validate password for form - def _check_password(pwd): - return user_api_client.verify_password(current_user.id, pwd) - - form = ConfirmPasswordForm(_check_password) - - if form.validate_on_submit(): - service_api_client.update_service( - current_service['id'], - active=True - ) - return redirect(url_for('.service_settings', service_id=service_id)) - return render_template( - 'views/service-settings/confirm.html', - heading='Turn off all outgoing notifications', - destructive=True, - form=form) - - @main.route("/services//service-settings/delete", methods=['GET', 'POST']) @login_required @user_has_permissions('manage_settings', admin_override=True) @@ -233,12 +205,10 @@ def service_set_reply_to_email(service_id): if request.method == 'GET': form.email_address.data = current_service.get('reply_to_email_address') if form.validate_on_submit(): - message = 'Reply to email set to {}'.format(form.email_address.data) service_api_client.update_service( current_service['id'], reply_to_email_address=form.email_address.data ) - flash(message, 'default_with_tick') return redirect(url_for('.service_settings', service_id=service_id)) return render_template( 'views/service-settings/set-reply-to-email.html', @@ -253,15 +223,10 @@ def service_set_sms_sender(service_id): if request.method == 'GET': form.sms_sender.data = current_service.get('sms_sender') if form.validate_on_submit(): - if form.sms_sender.data: - message = 'Text message sender set to {}'.format(form.sms_sender.data) - else: - message = 'Text message sender removed' service_api_client.update_service( current_service['id'], sms_sender=form.sms_sender.data or None ) - flash(message, 'default_with_tick') return redirect(url_for('.service_settings', service_id=service_id)) return render_template( 'views/service-settings/set-sms-sender.html', diff --git a/app/notify_client/organisations_client.py b/app/notify_client/organisations_client.py index 3d39decf7..21a4ae36e 100644 --- a/app/notify_client/organisations_client.py +++ b/app/notify_client/organisations_client.py @@ -15,5 +15,8 @@ class OrganisationsClient(BaseAPIClient): self.client_id = app.config['ADMIN_CLIENT_USER_NAME'] self.secret = app.config['ADMIN_CLIENT_SECRET'] + def get_organisation(self, id): + return self.get(url='/organisation/{}'.format(id)) + def get_organisations(self): return self.get(url='/organisation')['organisations'] diff --git a/app/templates/components/table.html b/app/templates/components/table.html index 95ba0264f..bf8893592 100644 --- a/app/templates/components/table.html +++ b/app/templates/components/table.html @@ -73,8 +73,8 @@ {% endmacro %} -{% macro text_field(text) -%} - {% call field() %} +{% macro text_field(text, status='') -%} + {% call field(status=status) %} {{ text }} {% endcall %} {%- endmacro %} @@ -85,6 +85,12 @@ {% endcall %} {%- endmacro %} +{% macro edit_field(text, link) -%} + {% call field(align='right') %} + {{ text }} + {% endcall %} +{%- endmacro %} + {% macro boolean_field(yes) -%} {% call field(status='yes' if yes else 'no') %} {{ "Yes" if yes else "No" }} diff --git a/app/templates/views/service-settings.html b/app/templates/views/service-settings.html index ccb2804d7..053e950f5 100644 --- a/app/templates/views/service-settings.html +++ b/app/templates/views/service-settings.html @@ -1,61 +1,99 @@ {% extends "withnav_template.html" %} {% from "components/browse-list.html" import browse_list %} +{% from "components/table.html" import mapping_table, row, text_field, edit_field, field %} {% block page_title %} - Service settings – GOV.UK Notify + Settings – GOV.UK Notify {% endblock %} {% block maincolumn_content %}

Settings

- {{ browse_list([ - { - 'title': 'Change your service name', - 'link': url_for('.service_name_change', service_id=current_service.id) - }, - { - 'title': 'Set email reply to address', - 'link': url_for('.service_set_reply_to_email', service_id=current_service.id) - }, - { - 'title': 'Set email branding', - 'link': url_for('.service_set_branding_and_org', service_id=current_service.id) - } if current_user.has_permissions([], admin_override=True) else {}, - { - 'title': 'Set text message sender name', - 'link': url_for('.service_set_sms_sender', service_id=current_service.id) - }, - { - 'title': 'Request to go live and turn off trial mode', - 'link': url_for('.service_request_to_go_live', service_id=current_service.id), - 'hint': 'A live service can send notifications to any phone number or email address', - } if current_service.restricted else { - }, - { - 'title': 'Temporarily suspend API keys', - 'link': url_for('.service_status_change', service_id=current_service.id), - 'destructive': True - } if not current_service.active else { - 'title': 'Reactivate API keys', - 'link': url_for('.service_status_change', service_id=current_service.id) - }, - { - 'title': 'Make service live', - 'link': url_for('.service_switch_live', service_id=current_service.id) - } if current_service.restricted and current_user.has_permissions([], admin_override=True) else { - 'title': 'Revert service to trial', - 'link': url_for('.service_switch_live', service_id=current_service.id) - } if not current_service.restricted and current_user.has_permissions([], admin_override=True) else { - }, - { - 'title': 'Put service into research mode', - 'link': url_for('.service_switch_research_mode', service_id=current_service.id) - } if not current_service.research_mode and current_user.has_permissions([], admin_override=True) else { - 'title': 'Take service out of research mode', - 'link': url_for('.service_switch_research_mode', service_id=current_service.id) - } if current_service.research_mode and current_user.has_permissions([], admin_override=True) else { - } - ]) }} +
+ + {% call mapping_table( + caption='Settings', + field_headings=['Label', 'Value', 'Action'], + field_headings_visible=False, + caption_visible=False + ) %} + {% call row() %} + {{ text_field('Service name' )}} + {{ text_field(current_service.name) }} + {{ edit_field('Change', url_for('.service_name_change', service_id=current_service.id)) }} + {% endcall %} + {% call row() %} + {{ text_field('Email reply to address')}} + {{ text_field( + current_service.reply_to_email_address, + status='' if current_service.reply_to_email_address else 'default' + ) }} + {{ edit_field('Change', url_for('.service_set_reply_to_email', service_id=current_service.id)) }} + {% endcall %} + {% call row() %} + {{ text_field('Text message sender')}} + {{ text_field(current_service.sms_sender or '40604') }} + {{ edit_field('Change', url_for('.service_set_sms_sender', service_id=current_service.id)) }} + {% endcall %} + {% endcall %} +
+ +
+ +

Your service is in trial mode

+ +
    +
  • you can only send messages to yourself
  • +
  • you can add people to your team, then you can send messages to them too
  • +
  • you can only send 50 messages per day
  • +
+ +

+ To remove these restrictions + request to go live. +

+ +
+ + {% if current_user.has_permissions([], admin_override=True) %} + +

Platform admin settings

+ + {% call mapping_table( + caption='Settings', + field_headings=['Label', 'Value', 'Action'], + field_headings_visible=False, + caption_visible=False + ) %} + {% call row() %} + {{ text_field('Email branding' )}} + {% call field() %} + {% if current_service.branding == 'govuk' %} + GOV.UK + {% elif current_service.branding == 'both' %} + GOV.UK and {{ organisation.name if organisation else None }} + {% elif current_service.branding == 'org' %} + Only {{ organisation.name if organisation else None }} + {% endif %} + {% endcall %} + {{ edit_field('Change', url_for('.service_set_branding_and_org', service_id=current_service.id)) }} + {% endcall %} + {% endcall %} + + + + {% endif %} {% endblock %} diff --git a/app/templates/views/service-settings/name.html b/app/templates/views/service-settings/name.html index 5420b3936..395bf36d9 100644 --- a/app/templates/views/service-settings/name.html +++ b/app/templates/views/service-settings/name.html @@ -10,26 +10,22 @@

Change your service name

-
-
-
-

Users will see your service name:

-
    -
  • at the start of every text message, eg ‘Vehicle tax: we received your payment, thank you’
  • -
  • as your email sender name
  • -
-
- -
- {{ textbox(form.name) }} - {{ page_footer( - 'Save', - back_link=url_for('.service_settings', service_id=current_service.id), - back_link_text='Back to settings' - ) }} -
-
+
+

Users will see your service name:

+
    +
  • at the start of every text message, eg ‘Vehicle tax: we received your payment, thank you’
  • +
  • as your email sender name
  • +
+
+ {{ textbox(form.name) }} + {{ page_footer( + 'Save', + back_link=url_for('.service_settings', service_id=current_service.id), + back_link_text='Back to settings' + ) }} +
+ {% endblock %} diff --git a/app/templates/views/service-settings/set-branding-and-org.html b/app/templates/views/service-settings/set-branding-and-org.html index b49b17a52..34c78da8f 100644 --- a/app/templates/views/service-settings/set-branding-and-org.html +++ b/app/templates/views/service-settings/set-branding-and-org.html @@ -16,7 +16,8 @@ {{ branding_radios(form.organisation, branding_dict=branding_dict) }} {{ page_footer( 'Save', - back_link=url_for('.service_settings', service_id=current_service.id) + back_link=url_for('.service_settings', service_id=current_service.id), + back_link_text='Back to settings' ) }}
diff --git a/app/templates/views/service-settings/set-reply-to-email.html b/app/templates/views/service-settings/set-reply-to-email.html index fcd77c303..1de3cb77d 100644 --- a/app/templates/views/service-settings/set-reply-to-email.html +++ b/app/templates/views/service-settings/set-reply-to-email.html @@ -3,26 +3,40 @@ {% from "components/page-footer.html" import page_footer %} {% block page_title %} - Request to go live – GOV.UK Notify + Email reply to address – GOV.UK Notify {% endblock %} {% block maincolumn_content %} -
-
-

Set email reply to address

-
- {{ textbox( - form.email_address, - width='1-1', - safe_error_message=True - ) }} - {{ page_footer( - 'Save', - back_link=url_for('.service_settings', service_id=current_service.id) - ) }} -
-
-
+

+ Email reply to address +

+

+ Your emails will be sent from + {{ current_service.email_from }}@notifications.service.gov.uk. + This is so they have the best chance of being delivered. + This email address can’t receive replies. +

+

+ Set up a separate email address to receive replies from + your users, then enter it here. +

+ {% if current_service.restricted %} +

+ Your service can’t go live until you’ve done this. +

+ {% endif %} +
+ {{ textbox( + form.email_address, + width='2-3', + safe_error_message=True + ) }} + {{ page_footer( + 'Save', + back_link=url_for('.service_settings', service_id=current_service.id), + back_link_text='Back to settings' + ) }} +
{% endblock %} diff --git a/app/templates/views/service-settings/set-sms-sender.html b/app/templates/views/service-settings/set-sms-sender.html index e9c39a374..3bc58eeb3 100644 --- a/app/templates/views/service-settings/set-sms-sender.html +++ b/app/templates/views/service-settings/set-sms-sender.html @@ -8,21 +8,33 @@ {% block maincolumn_content %} -
-
-

Set text message sender name

-
- {{ textbox( - form.sms_sender, - width='1-1', - safe_error_message=True - ) }} - {{ page_footer( - 'Save', - back_link=url_for('.service_settings', service_id=current_service.id) - ) }} -
-
-
+

Text message sender

+

+ This appears instead of a phone number when a user receives a + text message from your service. +

+ If you leave this blank: +

+
    +
  • + your messages will be sent from 40604 (a shortcode that’s + reserved for government use) +
  • +
  • + each message will begin with ‘{{ current_service.name }}:’ +
  • +
+
+ {{ textbox( + form.sms_sender, + width='1-4', + hint='Up to 11 characters, letters, numbers and spaces only' + ) }} + {{ page_footer( + 'Save', + back_link=url_for('.service_settings', service_id=current_service.id), + back_link_text='Back to settings' + ) }} +
{% endblock %} diff --git a/app/templates/views/service-settings/status.html b/app/templates/views/service-settings/status.html deleted file mode 100644 index d2648a5d7..000000000 --- a/app/templates/views/service-settings/status.html +++ /dev/null @@ -1,38 +0,0 @@ -{% extends "withnav_template.html" %} -{% from "components/page-footer.html" import page_footer %} - -{% block page_title %} - Temporrily suspend API keys – GOV.UK Notify -{% endblock %} - -{% block maincolumn_content %} - -

Temporarily suspend API keys

- -
-
- -

- You’ll still be able to send notifications to yourself by uploading a - CSV file. -

- -

- You can start sending notifications again when you’re ready. -

- -
- {{ page_footer( - 'Suspend API keys', - destructive=True, - back_link=url_for('.service_settings', service_id=current_service.id), - back_link_text='Back to settings' - ) }} -
- -
-
- - - -{% endblock %} diff --git a/tests/app/main/test_validators.py b/tests/app/main/test_validators.py index 5ea1300ca..c1ffa12d7 100644 --- a/tests/app/main/test_validators.py +++ b/tests/app/main/test_validators.py @@ -137,8 +137,8 @@ def test_sms_sender_form_validation(app_, mock_get_user_by_email): form.sms_sender.data = 'morethanelevenchars' form.validate() - assert "Text message sender can't be longer than 11 characters" == form.errors['sms_sender'][0] + assert "Enter fewer than 11 characters" == form.errors['sms_sender'][0] form.sms_sender.data = '###########' form.validate() - assert 'Text message sender can only contain alpha-numeric characters' == form.errors['sms_sender'][0] + assert 'Use letters and numbers only' == form.errors['sms_sender'][0] diff --git a/tests/app/main/views/test_service_settings.py b/tests/app/main/views/test_service_settings.py index 77817e033..08080b599 100644 --- a/tests/app/main/views/test_service_settings.py +++ b/tests/app/main/views/test_service_settings.py @@ -9,19 +9,49 @@ from unittest.mock import ANY, Mock from werkzeug.exceptions import InternalServerError -def test_should_show_overview(app_, - active_user_with_permissions, - mocker, - service_one): - with app_.test_request_context(): - with app_.test_client() as client: - client.login(active_user_with_permissions, mocker, service_one) - response = client.get(url_for( - 'main.service_settings', service_id=service_one['id'])) - assert response.status_code == 200 - resp_data = response.get_data(as_text=True) - assert 'Service settings' in resp_data - app.service_api_client.get_service.assert_called_with(service_one['id']) +def test_should_show_overview( + app_, + active_user_with_permissions, + mocker, + service_one, + mock_get_organisation +): + with app_.test_request_context(), app_.test_client() as client: + client.login(active_user_with_permissions, mocker, service_one) + response = client.get(url_for( + 'main.service_settings', service_id=service_one['id'] + )) + assert response.status_code == 200 + page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + assert page.find('h1').text == 'Settings' + for index, row in enumerate([ + 'Service name service one Change', + 'Email reply to address None Change', + 'Text message sender 40604 Change' + ]): + assert row == " ".join(page.find_all('tr')[index + 1].text.split()) + app.service_api_client.get_service.assert_called_with(service_one['id']) + + +def test_should_show_overview_for_service_with_more_things_set( + app_, + active_user_with_permissions, + mocker, + service_with_reply_to_addresses, + mock_get_organisation +): + with app_.test_request_context(), app_.test_client() as client: + client.login(active_user_with_permissions, mocker, service_with_reply_to_addresses) + response = client.get(url_for( + 'main.service_settings', service_id=service_with_reply_to_addresses['id'] + )) + page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') + for index, row in enumerate([ + 'Service name service one Change', + 'Email reply to address test@example.com Change', + 'Text message sender elevenchars Change' + ]): + assert row == " ".join(page.find_all('tr')[index + 1].text.split()) def test_should_show_service_name(app_, @@ -63,14 +93,17 @@ def test_should_redirect_after_change_service_name(app_, assert mock_get_services.called -def test_switch_service_to_live(app_, - service_one, - mock_login, - mock_get_user, - active_user_with_permissions, - mock_get_service, - mock_update_service, - mock_has_permissions): +def test_switch_service_to_live( + app_, + service_one, + mock_login, + mock_get_user, + active_user_with_permissions, + mock_get_service, + mock_update_service, + mock_has_permissions, + mock_get_organisation +): with app_.test_request_context(): with app_.test_client() as client: client.login(active_user_with_permissions) @@ -87,14 +120,17 @@ def test_switch_service_to_live(app_, ) -def test_switch_service_to_restricted(app_, - service_one, - mock_login, - mock_get_user, - active_user_with_permissions, - mock_get_live_service, - mock_update_service, - mock_has_permissions): +def test_switch_service_to_restricted( + app_, + service_one, + mock_login, + mock_get_user, + active_user_with_permissions, + mock_get_live_service, + mock_update_service, + mock_has_permissions, + mock_get_organisation +): with app_.test_request_context(): with app_.test_client() as client: client.login(active_user_with_permissions) @@ -148,12 +184,15 @@ def test_should_show_service_name_confirmation(app_, app.service_api_client.get_service.assert_called_with(service_one['id']) -def test_should_redirect_after_service_name_confirmation(app_, - active_user_with_permissions, - service_one, - mocker, - mock_update_service, - mock_verify_password): +def test_should_redirect_after_service_name_confirmation( + app_, + active_user_with_permissions, + service_one, + mocker, + mock_update_service, + mock_verify_password, + mock_get_organisation +): with app_.test_request_context(): with app_.test_client() as client: client.login(active_user_with_permissions, mocker, service_one) @@ -222,12 +261,13 @@ def test_should_show_request_to_go_live(app_, def test_should_redirect_after_request_to_go_live( - app_, - api_user_active, - mock_get_user, - mock_get_service, - mock_has_permissions, - mocker + app_, + api_user_active, + mock_get_user, + mock_get_service, + mock_has_permissions, + mock_get_organisation, + mocker ): mock_post = mocker.patch( 'app.main.views.feedback.requests.post', @@ -262,12 +302,12 @@ def test_should_redirect_after_request_to_go_live( def test_log_error_on_request_to_go_live( - app_, - api_user_active, - mock_get_user, - mock_get_service, - mock_has_permissions, - mocker + app_, + api_user_active, + mock_get_user, + mock_get_service, + mock_has_permissions, + mocker ): mock_post = mocker.patch( 'app.main.views.service_settings.requests.post', @@ -293,95 +333,6 @@ def test_log_error_on_request_to_go_live( ) -def test_should_show_status_page(app_, - api_user_active, - mock_get_service, - mock_get_user, - mock_get_user_by_email, - mock_login, - mock_has_permissions, - fake_uuid): - with app_.test_request_context(): - with app_.test_client() as client: - client.login(api_user_active) - service_id = fake_uuid - response = client.get(url_for( - 'main.service_status_change', service_id=service_id)) - - assert response.status_code == 200 - resp_data = response.get_data(as_text=True) - assert 'Suspend API keys' in resp_data - assert mock_get_service.called - - -def test_should_show_redirect_after_status_change(app_, - api_user_active, - mock_get_service, - mock_get_user, - mock_get_user_by_email, - mock_login, - mock_has_permissions, - fake_uuid): - with app_.test_request_context(): - with app_.test_client() as client: - client.login(api_user_active) - service_id = fake_uuid - response = client.post(url_for( - 'main.service_status_change', service_id=service_id)) - - assert response.status_code == 302 - redirect_url = url_for( - 'main.service_status_change_confirm', service_id=service_id, _external=True) - assert redirect_url == response.location - assert mock_get_service.called - - -def test_should_show_status_confirmation(app_, - api_user_active, - mock_get_service, - mock_get_user, - mock_get_user_by_email, - mock_login, - mock_has_permissions, - fake_uuid): - with app_.test_request_context(): - with app_.test_client() as client: - client.login(api_user_active) - service_id = fake_uuid - response = client.get(url_for( - 'main.service_status_change_confirm', service_id=service_id)) - - assert response.status_code == 200 - resp_data = response.get_data(as_text=True) - assert 'Turn off all outgoing notifications' in resp_data - assert mock_get_service.called - - -def test_should_redirect_after_status_confirmation(app_, - api_user_active, - mock_get_service, - mock_update_service, - mock_get_user, - mock_get_user_by_email, - mock_login, - mock_verify_password, - mock_has_permissions, - fake_uuid): - with app_.test_request_context(): - with app_.test_client() as client: - client.login(api_user_active) - service_id = fake_uuid - response = client.post(url_for( - 'main.service_status_change_confirm', service_id=service_id)) - - assert response.status_code == 302 - settings_url = url_for( - 'main.service_settings', service_id=service_id, _external=True) - assert settings_url == response.location - assert mock_get_service.called - assert mock_update_service.called - - def test_should_show_delete_page(app_, api_user_active, mock_login, @@ -468,14 +419,12 @@ def test_should_redirect_delete_confirmation(app_, assert mock_delete_service.called -def test_route_permissions(mocker, app_, api_user_active, service_one): +def test_route_permissions(mocker, app_, api_user_active, service_one, mock_get_organisation): routes = [ 'main.service_settings', 'main.service_name_change', 'main.service_name_change_confirm', 'main.service_request_to_go_live', - 'main.service_status_change', - 'main.service_status_change_confirm', 'main.service_delete', 'main.service_delete_confirm'] with app_.test_request_context(): @@ -491,7 +440,7 @@ def test_route_permissions(mocker, app_, api_user_active, service_one): service_one) -def test_route_invalid_permissions(mocker, app_, api_user_active, service_one): +def test_route_invalid_permissions(mocker, app_, api_user_active, service_one, mock_get_organisation): routes = [ 'main.service_settings', 'main.service_name_change', @@ -499,8 +448,6 @@ def test_route_invalid_permissions(mocker, app_, api_user_active, service_one): 'main.service_request_to_go_live', 'main.service_switch_live', 'main.service_switch_research_mode', - 'main.service_status_change', - 'main.service_status_change_confirm', 'main.service_delete', 'main.service_delete_confirm'] with app_.test_request_context(): @@ -516,14 +463,12 @@ def test_route_invalid_permissions(mocker, app_, api_user_active, service_one): service_one) -def test_route_for_platform_admin(mocker, app_, platform_admin_user, service_one): +def test_route_for_platform_admin(mocker, app_, platform_admin_user, service_one, mock_get_organisation): routes = [ 'main.service_settings', 'main.service_name_change', 'main.service_name_change_confirm', 'main.service_request_to_go_live', - 'main.service_status_change', - 'main.service_status_change_confirm', 'main.service_delete', 'main.service_delete_confirm' ] @@ -557,11 +502,13 @@ def test_route_for_platform_admin_update_service(mocker, app_, platform_admin_us def test_set_reply_to_email_address( - app_, - active_user_with_permissions, - mocker, - mock_update_service, - service_one): + app_, + active_user_with_permissions, + mocker, + mock_update_service, + service_one, + mock_get_organisation +): with app_.test_request_context(): with app_.test_client() as client: client.login(active_user_with_permissions, mocker, service_one) @@ -650,14 +597,16 @@ def test_switch_service_from_research_mode_to_normal( def test_shows_research_mode_indicator( - app_, - service_one, - mock_login, - mock_get_user, - active_user_with_permissions, - mock_get_service, - mock_has_permissions, - mocker): + app_, + service_one, + mock_login, + mock_get_user, + active_user_with_permissions, + mock_get_service, + mock_has_permissions, + mock_get_organisation, + mocker +): with app_.test_request_context(): with app_.test_client() as client: service = service_json( @@ -682,14 +631,16 @@ def test_shows_research_mode_indicator( def test_does_not_show_research_mode_indicator( - app_, - service_one, - mock_login, - mock_get_user, - active_user_with_permissions, - mock_get_service, - mock_has_permissions, - mocker): + app_, + service_one, + mock_login, + mock_get_user, + active_user_with_permissions, + mock_get_service, + mock_has_permissions, + mock_get_organisation, + mocker +): with app_.test_request_context(): with app_.test_client() as client: client.login(active_user_with_permissions) @@ -702,11 +653,13 @@ def test_does_not_show_research_mode_indicator( def test_set_text_message_sender( - app_, - active_user_with_permissions, - mocker, - mock_update_service, - service_one): + app_, + active_user_with_permissions, + mocker, + mock_update_service, + service_one, + mock_get_organisation +): with app_.test_request_context(): with app_.test_client() as client: client.login(active_user_with_permissions, mocker, service_one) @@ -737,34 +690,6 @@ def test_if_sms_sender_set_then_form_populated(app_, assert page.find(id='sms_sender')['value'] == 'elevenchars' -@pytest.mark.parametrize("sender, expected_flash_message", [ - ("elevenchars", 'Text message sender set to elevenchars'), - ('', 'Text message sender removed') -]) -def test_set_text_message_sender_flash_messages( - app_, - active_user_with_permissions, - mocker, - mock_update_service, - service_one, - sender, - expected_flash_message): - with app_.test_request_context(): - with app_.test_client() as client: - client.login(active_user_with_permissions, mocker, service_one) - data = {"sms_sender": sender} - response = client.post(url_for('main.service_set_sms_sender', service_id=service_one['id']), - data=data, - follow_redirects=True) - - assert response.status_code == 200 - - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - element = page.find('div', {"class": "banner-default-with-tick"}) - - assert element.text.strip() == expected_flash_message - - def test_should_show_branding( mocker, app_, platform_admin_user, service_one, mock_get_organisations ): diff --git a/tests/conftest.py b/tests/conftest.py index 6f92be0a9..b86f829c0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -43,6 +43,17 @@ def service_one(api_user_active): return service_json(SERVICE_ONE_ID, 'service one', [api_user_active.id]) +@pytest.fixture(scope='function') +def service_with_reply_to_addresses(api_user_active): + return service_json( + SERVICE_ONE_ID, + 'service one', + [api_user_active.id], + reply_to_email_address='test@example.com', + sms_sender='elevenchars', + ) + + @pytest.fixture(scope='function') def mock_send_sms(request, mocker): return mocker.patch("app.service_api_client.send_sms") @@ -1136,3 +1147,20 @@ def mock_get_organisations(mocker): return mocker.patch( 'app.organisations_client.get_organisations', side_effect=_get_organisations ) + + +@pytest.fixture(scope='function') +def mock_get_organisation(mocker): + def _get_organisation(id): + return { + 'organisation': { + 'logo': 'example.png', + 'name': 'Organisation name', + 'id': 'organisation-id', + 'colour': '#f00' + } + } + + return mocker.patch( + 'app.organisations_client.get_organisation', side_effect=_get_organisation + )