From a4855c6f0c3e079b9052d591f930db48b89abfe5 Mon Sep 17 00:00:00 2001 From: Joshua Hernandez Date: Thu, 5 Jun 2025 12:44:11 -0500 Subject: [PATCH] added validation for Particle and approver label, add unittest --- .../beckman_pharmspec_reader.py | 16 ++++++++-- .../errors/hiac_missing_approver.xlsx | Bin 0 -> 7970 bytes .../errors/hiac_missing_particle.xlsx | Bin 0 -> 7964 bytes .../beckman_pharmspec/to_allotrope_test.py | 30 ++++++++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 tests/parsers/beckman_pharmspec/testdata/errors/hiac_missing_approver.xlsx create mode 100644 tests/parsers/beckman_pharmspec/testdata/errors/hiac_missing_particle.xlsx diff --git a/src/allotropy/parsers/beckman_pharmspec/beckman_pharmspec_reader.py b/src/allotropy/parsers/beckman_pharmspec/beckman_pharmspec_reader.py index 8d2a99d42..05fd75fd2 100644 --- a/src/allotropy/parsers/beckman_pharmspec/beckman_pharmspec_reader.py +++ b/src/allotropy/parsers/beckman_pharmspec/beckman_pharmspec_reader.py @@ -1,5 +1,6 @@ import pandas as pd +from allotropy.exceptions import AllotropeConversionError from allotropy.named_file_contents import NamedFileContents from allotropy.parsers.utils.pandas import parse_header_row, read_excel, SeriesData @@ -17,8 +18,19 @@ def __init__(self, named_file_contents: NamedFileContents) -> None: by finding the index first row which contains the word 'Particle' and ending right before the index of the first row containing 'Approver'. """ - start = df[df[1].str.contains("Particle", na=False)].index.values[0] - end = df[df[0].str.contains("Approver_", na=False)].index.values[0] - 1 + # Check for rows containing "Particle" in column 1 + particle_rows = df[df[1].str.contains("Particle", na=False)].index.values + if len(particle_rows) == 0: + msg = "Unable to find required 'Particle' marker in column 1 of the data file." + raise AllotropeConversionError(msg) + start = particle_rows[0] + + # Check for rows containing "Approver_" in column 0 + approver_rows = df[df[0].str.contains("Approver_", na=False)].index.values + if len(approver_rows) == 0: + msg = "Unable to find required 'Approver_' marker in column 0 of the data file." + raise AllotropeConversionError(msg) + end = approver_rows[0] - 1 # The header data is everything up to the start of the data. # It is stored in two columns spread over the first 6 columns. diff --git a/tests/parsers/beckman_pharmspec/testdata/errors/hiac_missing_approver.xlsx b/tests/parsers/beckman_pharmspec/testdata/errors/hiac_missing_approver.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b68e27427998ea15fa1fae8715ba7ddce0c4a874 GIT binary patch literal 7970 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 P0Hk1>jzL%_0N{TBf4z_y literal 0 HcmV?d00001 diff --git a/tests/parsers/beckman_pharmspec/testdata/errors/hiac_missing_particle.xlsx b/tests/parsers/beckman_pharmspec/testdata/errors/hiac_missing_particle.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d45ee2e032b179116994e746b2159252d17e9acf GIT binary patch literal 7964 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 literal 0 HcmV?d00001 diff --git a/tests/parsers/beckman_pharmspec/to_allotrope_test.py b/tests/parsers/beckman_pharmspec/to_allotrope_test.py index 8b81a7d06..1bfdf314d 100644 --- a/tests/parsers/beckman_pharmspec/to_allotrope_test.py +++ b/tests/parsers/beckman_pharmspec/to_allotrope_test.py @@ -1,6 +1,36 @@ +from pathlib import Path + +import pytest + +from allotropy.exceptions import AllotropeConversionError from allotropy.parser_factory import Vendor +from allotropy.testing.utils import from_file from tests.to_allotrope_test import ParserTest +TESTDATA = Path(Path(__file__).parent, "testdata") + class TestParser(ParserTest): VENDOR = Vendor.BECKMAN_PHARMSPEC + + +def test_to_allotrope_missing_particle_marker() -> None: + with pytest.raises( + AllotropeConversionError, + match="Unable to find required 'Particle' marker in column 1 of the data file.", + ): + from_file( + f"{TESTDATA}/errors/hiac_missing_particle.xlsx", + TestParser.VENDOR, + ) + + +def test_to_allotrope_missing_approver_marker() -> None: + with pytest.raises( + AllotropeConversionError, + match="Unable to find required 'Approver_' marker in column 0 of the data file.", + ): + from_file( + f"{TESTDATA}/errors/hiac_missing_approver.xlsx", + TestParser.VENDOR, + )