base_adresse: return 200 on connection error (#52006)

This commit is contained in:
Nicolas Roche 2021-03-23 10:20:30 +01:00
parent 5e68865fdd
commit 12440ac62b
2 changed files with 46 additions and 8 deletions

View File

@ -2,6 +2,7 @@ import datetime
import gzip
from requests import RequestException
from requests.exceptions import ConnectionError
from django.contrib.postgres.fields import JSONField
from django.db import connection, models
@ -147,11 +148,11 @@ class BaseAdresse(BaseResource):
query = urlencode(query_args)
url = urlparse.urlunparse((scheme, netloc, path, params, query, fragment))
result_response = self.requests.get(url)
try:
result_response = self.requests.get(url)
result_response.raise_for_status()
except RequestException as e:
raise APIError('Bad response code from API: %s' % e)
raise APIError('failed to get %s: %s' % (url, e))
result = []
@ -211,11 +212,11 @@ class BaseAdresse(BaseResource):
query = urlencode({'lat': lat, 'lon': lon})
url = urlparse.urlunparse((scheme, netloc, path, params, query, fragment))
result_response = self.requests.get(url)
try:
result_response = self.requests.get(url)
result_response.raise_for_status()
except RequestException as e:
raise APIError('Bad response code from API: %s' % e)
raise APIError('failed to get %s: %s' % (url, e))
result = None
for feature in result_response.json().get('features'):
@ -403,11 +404,14 @@ class BaseAdresse(BaseResource):
departments.add(zipcode[:2])
for department in departments:
ban_gz = self.requests.get(
'https://adresse.data.gouv.fr/data/ban/adresses/latest/addok/adresses-addok-{}.ndjson.gz'.format(
department
try:
ban_gz = self.requests.get(
'https://adresse.data.gouv.fr/data/ban/adresses/latest/addok/adresses-addok-{}.ndjson.gz'.format(
department
)
)
)
except RequestException as e:
continue
if ban_gz.status_code != 200:
continue

View File

@ -247,6 +247,19 @@ def test_base_adresse_search_api_error(mocked_get, app, base_adresse):
assert resp.json['err'] == 1
@mock.patch('passerelle.utils.Request.get')
def test_base_adresse_search_api_timeout(mocked_get, app, base_adresse):
mocked_get.side_effect = ConnectionError('Remote end closed connection without response')
resp = app.get('/base-adresse/%s/search' % base_adresse.slug, params={'q': 'plop'})
assert resp.status_code == 200
assert resp.json['err'] == 1
assert (
resp.json['err_desc']
== 'failed to get https://api-adresse.data.gouv.fr/search/?q=plop&limit=1: Remote end closed connection without response'
)
def test_base_adresse_reverse(app, base_adresse, mock_api_adresse_data_gouv_fr_reverse):
resp = app.get('/base-adresse/%s/reverse?lon=-0.593775&lat=47.474633' % base_adresse.slug)
data = resp.json
@ -293,6 +306,19 @@ def test_base_adresse_reverse_path(mocked_get, app, base_adresse):
assert mocked_get.call_args[0][0].startswith('http://example.net/path/reverse/?')
@mock.patch('passerelle.utils.Request.get')
def test_base_adresse_reverse_api_timeout(mocked_get, app, base_adresse):
mocked_get.side_effect = ConnectionError('Remote end closed connection without response')
resp = app.get('/base-adresse/%s/reverse?lon=-0.593775&lat=47.474633' % base_adresse.slug)
assert resp.status_code == 200
assert resp.json['err'] == 1
assert (
resp.json['err_desc']
== 'failed to get https://api-adresse.data.gouv.fr/reverse/?lat=47.474633&lon=-0.593775: Remote end closed connection without response'
)
def test_base_adresse_streets_unaccent(app, base_adresse, street):
resp = app.get('/base-adresse/%s/streets?q=une rue tres acc' % base_adresse.slug)
data = json.loads(resp.text)
@ -745,6 +771,14 @@ def test_base_adresse_command_update_geo_invalid(mocked_get, db, base_adresse):
assert not RegionModel.objects.exists()
@pytest.mark.usefixtures('mock_update_api_geo')
@mock.patch('passerelle.utils.Request.get', side_effect=ConnectionError)
def test_base_adresse_command_update_street_timeout(mocked_get, db, base_adresse):
resp = call_command('cron', 'daily')
assert mocked_get.call_count == 1
assert not RegionModel.objects.exists()
@pytest.mark.usefixtures('mock_update_streets')
@mock.patch('passerelle.utils.Request.get', side_effect=ConnectionError)
def test_base_adresse_command_update_geo_no_connection(mocked_get, db, base_adresse):