2019-09-21 11:06:39 +02:00
|
|
|
import datetime
|
2019-02-13 12:24:06 +01:00
|
|
|
import os
|
2022-03-17 15:42:52 +01:00
|
|
|
from unittest import mock
|
2019-02-13 12:24:06 +01:00
|
|
|
|
2021-01-14 15:00:15 +01:00
|
|
|
import isodate
|
2019-02-13 12:24:06 +01:00
|
|
|
import pytest
|
2021-01-14 15:00:15 +01:00
|
|
|
from django.core.management import call_command
|
2022-07-25 13:42:48 +02:00
|
|
|
from django.core.management.base import CommandError
|
2019-02-13 12:24:06 +01:00
|
|
|
|
2022-03-18 09:46:37 +01:00
|
|
|
import tests.utils
|
2019-09-17 14:24:23 +02:00
|
|
|
from passerelle.base.models import Job, ResourceLog, SkipJob
|
2021-08-24 18:20:53 +02:00
|
|
|
from passerelle.utils.jsonresponse import APIError
|
2022-03-17 15:42:52 +01:00
|
|
|
from tests.test_base_adresse import BaseAdresse, StreetModel
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def base_adresse(db):
|
|
|
|
return tests.utils.setup_access_rights(BaseAdresse.objects.create(slug='base-adresse', zipcode='73'))
|
2019-02-13 12:24:06 +01:00
|
|
|
|
|
|
|
|
|
|
|
@mock.patch('passerelle.utils.Request.get')
|
2019-09-21 11:06:39 +02:00
|
|
|
def test_jobs(mocked_get, app, base_adresse, freezer):
|
2021-01-13 10:41:16 +01:00
|
|
|
Job.objects.all().delete() # remove jobs automatically added at connector creation
|
2020-04-28 10:47:25 +02:00
|
|
|
filepath = os.path.join(os.path.dirname(__file__), 'data', 'update_streets_test.gz')
|
|
|
|
with open(filepath, 'rb') as ban_file:
|
2022-03-18 09:46:37 +01:00
|
|
|
mocked_get.return_value = tests.utils.FakedResponse(content=ban_file.read(), status_code=200)
|
2019-02-13 12:24:06 +01:00
|
|
|
|
2019-10-08 11:11:57 +02:00
|
|
|
freezer.move_to('2019-01-01 00:00:00')
|
2019-02-13 12:24:06 +01:00
|
|
|
job = base_adresse.add_job('update_streets_data')
|
|
|
|
assert job.status == 'registered'
|
|
|
|
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'completed'
|
|
|
|
assert StreetModel.objects.count() == 3
|
|
|
|
|
2019-10-08 11:11:57 +02:00
|
|
|
# don't delete streets if bano file is empty
|
2022-03-18 09:46:37 +01:00
|
|
|
mocked_get.return_value = tests.utils.FakedResponse(content=b'', status_code=200)
|
2019-10-08 11:11:57 +02:00
|
|
|
freezer.move_to('2019-01-01 12:00:00')
|
|
|
|
job = base_adresse.add_job('update_streets_data')
|
|
|
|
assert job.status == 'registered'
|
|
|
|
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'failed'
|
|
|
|
assert Job.objects.get(id=job.id).status_details == {'error_summary': 'Exception: bano file is empty'}
|
|
|
|
assert ResourceLog.objects.all().count() == 1
|
|
|
|
assert ResourceLog.objects.all()[0].message == (
|
|
|
|
'error running update_streets_data job (bano file is empty)'
|
|
|
|
)
|
|
|
|
assert StreetModel.objects.count() == 3
|
|
|
|
|
2020-04-28 10:47:25 +02:00
|
|
|
with open(filepath, 'rb') as ban_file:
|
2022-03-18 09:46:37 +01:00
|
|
|
mocked_get.return_value = tests.utils.FakedResponse(content=ban_file.read(), status_code=200)
|
2019-10-08 11:11:57 +02:00
|
|
|
|
2019-02-13 12:24:06 +01:00
|
|
|
StreetModel.objects.all().delete()
|
|
|
|
|
2019-09-17 14:24:23 +02:00
|
|
|
ResourceLog.objects.all().delete()
|
2019-02-13 12:24:06 +01:00
|
|
|
job = base_adresse.add_job('update_streets_data')
|
|
|
|
mocked_get.side_effect = Exception('hello')
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'failed'
|
|
|
|
assert Job.objects.get(id=job.id).status_details == {'error_summary': 'Exception: hello'}
|
2019-09-17 14:24:23 +02:00
|
|
|
assert ResourceLog.objects.all().count() == 1
|
|
|
|
assert ResourceLog.objects.all()[0].message == 'error running update_streets_data job (hello)'
|
2019-02-13 12:24:06 +01:00
|
|
|
|
|
|
|
job = base_adresse.add_job('update_streets_data')
|
|
|
|
mocked_get.side_effect = SkipJob()
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'registered'
|
2019-09-17 14:59:39 +02:00
|
|
|
|
2019-09-21 11:06:39 +02:00
|
|
|
# use after_timestamp with SkipJob
|
|
|
|
freezer.move_to('2019-01-01 00:00:00')
|
2019-11-19 12:14:22 +01:00
|
|
|
mocked_get.side_effect = SkipJob(after_timestamp=isodate.parse_datetime('2019-01-02T00:00:00+00:00'))
|
2019-09-21 11:06:39 +02:00
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'registered'
|
|
|
|
mocked_get.side_effect = None
|
|
|
|
freezer.move_to('2019-01-01 12:00:00')
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'registered'
|
|
|
|
freezer.move_to('2019-01-02 01:00:00')
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'completed'
|
|
|
|
|
|
|
|
# use after_timestamp with SkipJob and seconds
|
|
|
|
job = base_adresse.add_job('update_streets_data')
|
|
|
|
freezer.move_to('2019-01-01 00:00:00')
|
|
|
|
mocked_get.side_effect = SkipJob(after_timestamp=3600)
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'registered'
|
|
|
|
mocked_get.side_effect = None
|
|
|
|
freezer.move_to('2019-01-01 00:30:00')
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'registered'
|
|
|
|
freezer.move_to('2019-01-01 01:01:00')
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'completed'
|
|
|
|
|
|
|
|
# use after_timestamp with SkipJob and timedelta
|
|
|
|
job = base_adresse.add_job('update_streets_data')
|
|
|
|
freezer.move_to('2019-01-01 00:00:00')
|
|
|
|
mocked_get.side_effect = SkipJob(after_timestamp=datetime.timedelta(seconds=3600))
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'registered'
|
|
|
|
mocked_get.side_effect = None
|
|
|
|
freezer.move_to('2019-01-01 00:30:00')
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'registered'
|
|
|
|
freezer.move_to('2019-01-01 01:01:00')
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'completed'
|
|
|
|
|
|
|
|
# use after_timestamp with add_job
|
|
|
|
freezer.move_to('2019-01-01 00:00:00')
|
2019-11-19 12:14:22 +01:00
|
|
|
job = base_adresse.add_job(
|
|
|
|
'update_streets_data', after_timestamp=isodate.parse_datetime('2019-01-02T00:00:00+00:00')
|
2021-02-20 16:26:01 +01:00
|
|
|
)
|
2019-09-21 11:06:39 +02:00
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'registered'
|
|
|
|
freezer.move_to('2019-01-02 01:00:00')
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'completed'
|
|
|
|
|
|
|
|
# use after_timestamp with add_job and seconds
|
|
|
|
freezer.move_to('2019-01-01 00:00:00')
|
|
|
|
job = base_adresse.add_job('update_streets_data', after_timestamp=3600)
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'registered'
|
|
|
|
freezer.move_to('2019-01-01 01:01:00')
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'completed'
|
|
|
|
|
|
|
|
# use after_timestamp with add_job and seconds
|
|
|
|
freezer.move_to('2019-01-01 00:00:00')
|
|
|
|
job = base_adresse.add_job('update_streets_data', after_timestamp=datetime.timedelta(seconds=3600))
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'registered'
|
|
|
|
freezer.move_to('2019-01-01 01:01:00')
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'completed'
|
|
|
|
|
2019-09-17 14:59:39 +02:00
|
|
|
# don't run jobs if connector is down
|
|
|
|
StreetModel.objects.all().delete()
|
|
|
|
with mock.patch('passerelle.apps.base_adresse.models.BaseAdresse.down') as down:
|
|
|
|
down.side_effect = lambda: True
|
2020-04-28 10:47:25 +02:00
|
|
|
with open(filepath, 'rb') as ban_file:
|
2022-03-18 09:46:37 +01:00
|
|
|
mocked_get.return_value = tests.utils.FakedResponse(content=ban_file.read(), status_code=200)
|
2019-09-17 14:59:39 +02:00
|
|
|
job = base_adresse.add_job('update_streets_data')
|
|
|
|
assert job.status == 'registered'
|
|
|
|
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'registered'
|
2021-01-14 15:00:15 +01:00
|
|
|
|
|
|
|
|
|
|
|
@mock.patch('passerelle.utils.Request.get')
|
|
|
|
def test_runjob(mocked_get, app, base_adresse, freezer):
|
|
|
|
filepath = os.path.join(os.path.dirname(__file__), 'data', 'update_streets_test.gz')
|
|
|
|
with open(filepath, 'rb') as ban_file:
|
2022-03-18 09:46:37 +01:00
|
|
|
mocked_get.return_value = tests.utils.FakedResponse(content=ban_file.read(), status_code=200)
|
2021-01-14 15:00:15 +01:00
|
|
|
|
|
|
|
freezer.move_to('2019-01-01 00:00:00')
|
|
|
|
job = base_adresse.add_job('update_streets_data')
|
|
|
|
assert job.status == 'registered'
|
|
|
|
|
|
|
|
call_command('runjob', '--job-id=%s' % job.pk)
|
|
|
|
assert Job.objects.get(id=job.id).status == 'completed'
|
|
|
|
assert StreetModel.objects.count() == 3
|
2021-08-24 18:20:53 +02:00
|
|
|
|
2022-07-25 13:42:48 +02:00
|
|
|
with pytest.raises(CommandError) as e:
|
|
|
|
call_command('runjob', '--job-id=%s' % job.pk)
|
|
|
|
assert 'cannot run job, status is completed' in str(e.value)
|
|
|
|
|
|
|
|
date = datetime.date(year=2019, month=1, day=2)
|
|
|
|
job = base_adresse.add_job('update_streets_data', after_timestamp=date)
|
|
|
|
|
|
|
|
with pytest.raises(CommandError) as e:
|
|
|
|
call_command('runjob', '--job-id=%s' % job.pk)
|
|
|
|
assert 'cannot run job, should be run after 2019-01-02 00:00:00+00:00' in str(e.value)
|
|
|
|
|
2021-08-24 18:20:53 +02:00
|
|
|
|
|
|
|
@mock.patch('passerelle.utils.Request.get')
|
|
|
|
def test_jobs_api_error_log_level(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:
|
2022-03-18 09:46:37 +01:00
|
|
|
mocked_get.return_value = tests.utils.FakedResponse(content=ban_file.read(), status_code=200)
|
2021-08-24 18:20:53 +02:00
|
|
|
|
|
|
|
job = base_adresse.add_job('update_streets_data')
|
|
|
|
mocked_get.side_effect = Exception('hello')
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'failed'
|
|
|
|
assert ResourceLog.objects.all().count() == 1
|
|
|
|
assert ResourceLog.objects.all()[0].level == 'error'
|
|
|
|
|
|
|
|
job = base_adresse.add_job('update_streets_data')
|
|
|
|
mocked_get.side_effect = APIError('hello')
|
|
|
|
base_adresse.jobs()
|
|
|
|
assert Job.objects.get(id=job.id).status == 'failed'
|
|
|
|
assert ResourceLog.objects.all().count() == 2
|
|
|
|
assert ResourceLog.objects.all()[1].level == 'warning'
|