diff --git a/src/access_nri_intake/utils.py b/src/access_nri_intake/utils.py index ae6b118..876a98d 100644 --- a/src/access_nri_intake/utils.py +++ b/src/access_nri_intake/utils.py @@ -102,12 +102,18 @@ def validate_against_schema(instance: dict, schema: dict) -> None: Validator, type_checker=type_checker ) - issues = TupleAllowingValidator(schema).iter_errors(instance) + issues = list(TupleAllowingValidator(schema).iter_errors(instance)) - if len(list(issues)) > 0: + if len(issues) > 0: issue_str = "" - for issue in issues: - issue_str += f"{ issue.message }\n" + for i, issue in enumerate(issues): + try: + issue_str += ( + f"\n{i+1:02d} | {issue.absolute_path[0]} : { issue.message };" + ) + except IndexError: # Must be a missing keyword, not a bad type/value + issue_str += f"\n{i+1:02d} | missing : { issue.message };" + # raise jsonschema.ValidationError(textwrap.fill(textwrap.dedent(issue_str))) raise jsonschema.ValidationError(issue_str) return diff --git a/tests/data/bad_metadata/metadata-missing-name-missing-uuid.yaml b/tests/data/bad_metadata/metadata-missing-name-missing-uuid.yaml new file mode 100644 index 0000000..fb11cd1 --- /dev/null +++ b/tests/data/bad_metadata/metadata-missing-name-missing-uuid.yaml @@ -0,0 +1,7 @@ +created: '2024-02-27' +model: ACCESS-OM3 +description: An early ACCESS-OM3 test run +long_description: An early ACCESS-OM3 test run +url: git@github.com:COSIMA/MOM6-CICE6-WW3.git +contact: dougiesquire +email: dougiesquire@gmail.com diff --git a/tests/test_utils.py b/tests/test_utils.py index 51748e5..b9fe132 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -2,10 +2,13 @@ # SPDX-License-Identifier: Apache-2.0 import datetime +from pathlib import Path +import jsonschema import pytest import yaml +from access_nri_intake.catalog import EXP_JSONSCHEMA from access_nri_intake.utils import ( get_jsonschema, load_metadata_yaml, @@ -68,3 +71,21 @@ def test_validate_against_schema(instance): }, } validate_against_schema(instance, schema) + + +@pytest.mark.parametrize( + "instance,no_errs", + [ + ("bad_metadata/metadata-missing-name.yaml", 1), + ("bad_metadata/metadata-missing-name-missing-uuid.yaml", 2), + ], +) +def test_bad_metadata_validation_raises(test_data, instance, no_errs): + fpath = str(test_data / Path(instance)) + + try: + _ = load_metadata_yaml(fpath, EXP_JSONSCHEMA) + except jsonschema.ValidationError as e: + assert f"{no_errs:02d}" in e.message, "Can't see the right number of errors!" + except Exception: + assert False, "load_metadata_yaml didn't raise jsonschema.ValidationError"