Update the get_notification_by_id to return a sensible message if the id is not a valid UUID.

Previously "Result not found" would be returned when the id is not a valid uuid, which does not make sense.
Now the message says "notification_id is not a valid UUID", this should be a clearer message for the client service.
This commit is contained in:
Rebecca Law
2018-04-03 16:37:41 +01:00
parent c392053847
commit ecc4cde4de
3 changed files with 25 additions and 19 deletions

View File

@@ -1,23 +1,17 @@
import uuid
from flask import jsonify, request, url_for, current_app from flask import jsonify, request, url_for, current_app
from werkzeug.exceptions import abort
from app import api_user, authenticated_service from app import api_user, authenticated_service
from app.dao import notifications_dao from app.dao import notifications_dao
from app.schema_validation import validate from app.schema_validation import validate
from app.v2.notifications import v2_notification_blueprint from app.v2.notifications import v2_notification_blueprint
from app.v2.notifications.notification_schemas import get_notifications_request from app.v2.notifications.notification_schemas import get_notifications_request, notification_by_id
@v2_notification_blueprint.route("/<id>", methods=['GET']) @v2_notification_blueprint.route("/<notification_id>", methods=['GET'])
def get_notification_by_id(id): def get_notification_by_id(notification_id):
try: _data = {"notification_id": notification_id}
casted_id = uuid.UUID(id) validate(_data, notification_by_id)
except (ValueError, AttributeError):
abort(404)
notification = notifications_dao.get_notification_with_personalisation( notification = notifications_dao.get_notification_with_personalisation(
authenticated_service.id, casted_id, key_type=None authenticated_service.id, notification_id, key_type=None
) )
return jsonify(notification.serialize()), 200 return jsonify(notification.serialize()), 200

View File

@@ -20,6 +20,18 @@ template = {
"required": ["id", "version", "uri"] "required": ["id", "version", "uri"]
} }
notification_by_id = {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "GET notification response schema",
"type": "object",
"title": "response v2/notification",
"properties": {
"notification_id": uuid
},
"required": ["notification_id"]
}
get_notification_response = { get_notification_response = {
"$schema": "http://json-schema.org/draft-04/schema#", "$schema": "http://json-schema.org/draft-04/schema#",
"description": "GET notification response schema", "description": "GET notification response schema",

View File

@@ -210,15 +210,15 @@ def test_get_notification_by_id_invalid_id(client, sample_notification, id):
path='/v2/notifications/{}'.format(id), path='/v2/notifications/{}'.format(id),
headers=[('Content-Type', 'application/json'), auth_header]) headers=[('Content-Type', 'application/json'), auth_header])
assert response.status_code == 404 assert response.status_code == 400
assert response.headers['Content-type'] == 'application/json' assert response.headers['Content-type'] == 'application/json'
json_response = json.loads(response.get_data(as_text=True)) json_response = json.loads(response.get_data(as_text=True))
assert json_response == { assert json_response == {"errors": [
"message": "The requested URL was not found on the server. " {"error": "ValidationError",
"If you entered the URL manually please check your spelling and try again.", "message": "notification_id is not a valid UUID"
"result": "error" }],
} "status_code": 400}
@pytest.mark.parametrize('created_at_month, estimated_delivery', [ @pytest.mark.parametrize('created_at_month, estimated_delivery', [
@@ -628,7 +628,7 @@ def test_get_notifications_renames_letter_statuses(client, sample_letter_templat
) )
auth_header = create_authorization_header(service_id=letter_noti.service_id) auth_header = create_authorization_header(service_id=letter_noti.service_id)
response = client.get( response = client.get(
path=url_for('v2_notifications.get_notification_by_id', id=letter_noti.id), path=url_for('v2_notifications.get_notification_by_id', notification_id=letter_noti.id),
headers=[('Content-Type', 'application/json'), auth_header] headers=[('Content-Type', 'application/json'), auth_header]
) )