toulouse_smart: trigger wcs when intervention is created async (#57669)

This commit is contained in:
Nicolas Roche 2021-10-11 15:45:39 +02:00
parent 340cf3d8b0
commit 155775498c
2 changed files with 94 additions and 36 deletions

View File

@ -246,6 +246,22 @@ class ToulouseSmartResource(BaseResource, HTTPResource):
wcs_request = self.wcs_requests.get(pk=kwargs['pk'])
if not wcs_request.push():
raise SkipJob()
payload = {
'creation_response': {
'wcs_form_api_url': wcs_request.wcs_form_api_url,
'wcs_form_number': wcs_request.wcs_form_number,
'uuid': str(wcs_request.uuid),
'payload': wcs_request.payload,
'result': wcs_request.result,
'status': wcs_request.status,
}
}
smart_request = wcs_request.smart_requests.create(payload=payload)
self.add_job(
'update_intervention_job',
id=smart_request.id,
natural_id='smart-request-%s' % smart_request.id,
)
@atomic
@endpoint(

View File

@ -348,42 +348,6 @@ def test_create_intervention(mocked_uuid4, app, smart):
assert wcs_request.status == 'sent'
@mock_response(
['/v1/type-intervention', None, INTERVENTION_TYPES],
['/v1/intervention', CREATE_INTERVENTION_QUERY, get_json_file('create_intervention')],
)
@mock.patch("django.db.models.fields.UUIDField.get_default", return_value=UUID)
def test_create_intervention_async(mocked_uuid4, app, smart):
mocked_push = mock.patch(
"passerelle.contrib.toulouse_smart.models.WcsRequest.push",
return_value=False,
)
mocked_push.start()
assert Job.objects.count() == 0
resp = app.post_json(URL + 'create-intervention/', params=CREATE_INTERVENTION_PAYLOAD)
assert str(UUID) in CREATE_INTERVENTION_QUERY['notificationUrl']
assert not resp.json['err']
assert resp.json['data']['uuid'] == str(UUID)
assert resp.json['data']['wcs_form_api_url'] == 'https://wcs.example.com/api/forms/foo/2/'
wcs_request = smart.wcs_requests.get(uuid=UUID)
assert wcs_request.wcs_form_api_url == 'https://wcs.example.com/api/forms/foo/2/'
assert wcs_request.wcs_form_number == '42-2'
assert wcs_request.payload == CREATE_INTERVENTION_QUERY
assert wcs_request.status == 'registered'
mocked_push.stop()
assert Job.objects.count() == 1
job = Job.objects.get(method_name='create_intervention_job')
assert job.status == 'registered'
smart.jobs()
job = Job.objects.get(method_name='create_intervention_job')
assert job.status == 'completed'
wcs_request = smart.wcs_requests.get(uuid=UUID)
assert wcs_request.result == json.loads(get_json_file('create_intervention'))
assert wcs_request.status == 'sent'
def test_create_intervention_wrong_payload(app, smart):
payload = deepcopy(CREATE_INTERVENTION_PAYLOAD)
del payload['extra']['slug']
@ -688,3 +652,81 @@ def test_update_intervention_job_transport_error(mocked_uuid, app, freezer, smar
assert job.update_timestamp > job.creation_timestamp
smart_request = smart.wcs_requests.get(uuid=UUID).smart_requests.get()
assert smart_request.result == None
UPDATE_INTERVENTION_QUERY_ON_ASYNC_CREATION = {
'creation_response': {
'wcs_form_api_url': CREATE_INTERVENTION_PAYLOAD_EXTRA['form_api_url'],
'wcs_form_number': CREATE_INTERVENTION_PAYLOAD_EXTRA['external_number'],
'uuid': str(UUID),
'payload': CREATE_INTERVENTION_QUERY,
'result': json.loads(get_json_file('create_intervention')),
'status': 'sent',
}
}
@mock_response(
['/v1/type-intervention', None, INTERVENTION_TYPES],
['/v1/intervention', CREATE_INTERVENTION_QUERY, get_json_file('create_intervention')],
[
'/api/forms/foo/2/hooks/update_intervention/',
UPDATE_INTERVENTION_QUERY_ON_ASYNC_CREATION,
WCS_RESPONSE_SUCCESS,
],
)
@mock.patch("django.db.models.fields.UUIDField.get_default", return_value=UUID)
def test_create_intervention_async(mocked_uuid4, app, smart, wcs_service):
smart_id = json.loads(get_json_file('create_intervention'))['id']
mocked_wcs_request_push = mock.patch(
"passerelle.contrib.toulouse_smart.models.WcsRequest.push",
return_value=False,
)
mocked_smart_request_push = mock.patch(
"passerelle.contrib.toulouse_smart.models.SmartRequest.push",
return_value=False,
)
# smart and wcs are down
mocked_wcs_request_push.start()
mocked_smart_request_push.start()
assert Job.objects.count() == 0
resp = app.post_json(URL + 'create-intervention/', params=CREATE_INTERVENTION_PAYLOAD)
assert str(UUID) in CREATE_INTERVENTION_QUERY['notificationUrl']
assert not resp.json['err']
assert resp.json['data']['uuid'] == str(UUID)
assert resp.json['data']['wcs_form_api_url'] == 'https://wcs.example.com/api/forms/foo/2/'
wcs_request = smart.wcs_requests.get(uuid=UUID)
assert wcs_request.wcs_form_api_url == 'https://wcs.example.com/api/forms/foo/2/'
assert wcs_request.wcs_form_number == '42-2'
assert wcs_request.payload == CREATE_INTERVENTION_QUERY
assert wcs_request.status == 'registered'
assert Job.objects.count() == 1
job = Job.objects.get(method_name='create_intervention_job')
assert job.status == 'registered'
# smart is up
mocked_wcs_request_push.stop()
smart.jobs()
assert Job.objects.count() == 2
job = Job.objects.get(method_name='create_intervention_job')
assert job.status == 'completed'
wcs_request = smart.wcs_requests.get(uuid=UUID)
assert wcs_request.result['id'] == smart_id
assert wcs_request.status == 'sent'
job = Job.objects.get(method_name='update_intervention_job')
assert job.status == 'registered'
# wcs is up
mocked_smart_request_push.stop()
smart.jobs()
job = Job.objects.get(method_name='update_intervention_job')
assert job.status == 'completed'
smart_request = wcs_request.smart_requests.get()
assert smart_request.payload['creation_response']['uuid'] == str(UUID)
assert smart_request.payload['creation_response']['result']['id'] == smart_id