File: test_pubchem.py

package info (click to toggle)
python-ase 3.26.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 15,484 kB
  • sloc: python: 148,112; xml: 2,728; makefile: 110; javascript: 47
file content (82 lines) | stat: -rw-r--r-- 3,927 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# fmt: off
"""Tests for PubChem."""

import json
from io import BytesIO

import pytest

from ase.data import pubchem
from ase.data.pubchem import (
    analyze_input,
    pubchem_atoms_conformer_search,
    pubchem_atoms_search,
    pubchem_conformer_search,
    pubchem_search,
)


@pytest.fixture
def mock_pubchem(monkeypatch) -> None:
    """Mock `pubchem`."""

    def mock_search_pubchem_raw_222(*args, **kwargs):
        """Mock `search_pubchem_raw` for ammonia (CID=222)."""
        data222 = b'222\n  -OEChem-10071914343D\n\n  4  3  0     0  0  0  0  0  0999 V2000\n    0.0000    0.0000    0.0000 N   0  0  0  0  0  0  0  0  0  0  0  0\n   -0.4417    0.2906    0.8711 H   0  0  0  0  0  0  0  0  0  0  0  0\n    0.7256    0.6896   -0.1907 H   0  0  0  0  0  0  0  0  0  0  0  0\n    0.4875   -0.8701    0.2089 H   0  0  0  0  0  0  0  0  0  0  0  0\n  1  2  1  0  0  0  0\n  1  3  1  0  0  0  0\n  1  4  1  0  0  0  0\nM  END\n> <PUBCHEM_COMPOUND_CID>\n222\n\n> <PUBCHEM_CONFORMER_RMSD>\n0.4\n\n> <PUBCHEM_CONFORMER_DIVERSEORDER>\n1\n\n> <PUBCHEM_MMFF94_PARTIAL_CHARGES>\n4\n1 -1.08\n2 0.36\n3 0.36\n4 0.36\n\n> <PUBCHEM_EFFECTIVE_ROTOR_COUNT>\n0\n\n> <PUBCHEM_PHARMACOPHORE_FEATURES>\n1\n1 1 cation\n\n> <PUBCHEM_HEAVY_ATOM_COUNT>\n1\n\n> <PUBCHEM_ATOM_DEF_STEREO_COUNT>\n0\n\n> <PUBCHEM_ATOM_UDEF_STEREO_COUNT>\n0\n\n> <PUBCHEM_BOND_DEF_STEREO_COUNT>\n0\n\n> <PUBCHEM_BOND_UDEF_STEREO_COUNT>\n0\n\n> <PUBCHEM_ISOTOPIC_ATOM_COUNT>\n0\n\n> <PUBCHEM_COMPONENT_COUNT>\n1\n\n> <PUBCHEM_CACTVS_TAUTO_COUNT>\n1\n\n> <PUBCHEM_CONFORMER_ID>\n000000DE00000001\n\n> <PUBCHEM_MMFF94_ENERGY>\n0\n\n> <PUBCHEM_FEATURE_SELFOVERLAP>\n5.074\n\n> <PUBCHEM_SHAPE_FINGERPRINT>\n260 1 18410856563934756871\n\n> <PUBCHEM_SHAPE_MULTIPOLES>\n15.6\n0.51\n0.51\n0.51\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\n\n> <PUBCHEM_SHAPE_SELFOVERLAP>\n14.89\n\n> <PUBCHEM_SHAPE_VOLUME>\n15.6\n\n> <PUBCHEM_COORDINATE_TYPE>\n2\n5\n10\n\n$$$$\n'  # noqa
        r = BytesIO(data222)
        return r.read().decode('utf-8')

    def mock_available_conformer_search_222(*args, **kwargs):
        """Mock `available_conformer_search` for ammonia (CID=222)."""
        conformer222 = b'{\n  "InformationList": {\n    "Information": [\n      {\n        "CID": 222,\n        "ConformerID": [\n          "000000DE00000001"\n        ]\n      }\n    ]\n  }\n}\n'  # noqa
        r = BytesIO(conformer222)
        record = r.read().decode('utf-8')
        record = json.loads(record)
        return record['InformationList']['Information'][0]['ConformerID']

    f = mock_search_pubchem_raw_222
    monkeypatch.setattr(pubchem, 'search_pubchem_raw', f)

    f = mock_available_conformer_search_222
    monkeypatch.setattr(pubchem, 'available_conformer_search', f)


def test_pubchem_search(mock_pubchem) -> None:
    """Test if `pubchem_search` handles given arguments correctly."""
    data = pubchem_search('ammonia')

    atoms = data.get_atoms()
    assert atoms.get_chemical_symbols() == ['N', 'H', 'H', 'H']

    data.get_pubchem_data()


def test_pubchem(mock_pubchem) -> None:
    # check the various entry styles and the functions that return atoms
    pubchem_search(cid=241).get_atoms()
    pubchem_atoms_search(smiles='CCOH')
    pubchem_atoms_conformer_search('octane')


def test_pubchem_conformer_search(mock_pubchem) -> None:
    """Test if `pubchem_conformer_search` runs as expected."""
    confs = pubchem_conformer_search('octane')
    for _ in confs:
        pass


def test_multiple_search(mock_pubchem) -> None:
    """Check that you can't pass in two args."""
    with pytest.raises(ValueError):
        pubchem_search(name='octane', cid=222)


def test_empty_search(mock_pubchem) -> None:
    """Check that you must pass at least one arg."""
    with pytest.raises(ValueError):
        pubchem_search()


def test_triple_bond() -> None:
    """Check if hash (`#`) is converted to hex (`%23`)."""
    assert analyze_input(smiles='CC#N')[0] == 'CC%23N'