Skip to content

Commit

Permalink
add a positive test for _pubchem_smiles_to_inchikey (#1451)
Browse files Browse the repository at this point in the history
* Add detailed docstrings and usage examples to Ersilia'a publish module and few update on the utils module (#1448)

* Merge sample command with the example command (#1422)

* Merge sample command with the example command

* Fix example command usage

* Generalize Standard Run  (#1411)

* Modify header calculation to choose from predefined example output file or standard example output file

* Remove the readiness function from SCRA because it is redundant, since those checks are also performed by the amenable function

* Remove unused method

* Make csv serialization work for any kind of model api response

* Remove the standard flag from the CLI since it is now the default run

* Update tests

* Unnecessary files removed

* Unnecessary files removed

* Unnecessary files removed

* Unnecessary files removed

* Unnecessary files removed

* Some import cleanup

* Few code fixes

* Few code fixes

* Add detailed docstrings and usage examples to Ersilia'a utils module

* Add detailed docstrings and usage examples to Ersilia'a utils module

* Merge sample command with the example command (#1422)

* Merge sample command with the example command

* Fix example command usage

* Generalize Standard Run  (#1411)

* Modify header calculation to choose from predefined example output file or standard example output file

* Remove the readiness function from SCRA because it is redundant, since those checks are also performed by the amenable function

* Remove unused method

* Make csv serialization work for any kind of model api response

* Remove the standard flag from the CLI since it is now the default run

* Update tests

* Unnecessary files removed

* Unnecessary files removed

* Unnecessary files removed

* Unnecessary files removed

* Unnecessary files removed

* Some import cleanup

---------

Co-authored-by: Dhanshree Arora <[email protected]>

* add a positive test for _pubchem_smiles_to_inchikey

Signed-off-by: olamidepeterojo <[email protected]>

---------

Signed-off-by: olamidepeterojo <[email protected]>
Co-authored-by: Abel Legese <[email protected]>
Co-authored-by: Dhanshree Arora <[email protected]>
  • Loading branch information
3 people authored Dec 19, 2024
1 parent 84227be commit 0685109
Showing 1 changed file with 204 additions and 190 deletions.
394 changes: 204 additions & 190 deletions test/test_compound_identifier.py
Original file line number Diff line number Diff line change
@@ -1,190 +1,204 @@
from ersilia.default import UNPROCESSABLE_INPUT
import pytest
from ersilia.utils.identifiers.compound import CompoundIdentifier
from unittest.mock import patch


@pytest.fixture
def compound_identifier():
return CompoundIdentifier()


@pytest.mark.parametrize("header", ["smiles", "input", "SMILES", "INPUT"])
def test_is_input_header_positive(compound_identifier, header):
"""Test that valid input headers return True."""
assert compound_identifier.is_input_header(header) is True


@pytest.mark.parametrize("header", ["output", "invalid", "InChI", "inchikey"])
def test_is_input_header_negative(compound_identifier, header):
"""Test that invalid input headers return False."""
assert compound_identifier.is_input_header(header) is False


@pytest.mark.parametrize("header", ["key", "inchiKey", "KEY", "INCHIKEY"])
def test_is_key_header_positive(compound_identifier, header):
"""Test that valid key headers return True."""
assert compound_identifier.is_key_header(header) is True


@pytest.mark.parametrize(
"header", ["id", "smiles", "inchi", "input", "some_header", "random", "header", ""]
)
def test_is_key_header_negative(compound_identifier, header):
assert not compound_identifier.is_key_header(header)


@pytest.mark.parametrize(
"inchikey",
[
"BSYNRYMUTXBXSQ-UHFFFAOYSA-N",
"BQJCRHHNABKAKU-KBQPJGBKSA-N",
"ZJPODVODJYKFHM-UHFFFAOYSA-N",
],
)
def test_is_inchikey_positive(compound_identifier, inchikey):
"""Test that valid InChIKeys return True."""
assert compound_identifier._is_inchikey(inchikey) is True


@pytest.fixture(params=[True, False], ids=["Chem_None", "Chem_Not_None"])
def compound_identifier(request):
"""Fixture that initializes CompoundIdentifier with or without RDKit."""
return CompoundIdentifier(local=request.param)


@pytest.mark.parametrize("smiles, expected", [("C", True), ("CCO", True)])
def test_is_smiles_positive(compound_identifier, smiles, expected):
"""Test _is_smiles returns True for valid SMILES strings."""
if compound_identifier.Chem is None:
assert compound_identifier._is_smiles(smiles) == expected


@pytest.mark.parametrize("smiles, expected", [("invalid_smiles", False), ("", False)])
def test_is_smiles_negative(compound_identifier, smiles, expected):
"""Test _is_smiles returns False for invalid or empty SMILES strings."""
assert compound_identifier._is_smiles(smiles) == expected


@pytest.mark.parametrize(
"inchikey, expected",
[
("BQJCRHHNABKAKU-KBQPJGBKSA-N", True),
],
)
def test_is_inchikey_positive(inchikey, expected):
"""Test _is_inchikey returns True for valid InChIKey."""
assert CompoundIdentifier._is_inchikey(inchikey) == expected


@pytest.mark.parametrize(
"inchikey, expected",
[("invalid_inchikey", False), ("BQJCRHHNABKAKU-KBQPJGBKSA", False)],
)
def test_is_inchikey_negative(inchikey, expected):
"""Test _is_inchikey returns False for invalid InChIKeys."""
assert CompoundIdentifier._is_inchikey(inchikey) == expected


@pytest.mark.parametrize(
"inchikey, expected",
[
("BQJCRHHNABKAKU-KBQPJGBKSA-N", "inchikey"),
("ABCDEFGHIJKLMN-OPQRSTUVWX-Y", "inchikey"),
],
)
def test_guess_type_inchikey(compound_identifier, inchikey, expected):
"""Ensure guess_type correctly identifies valid InChIKeys."""
result = compound_identifier.guess_type(inchikey)
assert (
result == expected
), f"Expected 'inchikey', but got '{result}' for input '{inchikey}'"


@pytest.mark.parametrize(
"smiles, expected",
[
("C", "smiles"),
("CCO", "smiles"),
],
)
def test_guess_type_smiles(compound_identifier, smiles, expected):
"""Ensure guess_type correctly identifies valid SMILES strings."""
result = compound_identifier.guess_type(smiles)
assert (
result == expected
), f"Expected 'smiles', but got '{result}' for input '{smiles}'"


@pytest.mark.parametrize(
"input_data, expected",
[
(None, UNPROCESSABLE_INPUT),
(UNPROCESSABLE_INPUT, UNPROCESSABLE_INPUT),
],
)
def test_guess_type_unprocessable(compound_identifier, input_data, expected):
"""Ensure guess_type returns UNPROCESSABLE_INPUT for None or unprocessable inputs."""
result = compound_identifier.guess_type(input_data)
assert result == expected, f"Expected '{UNPROCESSABLE_INPUT}', but got '{result}'"


@pytest.mark.parametrize(
"whitespace_input, expected",
[
("\n", UNPROCESSABLE_INPUT),
("\t", UNPROCESSABLE_INPUT),
(" ", UNPROCESSABLE_INPUT),
],
)
def test_guess_type_whitespace(compound_identifier, whitespace_input, expected):
"""Ensure guess_type returns UNPROCESSABLE_INPUT for whitespace-only input."""
result = compound_identifier.guess_type(whitespace_input)
assert (
result == expected
), f"Expected '{UNPROCESSABLE_INPUT}' for input '{whitespace_input}'"


@pytest.mark.parametrize(
"non_char_input, expected",
[
(12345, UNPROCESSABLE_INPUT),
(3.14, UNPROCESSABLE_INPUT),
("𠜎𠜱𡿺𠬠", UNPROCESSABLE_INPUT),
],
)
def test_guess_type_non_character(compound_identifier, non_char_input, expected):
"""Ensure guess_type returns UNPROCESSABLE_INPUT for non-character input."""
result = compound_identifier.guess_type(non_char_input)
assert (
result == expected
), f"Expected '{UNPROCESSABLE_INPUT}' for input '{non_char_input}'"

# Test with a valid SMILES input
smiles_string = "CCO" # Ethanol SMILES
assert compound_identifier._is_smiles(smiles_string) is True


@patch("requests.get")
async def test_nci_smiles_to_inchikey_positive(mock_get, compound_identifier):
"""Test _nci_smiles_to_inchikey with a mocked positive response."""
mock_response = mock_get.return_value
mock_response.status_code = 200
mock_response.text = "InChIKey=BSYNRYMUTXBXSQ-UHFFFAOYSA-N"

inchikey = await compound_identifier._nci_smiles_to_inchikey(
session=None, smiles="CCO"
)
assert inchikey == "BSYNRYMUTXBXSQ-UHFFFAOYSA-N"


@patch("requests.get")
async def test_nci_smiles_to_inchikey_negative(mock_get, compound_identifier):
"""Test _nci_smiles_to_inchikey with a mocked negative response."""
mock_response = mock_get.return_value
mock_response.status_code = 404

inchikey = await compound_identifier._nci_smiles_to_inchikey(
session=None, smiles="invalid_smiles"
)
assert inchikey is None
from ersilia.default import UNPROCESSABLE_INPUT
import pytest
from ersilia.utils.identifiers.compound import CompoundIdentifier
from unittest.mock import patch


@pytest.fixture
def compound_identifier():
return CompoundIdentifier()


@pytest.mark.parametrize("header", ["smiles", "input", "SMILES", "INPUT"])
def test_is_input_header_positive(compound_identifier, header):
"""Test that valid input headers return True."""
assert compound_identifier.is_input_header(header) is True


@pytest.mark.parametrize("header", ["output", "invalid", "InChI", "inchikey"])
def test_is_input_header_negative(compound_identifier, header):
"""Test that invalid input headers return False."""
assert compound_identifier.is_input_header(header) is False


@pytest.mark.parametrize("header", ["key", "inchiKey", "KEY", "INCHIKEY"])
def test_is_key_header_positive(compound_identifier, header):
"""Test that valid key headers return True."""
assert compound_identifier.is_key_header(header) is True


@pytest.mark.parametrize(
"header", ["id", "smiles", "inchi", "input", "some_header", "random", "header", ""]
)
def test_is_key_header_negative(compound_identifier, header):
assert not compound_identifier.is_key_header(header)


@pytest.mark.parametrize(
"inchikey",
[
"BSYNRYMUTXBXSQ-UHFFFAOYSA-N",
"BQJCRHHNABKAKU-KBQPJGBKSA-N",
"ZJPODVODJYKFHM-UHFFFAOYSA-N",
],
)
def test_is_inchikey_positive(compound_identifier, inchikey):
"""Test that valid InChIKeys return True."""
assert compound_identifier._is_inchikey(inchikey) is True


@pytest.fixture(params=[True, False], ids=["Chem_None", "Chem_Not_None"])
def compound_identifier(request):
"""Fixture that initializes CompoundIdentifier with or without RDKit."""
return CompoundIdentifier(local=request.param)


@pytest.mark.parametrize("smiles, expected", [("C", True), ("CCO", True)])
def test_is_smiles_positive(compound_identifier, smiles, expected):
"""Test _is_smiles returns True for valid SMILES strings."""
if compound_identifier.Chem is None:
assert compound_identifier._is_smiles(smiles) == expected


@pytest.mark.parametrize("smiles, expected", [("invalid_smiles", False), ("", False)])
def test_is_smiles_negative(compound_identifier, smiles, expected):
"""Test _is_smiles returns False for invalid or empty SMILES strings."""
assert compound_identifier._is_smiles(smiles) == expected


@pytest.mark.parametrize(
"inchikey, expected",
[
("BQJCRHHNABKAKU-KBQPJGBKSA-N", True),
],
)
def test_is_inchikey_positive(inchikey, expected):
"""Test _is_inchikey returns True for valid InChIKey."""
assert CompoundIdentifier._is_inchikey(inchikey) == expected


@pytest.mark.parametrize(
"inchikey, expected",
[("invalid_inchikey", False), ("BQJCRHHNABKAKU-KBQPJGBKSA", False)],
)
def test_is_inchikey_negative(inchikey, expected):
"""Test _is_inchikey returns False for invalid InChIKeys."""
assert CompoundIdentifier._is_inchikey(inchikey) == expected


@pytest.mark.parametrize(
"inchikey, expected",
[
("BQJCRHHNABKAKU-KBQPJGBKSA-N", "inchikey"),
("ABCDEFGHIJKLMN-OPQRSTUVWX-Y", "inchikey"),
],
)
def test_guess_type_inchikey(compound_identifier, inchikey, expected):
"""Ensure guess_type correctly identifies valid InChIKeys."""
result = compound_identifier.guess_type(inchikey)
assert (
result == expected
), f"Expected 'inchikey', but got '{result}' for input '{inchikey}'"


@pytest.mark.parametrize(
"smiles, expected",
[
("C", "smiles"),
("CCO", "smiles"),
],
)
def test_guess_type_smiles(compound_identifier, smiles, expected):
"""Ensure guess_type correctly identifies valid SMILES strings."""
result = compound_identifier.guess_type(smiles)
assert (
result == expected
), f"Expected 'smiles', but got '{result}' for input '{smiles}'"


@pytest.mark.parametrize(
"input_data, expected",
[
(None, UNPROCESSABLE_INPUT),
(UNPROCESSABLE_INPUT, UNPROCESSABLE_INPUT),
],
)
def test_guess_type_unprocessable(compound_identifier, input_data, expected):
"""Ensure guess_type returns UNPROCESSABLE_INPUT for None or unprocessable inputs."""
result = compound_identifier.guess_type(input_data)
assert result == expected, f"Expected '{UNPROCESSABLE_INPUT}', but got '{result}'"


@pytest.mark.parametrize(
"whitespace_input, expected",
[
("\n", UNPROCESSABLE_INPUT),
("\t", UNPROCESSABLE_INPUT),
(" ", UNPROCESSABLE_INPUT),
],
)
def test_guess_type_whitespace(compound_identifier, whitespace_input, expected):
"""Ensure guess_type returns UNPROCESSABLE_INPUT for whitespace-only input."""
result = compound_identifier.guess_type(whitespace_input)
assert (
result == expected
), f"Expected '{UNPROCESSABLE_INPUT}' for input '{whitespace_input}'"


@pytest.mark.parametrize(
"non_char_input, expected",
[
(12345, UNPROCESSABLE_INPUT),
(3.14, UNPROCESSABLE_INPUT),
("𠜎𠜱𡿺𠬠", UNPROCESSABLE_INPUT),
],
)
def test_guess_type_non_character(compound_identifier, non_char_input, expected):
"""Ensure guess_type returns UNPROCESSABLE_INPUT for non-character input."""
result = compound_identifier.guess_type(non_char_input)
assert (
result == expected
), f"Expected '{UNPROCESSABLE_INPUT}' for input '{non_char_input}'"

# Test with a valid SMILES input
smiles_string = "CCO" # Ethanol SMILES
assert compound_identifier._is_smiles(smiles_string) is True


@patch("requests.get")
async def test_nci_smiles_to_inchikey_positive(mock_get, compound_identifier):
"""Test _nci_smiles_to_inchikey with a mocked positive response."""
mock_response = mock_get.return_value
mock_response.status_code = 200
mock_response.text = "InChIKey=BSYNRYMUTXBXSQ-UHFFFAOYSA-N"

inchikey = await compound_identifier._nci_smiles_to_inchikey(
session=None, smiles="CCO"
)
assert inchikey == "BSYNRYMUTXBXSQ-UHFFFAOYSA-N"


@patch("requests.get")
async def test_nci_smiles_to_inchikey_negative(mock_get, compound_identifier):
"""Test _nci_smiles_to_inchikey with a mocked negative response."""
mock_response = mock_get.return_value
mock_response.status_code = 404

inchikey = await compound_identifier._nci_smiles_to_inchikey(
session=None, smiles="invalid_smiles"
)
assert inchikey is None


@patch("requests.get")
async def test_pubchem_smiles_to_inchikey_positive(mock_get, compound_identifier):
"""Test _pubchem_smiles_to_inchikey with a mocked positive response."""
mock_response = mock_get.return_value
mock_response.status_code = 200
mock_response.text = "InChIKey=BSYNRYMUTXBXSQ-UHFFFAOYSA-N"

inchikey = await compound_identifier._pubchem_smiles_to_inchikey(
session=None, smiles="CCO"
)
assert inchikey == "BSYNRYMUTXBXSQ-UHFFFAOYSA-N"

0 comments on commit 0685109

Please sign in to comment.