diff --git a/cdisc_rules_engine/models/dictionaries/loinc/loinc_terms_factory.py b/cdisc_rules_engine/models/dictionaries/loinc/loinc_terms_factory.py index 99d9234da..bd277dd79 100644 --- a/cdisc_rules_engine/models/dictionaries/loinc/loinc_terms_factory.py +++ b/cdisc_rules_engine/models/dictionaries/loinc/loinc_terms_factory.py @@ -44,7 +44,7 @@ def install_terms( text_line = decode_line(bytes_line) values = next(csv.reader(StringIO(text_line))) if len(values) < 9: - return MissingDataError( + raise MissingDataError( message="Loinc term found without required fields provided" ) term = LoincTerm( diff --git a/tests/unit/test_dictionaries/test_loinc/test_loinc_terms_factory.py b/tests/unit/test_dictionaries/test_loinc/test_loinc_terms_factory.py index 093c622d9..efd70c9df 100644 --- a/tests/unit/test_dictionaries/test_loinc/test_loinc_terms_factory.py +++ b/tests/unit/test_dictionaries/test_loinc/test_loinc_terms_factory.py @@ -1,6 +1,10 @@ +import io import os from unittest.mock import MagicMock +import pytest + +from cdisc_rules_engine.exceptions.custom_exceptions import MissingDataError from cdisc_rules_engine.models.dictionaries import DictionaryTypes, AbstractTermsFactory from cdisc_rules_engine.services.data_services.local_data_service import ( LocalDataService, @@ -21,3 +25,18 @@ def test_install(): expected = ["100000-9", "100001-7", "100002-5"] for i, code in enumerate(dictionary): assert code == expected[i] + + +def test_install_raises_on_row_with_missing_fields(): + """A Loinc.csv data row with fewer than 9 fields must raise MissingDataError, + not return the exception object (which callers store as the dictionary).""" + data_service = MagicMock() + data_service.has_all_files.return_value = True + data_service.read_data.return_value = io.BytesIO( + b"NUM,COMP,PROP,TIME,SYS,SCALE,METHOD,CLASS,VER\n100000-9,short\n" + ) + factory = AbstractTermsFactory(data_service).get_service( + DictionaryTypes.LOINC.value + ) + with pytest.raises(MissingDataError): + factory.install_terms("some/path")