mirror of
https://github.com/GSA/notifications-api.git
synced 2026-08-23 15:56:45 -04:00
@@ -93,6 +93,7 @@ from app.models import (
|
||||
from app.notifications.process_notifications import persist_notification, send_notification_to_queue
|
||||
from app.schema_validation import validate
|
||||
from app.service import statistics
|
||||
from app.service.send_pdf_letter_schema import send_pdf_letter_request
|
||||
from app.service.service_data_retention_schema import (
|
||||
add_service_data_retention_request,
|
||||
update_service_data_retention_request
|
||||
@@ -650,7 +651,8 @@ def create_one_off_notification(service_id):
|
||||
|
||||
@service_blueprint.route('/<uuid:service_id>/send-pdf-letter', methods=['POST'])
|
||||
def create_pdf_letter(service_id):
|
||||
resp = send_pdf_letter_notification(service_id, request.get_json())
|
||||
data = validate(request.get_json(), send_pdf_letter_request)
|
||||
resp = send_pdf_letter_notification(service_id, data)
|
||||
return jsonify(resp), 201
|
||||
|
||||
|
||||
|
||||
@@ -167,7 +167,6 @@ def send_pdf_letter_notification(service_id, post_data):
|
||||
'address_line_1': post_data['filename']
|
||||
}
|
||||
|
||||
# TODO: stop hard-coding postage as 'second' once we get postage from the admin
|
||||
notification = persist_notification(
|
||||
notification_id=post_data['file_id'],
|
||||
template_id=template.id,
|
||||
@@ -183,7 +182,7 @@ def send_pdf_letter_notification(service_id, post_data):
|
||||
client_reference=post_data['filename'],
|
||||
created_by_id=post_data['created_by'],
|
||||
billable_units=billable_units,
|
||||
postage='second',
|
||||
postage=post_data['postage'],
|
||||
)
|
||||
|
||||
upload_filename = get_letter_pdf_filename(
|
||||
|
||||
13
app/service/send_pdf_letter_schema.py
Normal file
13
app/service/send_pdf_letter_schema.py
Normal file
@@ -0,0 +1,13 @@
|
||||
send_pdf_letter_request = {
|
||||
"$schema": "http://json-schema.org/draft-04/schema#",
|
||||
"description": "POST send uploaded pdf letter",
|
||||
"type": "object",
|
||||
"title": "Send an uploaded pdf letter",
|
||||
"properties": {
|
||||
"postage": {"type": "string", "format": "postage"},
|
||||
"filename": {"type": "string"},
|
||||
"created_by": {"type": "string"},
|
||||
"file_id": {"type": "string"},
|
||||
},
|
||||
"required": ["postage", "filename", "created_by", "file_id"]
|
||||
}
|
||||
@@ -2282,7 +2282,8 @@ def test_create_pdf_letter(mocker, sample_service_full_permissions, client, fake
|
||||
data = json.dumps({
|
||||
'filename': 'valid.pdf',
|
||||
'created_by': str(user.id),
|
||||
'file_id': fake_uuid
|
||||
'file_id': fake_uuid,
|
||||
'postage': 'second'
|
||||
})
|
||||
|
||||
response = client.post(
|
||||
@@ -2296,6 +2297,37 @@ def test_create_pdf_letter(mocker, sample_service_full_permissions, client, fake
|
||||
assert json_resp == {'id': fake_uuid}
|
||||
|
||||
|
||||
@pytest.mark.parametrize('post_data, expected_errors', [
|
||||
(
|
||||
{},
|
||||
[
|
||||
{'error': 'ValidationError', 'message': 'postage is a required property'},
|
||||
{'error': 'ValidationError', 'message': 'filename is a required property'},
|
||||
{'error': 'ValidationError', 'message': 'created_by is a required property'},
|
||||
{'error': 'ValidationError', 'message': 'file_id is a required property'}
|
||||
]
|
||||
),
|
||||
(
|
||||
{"postage": "third", "filename": "string", "created_by": "string", "file_id": "string"},
|
||||
[
|
||||
{'error': 'ValidationError', 'message': 'postage invalid. It must be either first or second.'}
|
||||
]
|
||||
)
|
||||
])
|
||||
def test_create_pdf_letter_validates_against_json_schema(
|
||||
sample_service_full_permissions, client, post_data, expected_errors
|
||||
):
|
||||
response = client.post(
|
||||
url_for('service.create_pdf_letter', service_id=sample_service_full_permissions.id),
|
||||
data=json.dumps(post_data),
|
||||
headers=[('Content-Type', 'application/json'), create_authorization_header()]
|
||||
)
|
||||
json_resp = json.loads(response.get_data(as_text=True))
|
||||
|
||||
assert response.status_code == 400
|
||||
assert json_resp['errors'] == expected_errors
|
||||
|
||||
|
||||
def test_get_notification_for_service_includes_template_redacted(admin_request, sample_notification):
|
||||
resp = admin_request.get(
|
||||
'service.get_notification_for_service',
|
||||
|
||||
@@ -22,7 +22,7 @@ def test_send_pdf_letter_notification_raises_error_if_service_does_not_have_perm
|
||||
permissions,
|
||||
):
|
||||
service = create_service(service_permissions=permissions)
|
||||
post_data = {'filename': 'valid.pdf', 'created_by': fake_uuid, 'file_id': fake_uuid}
|
||||
post_data = {'filename': 'valid.pdf', 'created_by': fake_uuid, 'file_id': fake_uuid, 'postage': 'first'}
|
||||
|
||||
with pytest.raises(BadRequestError):
|
||||
send_pdf_letter_notification(service.id, post_data)
|
||||
@@ -36,7 +36,7 @@ def test_send_pdf_letter_notification_raises_error_if_service_is_over_daily_mess
|
||||
mocker.patch(
|
||||
'app.service.send_notification.check_service_over_daily_message_limit',
|
||||
side_effect=TooManyRequestsError(10))
|
||||
post_data = {'filename': 'valid.pdf', 'created_by': fake_uuid, 'file_id': fake_uuid}
|
||||
post_data = {'filename': 'valid.pdf', 'created_by': fake_uuid, 'file_id': fake_uuid, 'postage': 'first'}
|
||||
|
||||
with pytest.raises(TooManyRequestsError):
|
||||
send_pdf_letter_notification(sample_service_full_permissions.id, post_data)
|
||||
@@ -45,7 +45,7 @@ def test_send_pdf_letter_notification_raises_error_if_service_is_over_daily_mess
|
||||
def test_send_pdf_letter_notification_validates_created_by(
|
||||
sample_service_full_permissions, fake_uuid, sample_user
|
||||
):
|
||||
post_data = {'filename': 'valid.pdf', 'created_by': sample_user.id, 'file_id': fake_uuid}
|
||||
post_data = {'filename': 'valid.pdf', 'created_by': sample_user.id, 'file_id': fake_uuid, 'postage': 'first'}
|
||||
|
||||
with pytest.raises(BadRequestError):
|
||||
send_pdf_letter_notification(sample_service_full_permissions.id, post_data)
|
||||
@@ -72,7 +72,7 @@ def test_send_pdf_letter_notification_raises_error_when_pdf_is_not_in_transient_
|
||||
notify_user,
|
||||
):
|
||||
user = sample_service_full_permissions.users[0]
|
||||
post_data = {'filename': 'valid.pdf', 'created_by': user.id, 'file_id': fake_uuid}
|
||||
post_data = {'filename': 'valid.pdf', 'created_by': user.id, 'file_id': fake_uuid, 'postage': 'first'}
|
||||
mocker.patch('app.service.send_notification.utils_s3download', side_effect=S3ObjectNotFound({}, ''))
|
||||
|
||||
with pytest.raises(S3ObjectNotFound):
|
||||
@@ -88,7 +88,7 @@ def test_send_pdf_letter_notification_creates_notification_and_moves_letter(
|
||||
user = sample_service_full_permissions.users[0]
|
||||
filename = 'valid.pdf'
|
||||
file_id = uuid.uuid4()
|
||||
post_data = {'filename': filename, 'created_by': user.id, 'file_id': file_id}
|
||||
post_data = {'filename': filename, 'created_by': user.id, 'file_id': file_id, 'postage': 'second'}
|
||||
|
||||
mocker.patch('app.service.send_notification.utils_s3download')
|
||||
mocker.patch('app.service.send_notification.get_page_count', return_value=1)
|
||||
|
||||
Reference in New Issue
Block a user