From 7cf903431a2b0e979b8e4c142602e9669fb2b1a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laur=C3=A9line=20Gu=C3=A9rin?= Date: Mon, 25 Jul 2022 14:34:16 +0200 Subject: [PATCH] base_adresse: fix cron with not found region (#67629) --- passerelle/apps/base_adresse/models.py | 2 ++ tests/test_base_adresse.py | 33 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/passerelle/apps/base_adresse/models.py b/passerelle/apps/base_adresse/models.py index 65b54323..6caf53fe 100644 --- a/passerelle/apps/base_adresse/models.py +++ b/passerelle/apps/base_adresse/models.py @@ -543,6 +543,8 @@ class BaseAdresse(AddressResource): if not data: return None region = get_region(data['codeRegion']) + if not region: + return None departement, created = self.departmentmodel_set.get_or_create( code=data['code'], defaults={'name': data['nom'], 'region': region} ) diff --git a/tests/test_base_adresse.py b/tests/test_base_adresse.py index 43b5c563..ec14fb3e 100644 --- a/tests/test_base_adresse.py +++ b/tests/test_base_adresse.py @@ -817,6 +817,39 @@ def test_base_adresse_command_update_geo_invalid(mocked_get, db, base_adresse): assert not RegionModel.objects.exists() +@pytest.mark.usefixtures('mock_update_streets') +@mock.patch('passerelle.utils.Request.get') +def test_base_adresse_command_update_geo_region_not_found(mocked_get, db, base_adresse): + new_fake_api_geo_regions = json.dumps([json.loads(FAKE_API_GEO_REGIONS)[1]]) + return_values = [ + tests.utils.FakedResponse(content=content, status_code=200) + for content in ( + new_fake_api_geo_regions, # first call, get regions + FAKE_API_GEO_DEPARTMENTS, # then, get departments + FAKE_API_GEO, # and get communes + ) + ] + [ + # region code 11 not found, try to get it again + tests.utils.FakedResponse(content='not-json', status_code=200), + tests.utils.FakedResponse(content='not-json', status_code=200), + tests.utils.FakedResponse(content='not-json', status_code=200), + ] + mocked_get.side_effect = return_values + call_command('cron', 'daily') + assert mocked_get.call_args_list == [ + mock.call('https://geo.api.gouv.fr/regions'), + mock.call('https://geo.api.gouv.fr/departements'), + mock.call('https://geo.api.gouv.fr/communes'), + mock.call('https://geo.api.gouv.fr/regions/11'), + mock.call('https://geo.api.gouv.fr/regions/11'), + mock.call('https://geo.api.gouv.fr/regions/11'), + ] + assert RegionModel.objects.count() == 1 + assert RegionModel.objects.get().code == '27' + assert DepartmentModel.objects.count() == 1 + assert DepartmentModel.objects.get().code == '58' + + @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):