Skip to content

Commit 550743f

Browse files
authored
fix: missing validatorVersion from GTFS validation report (#1142)
1 parent 90511e3 commit 550743f

File tree

2 files changed

+122
-5
lines changed

2 files changed

+122
-5
lines changed

functions-python/process_validation_report/src/main.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,9 @@ def parse_json_report(json_report):
108108
try:
109109
dt = json_report["summary"]["validatedAt"]
110110
validated_at = datetime.fromisoformat(dt.replace("Z", "+00:00"))
111-
version = json_report["summary"]["validatorVersion"]
111+
version = None
112+
if "validatorVersion" in json_report["summary"]:
113+
version = json_report["summary"]["validatorVersion"]
112114
logging.info(
113115
f"Validation report validated at {validated_at} with version {version}."
114116
)
@@ -141,9 +143,11 @@ def generate_report_entities(
141143
json_report_url = (
142144
f"{FILES_ENDPOINT}/{feed_stable_id}/{dataset_stable_id}/report_{version}.json"
143145
)
144-
if get_validation_report(report_id, session): # Check if report already exists
146+
# Check if report already exists
147+
# If exists, the function should graceful finish avoiding retry mechanism to trigger again
148+
if get_validation_report(report_id, session):
145149
logging.warning(f"Validation report {report_id} already exists. Terminating.")
146-
raise Exception(f"Validation report {report_id} already exists.")
150+
return []
147151

148152
validation_report_entity = Validationreport(
149153
id=report_id,
@@ -248,15 +252,16 @@ def create_validation_report_entities(
248252
return json_report, code
249253

250254
try:
251-
validated_at, version = parse_json_report(json_report)
255+
validated_at, version_from_json = parse_json_report(json_report)
252256
except Exception as error:
253257
return str(error), 500
254258

255259
try:
256260
# Generate the database entities required for the report
257261
# If an error is thrown we should let the retry mechanism to do its work
258262
entities = generate_report_entities(
259-
version,
263+
# default to the version parameter
264+
version_from_json if version_from_json else version,
260265
validated_at,
261266
json_report,
262267
dataset_stable_id,

functions-python/process_validation_report/tests/test_validation_report.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,3 +329,115 @@ def test_compute_validation_report_counters(self, db_session):
329329
self.assertEqual(validation_report.unique_info_count, 1)
330330
self.assertEqual(validation_report.unique_warning_count, 1)
331331
self.assertEqual(validation_report.unique_error_count, 2)
332+
333+
@mock.patch("requests.get")
334+
@with_db_session(db_url=default_db_url)
335+
def test_create_validation_report_entities_missing_validator_version(
336+
self, mock_get, db_session
337+
):
338+
"""Test create_validation_report_entities function
339+
when the validator version is missing from the JSON report."""
340+
mock_get.return_value = MagicMock(
341+
status_code=200,
342+
json=lambda: {
343+
"summary": {
344+
"validatedAt": "2021-01-01T00:00:00Z",
345+
"gtfsFeatures": ["stops", "routes"],
346+
},
347+
"notices": [
348+
{"code": "notice_code", "severity": "ERROR", "totalNotices": 1}
349+
],
350+
},
351+
)
352+
feed_stable_id = faker.word()
353+
dataset_stable_id = faker.word()
354+
355+
# Create GTFS Feed
356+
feed = Gtfsfeed(id=faker.word(), data_type="gtfs", stable_id=feed_stable_id)
357+
# Create a new dataset
358+
dataset = Gtfsdataset(
359+
id=faker.word(), feed_id=feed.id, stable_id=dataset_stable_id, latest=True
360+
)
361+
try:
362+
db_session.add(feed)
363+
db_session.add(dataset)
364+
db_session.commit()
365+
create_validation_report_entities(feed_stable_id, dataset_stable_id, "1.0")
366+
367+
# Validate that the validation report was created
368+
validation_report = (
369+
db_session.query(Validationreport)
370+
.filter(Validationreport.id == f"{dataset_stable_id}_1.0")
371+
.one_or_none()
372+
)
373+
self.assertIsNotNone(validation_report)
374+
except Exception as e:
375+
raise e
376+
finally:
377+
db_session.rollback()
378+
db_session.close()
379+
380+
@mock.patch("requests.get")
381+
@with_db_session(db_url=default_db_url)
382+
def test_create_validation_report_entities_validation_report_exists(
383+
self, mock_get, db_session
384+
):
385+
"""Test create_validation_report_entities function
386+
when the validation report already exists."""
387+
version = "1.0"
388+
mock_get.return_value = MagicMock(
389+
status_code=200,
390+
json=lambda: {
391+
"summary": {
392+
"validatedAt": "2021-01-01T00:00:00Z",
393+
"gtfsFeatures": ["stops", "routes"],
394+
"validatorVersion": version,
395+
},
396+
"notices": [
397+
{"code": "notice_code", "severity": "ERROR", "totalNotices": 1}
398+
],
399+
},
400+
)
401+
feed_stable_id = faker.word()
402+
dataset_stable_id = faker.word()
403+
report_id = f"{dataset_stable_id}_{version}"
404+
# Create GTFS Feed
405+
feed = Gtfsfeed(id=faker.word(), data_type="gtfs", stable_id=feed_stable_id)
406+
# Create a new dataset
407+
dataset = Gtfsdataset(
408+
id=faker.word(),
409+
feed_id=feed.id,
410+
stable_id=dataset_stable_id,
411+
latest=True,
412+
validation_reports=[
413+
Validationreport(
414+
id=report_id, validator_version="1.0", notices=[], features=[]
415+
)
416+
],
417+
)
418+
419+
try:
420+
db_session.add(feed)
421+
db_session.add(dataset)
422+
db_session.commit()
423+
# Validate that the validation report is already in the DB
424+
validation_report = (
425+
db_session.query(Validationreport)
426+
.filter(Validationreport.id == report_id)
427+
.one_or_none()
428+
)
429+
self.assertIsNotNone(validation_report)
430+
create_validation_report_entities(feed_stable_id, dataset_stable_id, "1.0")
431+
432+
# Validate that the validation report remained in the DB
433+
validation_report = (
434+
db_session.query(Validationreport)
435+
.filter(Validationreport.id == report_id)
436+
.one_or_none()
437+
)
438+
self.assertIsNotNone(validation_report)
439+
except Exception as e:
440+
raise e
441+
finally:
442+
db_session.rollback()
443+
db_session.close()

0 commit comments

Comments
 (0)