Projet

Général

Profil

0001-base_adresse-use-job-to-fetch-data-at-create-and-edi.patch

Valentin Deniaud, 13 janvier 2021 10:58

Télécharger (4,72 ko)

Voir les différences:

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(-)
passerelle/apps/base_adresse/models.py
458 458
        )
459 459
        old_addresses.delete()
460 460

  
461
    def save(self, *args, **kwargs):
462
        created = bool(not self.pk)
463
        super().save(*args, **kwargs)
464
        if created:
465
            self.add_job('update_api_geo_data')
466
        if self.get_zipcodes() and not self.get_streets_queryset().exists():
467
            self.add_job('update_streets_data')
468

  
461 469
    def hourly(self):
462 470
        super(BaseAdresse, self).hourly()
463 471
        self.clean_addresses_cache()
464
        # don't wait for daily job to grab data
465
        if self.get_zipcodes() and not self.get_streets_queryset().exists():
466
            self.update_streets_data()
467
        if not CityModel.objects.exists():
468
            self.update_api_geo_data()
469 472

  
470 473
    def daily(self):
471 474
        super(BaseAdresse, self).daily()
tests/test_base_adresse.py
372 372

  
373 373
@pytest.mark.usefixtures('mock_update_api_geo')
374 374
@mock.patch('passerelle.utils.Request.get')
375
def test_base_adresse_command_hourly_update(mocked_get, db, base_adresse):
375
def test_base_adresse_command_job_update(mocked_get, db, base_adresse):
376 376
    base_adresse.update_api_geo_data = lambda: None
377 377
    filepath = os.path.join(os.path.dirname(__file__), 'data', 'update_streets_test.gz')
378 378
    with open(filepath, 'rb') as ban_file:
379 379
        mocked_get.return_value = utils.FakedResponse(content=ban_file.read(), status_code=200)
380
    # check the first hourly job downloads streets
381
    call_command('cron', 'hourly')
380
    # check the job added at save() downloads streets
381
    base_adresse.jobs()
382 382
    mocked_get.assert_called_once_with('https://adresse.data.gouv.fr/data/ban/adresses/latest/addok/adresses-addok-73.ndjson.gz')
383 383
    assert StreetModel.objects.all().count() == 3
384
    # check a second call doesn't download anything
385
    call_command('cron', 'hourly')
384

  
385
    # second save doesn't download anything
386
    base_adresse.save()
387
    base_adresse.jobs()
386 388
    assert mocked_get.call_count == 1
387 389

  
390
    # but changing zipcode does
391
    base_adresse.zipcode = '74'
392
    base_adresse.save()
393
    base_adresse.jobs()
394
    assert mocked_get.call_count == 2
395

  
388 396

  
389 397
@pytest.mark.usefixtures('mock_update_api_geo')
390 398
@mock.patch('passerelle.utils.Request.get')
......
649 657

  
650 658
@pytest.mark.usefixtures('mock_update_streets')
651 659
@mock.patch('passerelle.utils.Request.get')
652
def test_base_adresse_command_hourly_update_geo(mocked_get, db, base_adresse):
660
def test_base_adresse_command_job_update_geo(mocked_get, db, base_adresse):
653 661
    return_values = [utils.FakedResponse(content=content, status_code=200)
654 662
                     for content in (FAKE_API_GEO_REGIONS, FAKE_API_GEO_DEPARTMENTS, FAKE_API_GEO)]
655 663
    mocked_get.side_effect = return_values
656
    # check the first hourly job downloads data
657
    call_command('cron', 'hourly')
664
    # check the job added at save() downloads data
665
    base_adresse.jobs()
658 666
    assert mocked_get.call_count == 3
659 667
    assert CityModel.objects.count() == 3
660
    # check a second call doesn't download anything
661
    call_command('cron', 'hourly')
668
    # second save doesn't download anything
669
    base_adresse.save()
670
    base_adresse.jobs()
662 671
    assert mocked_get.call_count == 3
663 672

  
664 673

  
tests/test_jobs.py
18 18

  
19 19
@mock.patch('passerelle.utils.Request.get')
20 20
def test_jobs(mocked_get, app, base_adresse, freezer):
21
    Job.objects.all().delete()  # remove jobs automatically added at connector creation
21 22
    filepath = os.path.join(os.path.dirname(__file__), 'data', 'update_streets_test.gz')
22 23
    with open(filepath, 'rb') as ban_file:
23 24
        mocked_get.return_value = utils.FakedResponse(content=ban_file.read(), status_code=200)
24
-