esabora: return error content in response (#71368)
gitea-wip/passerelle/pipeline/pr-main This commit looks good Details
gitea-wip/passerelle/pipeline/pr-wip/71638-franceconnec-data-add-dgfip-api-url-field This commit looks good Details

This commit is contained in:
Agate 2022-11-17 10:14:25 +01:00
parent cd46dc8d97
commit 56b6baea78
2 changed files with 51 additions and 7 deletions

View File

@ -72,7 +72,7 @@ class Esabora(BaseResource, HTTPResource):
url = urllib.parse.urljoin(self.service_url, path) url = urllib.parse.urljoin(self.service_url, path)
headers = {'Authorization': f'Bearer {self.api_key}'} headers = {'Authorization': f'Bearer {self.api_key}'}
try: try:
return self.requests.post(url, json=payload, headers=headers, timeout=5, **kwargs) response = self.requests.post(url, json=payload, headers=headers, timeout=5, **kwargs)
except requests.RequestException as e: except requests.RequestException as e:
raise APIError( raise APIError(
'Esabora platform "%s" connection error: %s' % (self.service_url, exception_to_text(e)), 'Esabora platform "%s" connection error: %s' % (self.service_url, exception_to_text(e)),
@ -83,6 +83,26 @@ class Esabora(BaseResource, HTTPResource):
'error': str(e), 'error': str(e),
}, },
) )
try:
data = response.json()
except requests.JSONDecodeError as e:
raise APIError(
'Esabora platform "%s" invalid JSON response: %s' % (self.service_url, exception_to_text(e)),
log_error=True,
data={
'status_code': response.status_code,
},
)
if not response.ok:
raise APIError(
'Esabora platform "%s" answered with HTTP error' % (self.service_url),
log_error=True,
data={
'status_code': response.status_code,
'content': data,
},
)
return data
@endpoint( @endpoint(
name='do-search', name='do-search',
@ -100,9 +120,7 @@ class Esabora(BaseResource, HTTPResource):
for name, value in post_data['criterions'].items() for name, value in post_data['criterions'].items()
], ],
} }
response = self.post('mult/', payload, params={'task': 'doSearch'}) data = self.post('mult/', payload, params={'task': 'doSearch'})
response.raise_for_status()
data = response.json()
columns = {slugify(c).replace('-', '_'): c for c in data['columnList']} columns = {slugify(c).replace('-', '_'): c for c in data['columnList']}
keys = {slugify(c).replace('-', '_'): c for c in data['keyList']} keys = {slugify(c).replace('-', '_'): c for c in data['keyList']}
cleaned_data = { cleaned_data = {
@ -130,9 +148,7 @@ class Esabora(BaseResource, HTTPResource):
endpoint = post_data.pop('endpoint', None) or 'modbdd' endpoint = post_data.pop('endpoint', None) or 'modbdd'
payload = get_treatment_payload(post_data) payload = get_treatment_payload(post_data)
response = self.post(f'{endpoint}/', payload, params={'task': 'doTreatment'}) data = self.post(f'{endpoint}/', payload, params={'task': 'doTreatment'})
response.raise_for_status()
data = response.json()
keys = [slugify(c).replace('-', '_') for c in data['keyList']] keys = [slugify(c).replace('-', '_') for c in data['keyList']]
cleaned_data = esabora_row_to_object([], keys, data) cleaned_data = esabora_row_to_object([], keys, data)
cleaned_data['action'] = data['action'] cleaned_data['action'] = data['action']

View File

@ -245,3 +245,31 @@ def test_do_treatment_arbitrary_endpoint(app, connector):
assert responses.calls[0].request.params['task'] == 'doTreatment' assert responses.calls[0].request.params['task'] == 'doTreatment'
response_data = json.loads(responses.calls[0].request.body) response_data = json.loads(responses.calls[0].request.body)
assert response_data == expected_payload assert response_data == expected_payload
@responses.activate
def test_post_raises_proper_error(app, connector):
url = tests.utils.generic_endpoint_url('esabora', 'do-treatment')
responses.add(
responses.POST,
f'{connector.service_url}addevt/',
json={'foo': 'bar'},
status=400,
)
payload = {
'endpoint': 'addevt',
'treatment_name': 'Import Event',
'Adresse_Latitude': 12.3,
'Adresse_Ville': 'Marseille',
}
expected_response = {
'err': 1,
'err_class': 'passerelle.utils.jsonresponse.APIError',
'data': {'content': {'foo': 'bar'}, 'status_code': 400},
'err_desc': 'Esabora platform "http://example.esabora/ws/rest/" answered with HTTP error',
}
response = app.post_json(url, params=payload)
assert response.json == expected_response