Skip to content

Commit 153fb06

Browse files
committed
Add test_define_omero_channels to validate omero-channel metadata against OME-NGFF JSON schema
1 parent 365dc03 commit 153fb06

File tree

2 files changed

+91
-45
lines changed

2 files changed

+91
-45
lines changed

tests/test_unit_channels.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
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)

tests/test_unit_channels_addressing.py

Lines changed: 0 additions & 45 deletions
This file was deleted.

0 commit comments

Comments
 (0)