|
| 1 | +import json |
| 2 | +from pathlib import Path |
| 3 | + |
| 4 | +import jsonschema |
| 5 | +import pytest |
| 6 | +from devtools import debug |
| 7 | + |
| 8 | +from fractal_tasks_core.lib_channels import Channel |
| 9 | +from fractal_tasks_core.lib_channels import define_omero_channels |
| 10 | +from fractal_tasks_core.lib_channels import get_channel_from_list |
| 11 | + |
| 12 | + |
| 13 | +def test_get_channel_from_list(testdata_path: Path): |
| 14 | + |
| 15 | + # Read JSON data and cast into `Channel`s |
| 16 | + with (testdata_path / "omero/channels_list.json").open("r") as f: |
| 17 | + omero_channels_dict = json.load(f) |
| 18 | + omero_channels = [Channel(**c) for c in omero_channels_dict] |
| 19 | + debug(omero_channels) |
| 20 | + |
| 21 | + # Extract a channel from a list / case 1 |
| 22 | + channel = get_channel_from_list(channels=omero_channels, label="label_1") |
| 23 | + debug(channel) |
| 24 | + assert channel.label == "label_1" |
| 25 | + assert channel.wavelength_id == "wavelength_id_1" |
| 26 | + assert channel.index == 0 |
| 27 | + # Extract a channel from a list / case 2 |
| 28 | + channel = get_channel_from_list( |
| 29 | + channels=omero_channels, wavelength_id="wavelength_id_2" |
| 30 | + ) |
| 31 | + debug(channel) |
| 32 | + assert channel.label == "label_2" |
| 33 | + assert channel.wavelength_id == "wavelength_id_2" |
| 34 | + assert channel.index == 1 |
| 35 | + # Extract a channel from a list / case 3 |
| 36 | + channel = get_channel_from_list( |
| 37 | + channels=omero_channels, |
| 38 | + label="label_2", |
| 39 | + wavelength_id="wavelength_id_2", |
| 40 | + ) |
| 41 | + debug(channel) |
| 42 | + assert channel.label == "label_2" |
| 43 | + assert channel.wavelength_id == "wavelength_id_2" |
| 44 | + assert channel.index == 1 |
| 45 | + # Extract a channel from a list / case 4 |
| 46 | + with pytest.raises(ValueError): |
| 47 | + channel = get_channel_from_list(channels=omero_channels) |
| 48 | + |
| 49 | + |
| 50 | +@pytest.fixture(scope="session") |
| 51 | +def omero_channel_schema(): |
| 52 | + import urllib.request |
| 53 | + from fractal_tasks_core import __OME_NGFF_VERSION__ |
| 54 | + |
| 55 | + url = ( |
| 56 | + "https://raw.githubusercontent.com/ome/ngff/main/" |
| 57 | + f"{__OME_NGFF_VERSION__}/schemas/image.schema" |
| 58 | + ) |
| 59 | + debug(url) |
| 60 | + with urllib.request.urlopen(url) as fin: |
| 61 | + full_schema = json.load(fin) |
| 62 | + yield full_schema["properties"]["omero"]["properties"]["channels"]["items"] |
| 63 | + |
| 64 | + |
| 65 | +def test_define_omero_channels(testdata_path: Path, omero_channel_schema): |
| 66 | + """ |
| 67 | + GIVEN a list of our custom `Channel` objects |
| 68 | + WHEN calling `define_omero_channels` |
| 69 | + THEN |
| 70 | + the output channel dictionaries are valid Omero channels according to |
| 71 | + the OME-NGFF schema |
| 72 | + """ |
| 73 | + # Read JSON data and cast into `Channel`s |
| 74 | + with (testdata_path / "omero/channels_list.json").open("r") as f: |
| 75 | + omero_channels_dict = json.load(f) |
| 76 | + omero_channels = [Channel(**c) for c in omero_channels_dict] |
| 77 | + debug(omero_channels) |
| 78 | + |
| 79 | + # Call define_omero_channels |
| 80 | + processed_channels = define_omero_channels( |
| 81 | + channels=omero_channels, bit_depth=16, label_prefix="prefix" |
| 82 | + ) |
| 83 | + debug(processed_channels) |
| 84 | + |
| 85 | + # Validate output of define_omero_channels |
| 86 | + for channel in processed_channels: |
| 87 | + assert "color" in channel |
| 88 | + assert "label" in channel |
| 89 | + assert "index" not in channel |
| 90 | + assert set(channel["window"].keys()) == {"min", "max", "start", "end"} |
| 91 | + jsonschema.validate(instance=channel, schema=omero_channel_schema) |
0 commit comments