From 0a63031e3bb3d2853c3e0d79addfc39a2433b852 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Wed, 13 Jan 2021 10:41:16 +0100 Subject: [PATCH] base_adresse: use job to fetch data at create and edit (#50087) --- passerelle/apps/base_adresse/models.py | 13 +++++++----- tests/test_base_adresse.py | 29 +++++++++++++++++--------- tests/test_jobs.py | 1 + 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/passerelle/apps/base_adresse/models.py b/passerelle/apps/base_adresse/models.py index 0cf9b0e1..e4ff5bb1 100644 --- a/passerelle/apps/base_adresse/models.py +++ b/passerelle/apps/base_adresse/models.py @@ -458,14 +458,17 @@ class BaseAdresse(BaseResource): ) old_addresses.delete() + def save(self, *args, **kwargs): + created = bool(not self.pk) + super().save(*args, **kwargs) + if created: + self.add_job('update_api_geo_data') + if self.get_zipcodes() and not self.get_streets_queryset().exists(): + self.add_job('update_streets_data') + def hourly(self): super(BaseAdresse, self).hourly() self.clean_addresses_cache() - # don't wait for daily job to grab data - if self.get_zipcodes() and not self.get_streets_queryset().exists(): - self.update_streets_data() - if not CityModel.objects.exists(): - self.update_api_geo_data() def daily(self): super(BaseAdresse, self).daily() diff --git a/tests/test_base_adresse.py b/tests/test_base_adresse.py index 95c72287..c438a736 100644 --- a/tests/test_base_adresse.py +++ b/tests/test_base_adresse.py @@ -372,19 +372,27 @@ def test_base_adresse_command_update(mocked_get, db, base_adresse): @pytest.mark.usefixtures('mock_update_api_geo') @mock.patch('passerelle.utils.Request.get') -def test_base_adresse_command_hourly_update(mocked_get, db, base_adresse): +def test_base_adresse_command_job_update(mocked_get, db, base_adresse): base_adresse.update_api_geo_data = lambda: None filepath = os.path.join(os.path.dirname(__file__), 'data', 'update_streets_test.gz') with open(filepath, 'rb') as ban_file: mocked_get.return_value = utils.FakedResponse(content=ban_file.read(), status_code=200) - # check the first hourly job downloads streets - call_command('cron', 'hourly') + # check the job added at save() downloads streets + base_adresse.jobs() mocked_get.assert_called_once_with('https://adresse.data.gouv.fr/data/ban/adresses/latest/addok/adresses-addok-73.ndjson.gz') assert StreetModel.objects.all().count() == 3 - # check a second call doesn't download anything - call_command('cron', 'hourly') + + # second save doesn't download anything + base_adresse.save() + base_adresse.jobs() assert mocked_get.call_count == 1 + # but changing zipcode does + base_adresse.zipcode = '74' + base_adresse.save() + base_adresse.jobs() + assert mocked_get.call_count == 2 + @pytest.mark.usefixtures('mock_update_api_geo') @mock.patch('passerelle.utils.Request.get') @@ -649,16 +657,17 @@ def test_base_adresse_command_update_geo_delete(mocked_get, db, base_adresse): @pytest.mark.usefixtures('mock_update_streets') @mock.patch('passerelle.utils.Request.get') -def test_base_adresse_command_hourly_update_geo(mocked_get, db, base_adresse): +def test_base_adresse_command_job_update_geo(mocked_get, db, base_adresse): return_values = [utils.FakedResponse(content=content, status_code=200) for content in (FAKE_API_GEO_REGIONS, FAKE_API_GEO_DEPARTMENTS, FAKE_API_GEO)] mocked_get.side_effect = return_values - # check the first hourly job downloads data - call_command('cron', 'hourly') + # check the job added at save() downloads data + base_adresse.jobs() assert mocked_get.call_count == 3 assert CityModel.objects.count() == 3 - # check a second call doesn't download anything - call_command('cron', 'hourly') + # second save doesn't download anything + base_adresse.save() + base_adresse.jobs() assert mocked_get.call_count == 3 diff --git a/tests/test_jobs.py b/tests/test_jobs.py index 0cbbe92d..805ad9fc 100644 --- a/tests/test_jobs.py +++ b/tests/test_jobs.py @@ -18,6 +18,7 @@ from test_base_adresse import base_adresse, StreetModel @mock.patch('passerelle.utils.Request.get') def test_jobs(mocked_get, app, base_adresse, freezer): + Job.objects.all().delete() # remove jobs automatically added at connector creation filepath = os.path.join(os.path.dirname(__file__), 'data', 'update_streets_test.gz') with open(filepath, 'rb') as ban_file: mocked_get.return_value = utils.FakedResponse(content=ban_file.read(), status_code=200) -- 2.20.1