Source code for pyicat_plus.tests.test_icat_datasets

import os
from pathlib import Path

import pytest

from ..concurrency import Empty
from .utils.message import assert_dataset_message
from .utils.message import assert_investigation_message
from .utils import generate


[docs] def test_start_investigation(icat_metadata_client): client, messages = icat_metadata_client client.check_health() client.start_investigation(proposal="hg123", beamline="id00") message = messages.get(timeout=10) assert messages.empty() expected = {"investigation": {"experiment": "hg123", "instrument": "id00"}} assert_investigation_message(message, expected)
[docs] def test_start_bad_investigation(icat_metadata_client): client, messages = icat_metadata_client client.check_health() client.start_investigation(proposal="hg666", beamline="id00") with pytest.raises(Empty): messages.get(timeout=2)
[docs] def test_send_metadata(icat_metadata_client): client, messages = icat_metadata_client client.send_metadata( proposal="hg123", beamline="id00", dataset="datasetname", path=_dummy_path("dataset"), metadata={"Sample_name": "samplename", "field1": "value1", "field2": [1, 2, 3]}, ) message = messages.get(timeout=10) assert messages.empty() expected = { "dataset": { "@complete": "true", "@xmlns": {"tns": "http://www.esrf.fr/icat"}, "instrument": "id00", "investigation": "hg123", "location": str(_dummy_path("dataset")), "name": "datasetname", "parameter": [ {"name": "Sample_name", "value": "samplename"}, {"name": "field1", "value": "value1"}, {"name": "field2", "value": "1,2,3"}, ], "sample": {"name": "samplename"}, } } assert_dataset_message(message, expected)
[docs] def test_send_metadata_via_file(icat_metadata_client, tmpdir): store_filename = tmpdir / "test.xml" client, messages = icat_metadata_client client.store_metadata( str(store_filename), proposal="hg123", beamline="id00", dataset="datasetname", path=_dummy_path("dataset"), metadata={"Sample_name": "samplename", "field1": "value1", "field2": [1, 2, 3]}, ) with pytest.raises(Empty): message = messages.get(timeout=1) assert store_filename.exists() client.send_metadata_from_file(str(store_filename)) message = messages.get(timeout=10) assert messages.empty() expected = { "dataset": { "@complete": "true", "@xmlns": {"tns": "http://www.esrf.fr/icat"}, "instrument": "id00", "investigation": "hg123", "location": str(_dummy_path("dataset")), "name": "datasetname", "parameter": [ {"name": "Sample_name", "value": "samplename"}, {"name": "field1", "value": "value1"}, {"name": "field2", "value": "1,2,3"}, ], "sample": {"name": "samplename"}, } } assert_dataset_message(message, expected)
[docs] def test_send_missing_data(icat_metadata_client): client, messages = icat_metadata_client with pytest.raises(AssertionError, match="ICAT requires the beamline name"): client.send_metadata( proposal=None, beamline=None, dataset=None, path=None, metadata=None, )
[docs] def test_send_missing_metadata(icat_metadata_client): client, messages = icat_metadata_client with pytest.raises( AssertionError, match="ICAT metadata field 'Sample_name' is missing" ): client.send_metadata( proposal="hg123", beamline="id00", dataset="datasetname", path=_dummy_path("dataset"), metadata={}, )
[docs] def test_send_metadata_with_machine_software(icat_metadata_client): client, messages = icat_metadata_client client.send_metadata( proposal="hg123", beamline="id00", dataset="datasetname", path=_dummy_path("dataset"), metadata={ "Sample_name": "samplename", "field1": "value1", "field2": [1, 2, 3], "machine": "mymachine", "software": "mysoftware_version", }, ) message = messages.get(timeout=10) assert messages.empty() expected = { "dataset": { "@complete": "true", "@xmlns": {"tns": "http://www.esrf.fr/icat"}, "instrument": "id00", "investigation": "hg123", "location": str(_dummy_path("dataset")), "name": "datasetname", "parameter": [ {"name": "Sample_name", "value": "samplename"}, {"name": "field1", "value": "value1"}, {"name": "field2", "value": "1,2,3"}, {"name": "machine", "value": "mymachine"}, {"name": "software", "value": "mysoftware_version"}, ], "sample": {"name": "samplename"}, } } assert_dataset_message(message, expected)
[docs] def test_reschedule_investigation(icat_metadata_client): client, messages = icat_metadata_client client.check_health() investigation_id = generate.investigation_id() client.reschedule_investigation(investigation_id=investigation_id) message = messages.get(timeout=10) assert messages.empty() expected = { "investigation": { "experiment": None, "instrument": None, "investigationId": investigation_id, } } assert_investigation_message(message, expected)
[docs] @pytest.mark.parametrize("path_defect", ["none", "trailing_slash", "up"]) def test_send_metadata_path_defects(icat_metadata_client, path_defect): expected_path = _dummy_path("dataset") expected_input_datasets = [_dummy_path("dataset1"), _dummy_path("dataset2")] if path_defect == "trailing_slash": path = _add_trailing_slash(expected_path) assert path.endswith(os.path.sep) input_datasets = [_add_trailing_slash(s) for s in expected_input_datasets] elif path_defect == "up": path = _add_up(expected_path) input_datasets = [_add_up(s) for s in expected_input_datasets] else: path = expected_path input_datasets = expected_input_datasets client, messages = icat_metadata_client client.send_metadata( proposal="hg123", beamline="id00", dataset="datasetname", path=path, metadata={ "Sample_name": "samplename", "field1": "value1", "field2": [1, 2, 3], "input_datasets": input_datasets, }, ) message = messages.get(timeout=10) assert messages.empty() expected_path = str(expected_path) input_datasets = ",".join([str(s) for s in expected_input_datasets]) expected = { "dataset": { "@complete": "true", "@xmlns": {"tns": "http://www.esrf.fr/icat"}, "instrument": "id00", "investigation": "hg123", "location": str(expected_path), "name": "datasetname", "parameter": [ {"name": "Sample_name", "value": "samplename"}, {"name": "field1", "value": "value1"}, {"name": "field2", "value": "1,2,3"}, {"name": "input_datasets", "value": input_datasets}, ], "sample": {"name": "samplename"}, } } assert_dataset_message(message, expected)
def _add_trailing_slash(path: Path) -> str: return str(path / "_")[:-1] def _add_up(path: Path) -> Path: return path / "_" / ".." def _dummy_path(dirname: str) -> Path: return Path.home() / dirname