import uuid import pytest from flask import json from jsonschema import ValidationError from app.v2.notifications.notification_schemas import post_sms_request, post_sms_response from app.schema_validation import validate valid_json = {"phone_number": "07515111111", "template_id": str(uuid.uuid4()) } valid_json_with_optionals = { "phone_number": "07515111111", "template_id": str(uuid.uuid4()), "reference": "reference from caller", "personalisation": {"key": "value"} } @pytest.mark.parametrize("input", [valid_json, valid_json_with_optionals]) def test_post_sms_schema_is_valid(input): validate(input, post_sms_request) def test_post_sms_json_schema_bad_uuid_and_missing_phone_number(): j = {"template_id": "notUUID"} with pytest.raises(ValidationError) as e: validate(j, post_sms_request) error = json.loads(e.value.message) assert "POST v2/notifications/sms" in error['message'] assert len(error.get('fields')) == 2 assert {"phone_number": "is a required property"} in error['fields'] assert {"template_id": "not a valid UUID"} in error['fields'] assert error.get('status_code') == 400 def test_post_sms_schema_with_personalisation_that_is_not_a_dict(): j = { "phone_number": "07515111111", "template_id": str(uuid.uuid4()), "reference": "reference from caller", "personalisation": "not_a_dict" } with pytest.raises(ValidationError) as e: validate(j, post_sms_request) error = json.loads(e.value.message) assert "POST v2/notifications/sms" in error['message'] assert len(error.get('fields')) == 1 assert error['fields'][0] == {"personalisation": "should contain key value pairs"} assert error.get('status_code') == 400 valid_response = { "id": str(uuid.uuid4()), "content": {"body": "contents of message", "from_number": "46045"}, "uri": "/v2/notifications/id", "template": {"id": str(uuid.uuid4()), "version": 1, "uri": "/v2/template/id"} } valid_response_with_optionals = { "id": str(uuid.uuid4()), "reference": "reference_from_service", "content": {"body": "contents of message", "from_number": "46045"}, "uri": "/v2/notifications/id", "template": {"id": str(uuid.uuid4()), "version": 1, "uri": "/v2/template/id"} } @pytest.mark.parametrize('input', [valid_response]) def test_post_sms_response_schema_is_valid(input): validate(input, post_sms_response) def test_post_sms_response_schema_missing_uri(): j = valid_response del j["uri"] with pytest.raises(ValidationError) as e: validate(j, post_sms_response) error = json.loads(e.value.message) assert error['status_code'] == 400 assert 'Validation error occurred - response v2/notifications/sms' == error['message'] assert [{"uri": "is a required property"}] == error['fields']