diff --git a/data_resource_api/app/utils/descriptor.py b/data_resource_api/app/utils/descriptor.py index 8e6c386..b60d203 100644 --- a/data_resource_api/app/utils/descriptor.py +++ b/data_resource_api/app/utils/descriptor.py @@ -80,10 +80,12 @@ def _create_descriptor(self, schema_dir: str, file_name: str): try: descriptor_dict = json.load(fh) except ValueError: - logger.info( + raise RuntimeError( f"Failed to load JSON file. JSON is probably invalid in file '{os.path.join(schema_dir, file_name)}'" ) + except RuntimeError: + raise except Exception: raise RuntimeError(f"Error opening schema {file_name}") diff --git a/tests/descriptor_util_classes/test_descriptor_from_file.py b/tests/descriptor_util_classes/test_descriptor_from_file.py index 1a8f8a7..94810d7 100644 --- a/tests/descriptor_util_classes/test_descriptor_from_file.py +++ b/tests/descriptor_util_classes/test_descriptor_from_file.py @@ -1,20 +1,56 @@ -from tests.schemas import frameworks_descriptor +import json +import os +import shutil import pytest -from data_resource_api.app.utils.descriptor import DescriptorFromFile -from expects import equal, expect +from data_resource_api.app.utils.descriptor import ( + DescriptorFromFile, + DescriptorsFromDirectory, +) +IO_TEST_FILES = os.path.join(os.path.dirname(__file__), "..", "io_test_files") +INVALID_JSON = os.path.join(IO_TEST_FILES, "invalid_json.json") -@pytest.mark.skip -def test_check_if_the_file_is_a_directory(self): - pass +def test_raises_on_invalid_json(): + """DescriptorFromFile must raise RuntimeError for invalid JSON, not crash with NameError.""" + schema_dir = os.path.dirname(INVALID_JSON) + file_name = os.path.basename(INVALID_JSON) + with pytest.raises(RuntimeError, match="JSON is probably invalid"): + DescriptorFromFile(schema_dir, file_name) -@pytest.mark.skip -def test_test_get_only_json_files(self): - pass +def test_raises_on_directory_instead_of_file(tmp_path): + """DescriptorFromFile must raise RuntimeError when given a directory path.""" + subdir = tmp_path / "subdir" + subdir.mkdir() + with pytest.raises(RuntimeError, match="Cannot open a directory"): + DescriptorFromFile(str(tmp_path), "subdir") -@pytest.mark.skip -def test_returns_correctly(self): - pass + +def test_skips_invalid_json_and_continues(tmp_path): + """DescriptorsFromDirectory must skip invalid JSON files and keep loading valid ones.""" + shutil.copy(INVALID_JSON, tmp_path / "invalid_json.json") + + valid_descriptor = { + "api": { + "resource": "frameworks", + "methods": [{"get": {"enabled": True, "secured": False, "grants": []}}], + }, + "datastore": { + "tablename": "frameworks", + "restricted_fields": [], + "schema": { + "fields": [ + {"name": "id", "type": "integer", "title": "id", "required": False} + ], + "primaryKey": "id", + }, + }, + } + with open(tmp_path / "valid_descriptor.json", "w") as f: + json.dump(valid_descriptor, f) + + descriptors = list(DescriptorsFromDirectory([str(tmp_path)]).iter_files()) + assert len(descriptors) == 1 + assert descriptors[0].table_name == "frameworks"