mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-25 00:33:58 -04:00
display errors on the end page.
The following errors may happen: * Number outside of service if service in trial mode * Message too long for sms * Service over daily limit We need to handle these. They only return on send, rather than in a separate validation step (for now).
This commit is contained in:
@@ -19,6 +19,7 @@ from flask import (
|
|||||||
|
|
||||||
from flask_login import login_required, current_user
|
from flask_login import login_required, current_user
|
||||||
|
|
||||||
|
from notifications_python_client.errors import HTTPError
|
||||||
from notifications_utils.columns import Columns
|
from notifications_utils.columns import Columns
|
||||||
from notifications_utils.recipients import (
|
from notifications_utils.recipients import (
|
||||||
RecipientCSV,
|
RecipientCSV,
|
||||||
@@ -280,7 +281,7 @@ def send_test_step(service_id, template_id, step_index):
|
|||||||
|
|
||||||
back_link = get_back_link(service_id, template_id, step_index)
|
back_link = get_back_link(service_id, template_id, step_index)
|
||||||
|
|
||||||
template.values = get_receipient_and_placeholders_from_session(template.template_type)
|
template.values = get_recipient_and_placeholders_from_session(template.template_type)
|
||||||
template.values[current_placeholder] = None
|
template.values[current_placeholder] = None
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@@ -530,7 +531,7 @@ def get_normalised_placeholders_from_session():
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_receipient_and_placeholders_from_session(template_type):
|
def get_recipient_and_placeholders_from_session(template_type):
|
||||||
placeholders = get_normalised_placeholders_from_session()
|
placeholders = get_normalised_placeholders_from_session()
|
||||||
|
|
||||||
if template_type == 'sms':
|
if template_type == 'sms':
|
||||||
@@ -601,6 +602,10 @@ def get_back_link(service_id, template_id, step_index):
|
|||||||
@login_required
|
@login_required
|
||||||
@user_has_permissions('manage_templates')
|
@user_has_permissions('manage_templates')
|
||||||
def check_notification(service_id, template_id):
|
def check_notification(service_id, template_id):
|
||||||
|
return _check_notification(service_id, template_id)
|
||||||
|
|
||||||
|
|
||||||
|
def _check_notification(service_id, template_id, exception=None):
|
||||||
db_template = service_api_client.get_service_template(service_id, template_id)['data']
|
db_template = service_api_client.get_service_template(service_id, template_id)['data']
|
||||||
|
|
||||||
template = get_template(
|
template = get_template(
|
||||||
@@ -621,16 +626,29 @@ def check_notification(service_id, template_id):
|
|||||||
):
|
):
|
||||||
return redirect(back_link)
|
return redirect(back_link)
|
||||||
|
|
||||||
template.values = get_receipient_and_placeholders_from_session(template.template_type)
|
template.values = get_recipient_and_placeholders_from_session(template.template_type)
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
'views/notifications/check.html',
|
'views/notifications/check.html',
|
||||||
template=template,
|
template=template,
|
||||||
back_link=back_link,
|
back_link=back_link,
|
||||||
help=get_help_argument(),
|
help=get_help_argument(),
|
||||||
|
|
||||||
|
**(get_template_error_dict(exception) if exception else {})
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def get_template_error_dict(exception):
|
||||||
|
if 'service is in trial mode' in exception.message:
|
||||||
|
error = 'not-allowed-to-send-to'
|
||||||
|
else:
|
||||||
|
raise exception
|
||||||
|
|
||||||
|
return {
|
||||||
|
'error': error,
|
||||||
|
'SMS_CHAR_COUNT_LIMIT': 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@main.route("/services/<service_id>/template/<template_id>/notification/check", methods=['POST'])
|
@main.route("/services/<service_id>/template/<template_id>/notification/check", methods=['POST'])
|
||||||
@login_required
|
@login_required
|
||||||
@user_has_permissions('manage_templates')
|
@user_has_permissions('manage_templates')
|
||||||
@@ -642,12 +660,15 @@ def send_notification(service_id, template_id):
|
|||||||
template_id=template_id,
|
template_id=template_id,
|
||||||
))
|
))
|
||||||
|
|
||||||
noti = notification_api_client.send_notification(
|
try:
|
||||||
service_id,
|
noti = notification_api_client.send_notification(
|
||||||
template_id=template_id,
|
service_id,
|
||||||
recipient=session['recipient'],
|
template_id=template_id,
|
||||||
personalisation=session['placeholders']
|
recipient=session['recipient'],
|
||||||
)
|
personalisation=session['placeholders']
|
||||||
|
)
|
||||||
|
except HTTPError as exception:
|
||||||
|
return _check_notification(service_id, template_id, exception)
|
||||||
|
|
||||||
session.pop('placeholders')
|
session.pop('placeholders')
|
||||||
session.pop('recipient')
|
session.pop('recipient')
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import uuid
|
import uuid
|
||||||
|
from unittest.mock import Mock
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from os import path
|
from os import path
|
||||||
from glob import glob
|
from glob import glob
|
||||||
@@ -9,6 +10,7 @@ from functools import partial
|
|||||||
import pytest
|
import pytest
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
from flask import url_for
|
from flask import url_for
|
||||||
|
from notifications_python_client.errors import HTTPError
|
||||||
from notifications_utils.template import LetterPreviewTemplate, LetterImageTemplate
|
from notifications_utils.template import LetterPreviewTemplate, LetterImageTemplate
|
||||||
from notifications_utils.recipients import RecipientCSV
|
from notifications_utils.recipients import RecipientCSV
|
||||||
|
|
||||||
@@ -1726,3 +1728,32 @@ def test_send_notification_redirects_to_view_page(
|
|||||||
notification_id=fake_uuid,
|
notification_id=fake_uuid,
|
||||||
_external=True
|
_external=True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_send_notification_shows_error_if_400(
|
||||||
|
client_request,
|
||||||
|
service_one,
|
||||||
|
fake_uuid,
|
||||||
|
mocker,
|
||||||
|
mock_get_service_template
|
||||||
|
):
|
||||||
|
trial_mode_msg = (
|
||||||
|
'Can’t send to this recipient when service is in trial mode – '
|
||||||
|
'see https://www.notifications.service.gov.uk/trial-mode'
|
||||||
|
)
|
||||||
|
mocker.patch(
|
||||||
|
'app.notification_api_client.send_notification',
|
||||||
|
side_effect=HTTPError(response=Mock(status_code=400), message=trial_mode_msg)
|
||||||
|
)
|
||||||
|
with client_request.session_transaction() as session:
|
||||||
|
session['recipient'] = '07700900001'
|
||||||
|
session['placeholders'] = {'a': 'b'}
|
||||||
|
|
||||||
|
page = client_request.post(
|
||||||
|
'main.send_notification',
|
||||||
|
service_id=service_one['id'],
|
||||||
|
template_id=fake_uuid,
|
||||||
|
_expected_status=200
|
||||||
|
)
|
||||||
|
|
||||||
|
assert ' '.join(page.h1.text.split()) == 'You can’t send to this phone number'
|
||||||
|
|||||||
Reference in New Issue
Block a user