New endpoint to send a list of job ids to a queue.

The task will be picked up by the FTP app. Given the list of job ids the tasks will get all the files from s3, aggregate them then send to dvla
This commit is contained in:
Rebecca Law
2017-04-06 12:14:17 +01:00
parent 29c84d73ff
commit 970a4e7b4e
7 changed files with 106 additions and 0 deletions

View File

@@ -93,6 +93,7 @@ def register_blueprint(application):
from app.notifications.notifications_ses_callback import ses_callback_blueprint
from app.notifications.notifications_sms_callback import sms_callback_blueprint
from app.authentication.auth import requires_admin_auth, requires_auth, requires_no_auth
from app.letters.send_letter_jobs import letter_job
service_blueprint.before_request(requires_admin_auth)
application.register_blueprint(service_blueprint, url_prefix='/service')
@@ -145,6 +146,9 @@ def register_blueprint(application):
organisation_blueprint.before_request(requires_admin_auth)
application.register_blueprint(organisation_blueprint, url_prefix='/organisation')
letter_job.before_request(requires_admin_auth)
application.register_blueprint(letter_job)
def register_v2_blueprints(application):
from app.v2.notifications.post_notifications import v2_notification_blueprint as post_notifications

0
app/letters/__init__.py Normal file
View File

View File

@@ -0,0 +1,15 @@
from app.schema_validation.definitions import uuid
letter_job_ids = {
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "list of job ids",
"type": "object",
"title": "job_ids",
"properties": {
"job_ids": {"type": "array",
"items": uuid,
"minItems": 1
},
},
"required": ["job_ids"]
}

View File

@@ -0,0 +1,18 @@
from flask import Blueprint
from flask import request
from app import notify_celery
from app.v2.errors import register_errors
from app.letters.letter_schemas import letter_job_ids
from app.schema_validation import validate
letter_job = Blueprint("letter-job", __name__)
register_errors(letter_job)
@letter_job.route('/send-letter-jobs', methods=['POST'])
def send_letter_jobs():
job_ids = validate(request.get_json(), letter_job_ids)
notify_celery.send_task(name="send_files_to_dvla", args=(job_ids['job_ids'],), queue="process-ftp")
return "Task created to send files to DVLA"

View File

View File

@@ -0,0 +1,30 @@
import json
import uuid
import pytest
from jsonschema import ValidationError
from app.letters.letter_schemas import letter_job_ids
from app.schema_validation import validate
def test_letter_job_id_retuns_400_if_array_is_empty():
with pytest.raises(ValidationError) as e:
validate({"job_ids": []}, letter_job_ids)
error = json.loads(str(e.value))
assert len(error.keys()) == 2
assert error.get('errors')[0]['message'] == 'job_ids [] is too short'
def test_letter_job_id_retuns_400_if_array_doesnot_contain_uuids():
with pytest.raises(ValidationError) as e:
validate({"job_ids": ["1", "2"]}, letter_job_ids)
error = json.loads(str(e.value))
assert len(error.keys()) == 2
assert error.get('errors')[0]['message'] == 'job_ids is not a valid UUID'
def test_letter_job():
ids_ = {"job_ids": [str(uuid.uuid4()), str(uuid.uuid4())]}
j = validate(ids_, letter_job_ids)
assert j == ids_

View File

@@ -0,0 +1,39 @@
import uuid
from flask import json
from tests import create_authorization_header
def test_send_letter_jobs(client, mocker):
mock_celery = mocker.patch("app.letters.send_letter_jobs.notify_celery.send_task")
job_ids = {"job_ids": [str(uuid.uuid4()), str(uuid.uuid4()), str(uuid.uuid4())]}
auth_header = create_authorization_header()
response = client.post(
path='/send-letter-jobs',
data=json.dumps(job_ids),
headers=[('Content-Type', 'application/json'), auth_header])
assert response.status_code == 200
assert response.get_data(as_text=True) == "Task created to send files to DVLA"
mock_celery.assert_called_once_with(name="send_files_to_dvla", args=(job_ids['job_ids'],), queue="process-ftp")
def test_send_letter_jobs_throws_validation_error(client, mocker):
mock_celery = mocker.patch("app.letters.send_letter_jobs.notify_celery.send_task")
job_ids = {"job_ids": ["1", "2"]}
auth_header = create_authorization_header()
response = client.post(
path='/send-letter-jobs',
data=json.dumps(job_ids),
headers=[('Content-Type', 'application/json'), auth_header])
assert response.status_code == 400
assert not mock_celery.called