Source code for blissoda.tests.test_tomography
import pydantic
import pytest
from ..tomo.tomo_model import TomoProcessorModel
from ..tomo.tomo_processor import TomoProcessor
[docs]
@pytest.fixture
def valid_model():
model = TomoProcessorModel()
return model
[docs]
def test_valid_model_initialization(valid_model):
assert valid_model.slice_reconstruction_workflow == "slice_reconstruction.json"
assert valid_model.queue is None
assert valid_model.nabu_config_file is not None
assert isinstance(valid_model.nabu_config_file, str)
assert valid_model.slice_index == "middle"
assert valid_model.cor_algorithm == "sliding-window"
[docs]
def test_valid_model_assignment(valid_model):
valid_model.queue = "my_queue"
assert valid_model.queue == "my_queue"
valid_model.slice_index = "first"
assert valid_model.slice_index == "first"
valid_model.slice_index = 2
assert valid_model.slice_index == "2"
valid_model.cor_algorithm = 3.14
assert valid_model.cor_algorithm == 3.14
[docs]
def test_invalid_workflow_assignment(valid_model):
with pytest.raises(ValueError):
valid_model.slice_reconstruction_workflow = "invalid.txt"
with pytest.raises(ValueError):
valid_model.slice_reconstruction_workflow = 123
with pytest.raises(FileNotFoundError):
valid_model.slice_reconstruction_workflow = "nonexistent.json"
[docs]
def test_invalid_queue_assignment(valid_model):
with pytest.raises(ValueError):
valid_model.queue = 123
with pytest.raises(ValueError):
valid_model.queue = [1, 2, 3]
[docs]
def test_invalid_nabu_config_file_assignment(tmp_path, valid_model):
# Point to a file that doesn't exist
missing_file = tmp_path / "missing.yml"
with pytest.raises(FileNotFoundError):
valid_model.nabu_config_file = str(missing_file)
with pytest.raises(ValueError):
valid_model.nabu_config_file = 123
[docs]
def test_invalid_slice_index_assignment(valid_model):
with pytest.raises(ValueError):
valid_model.slice_index = "wrong"
with pytest.raises(ValueError):
valid_model.slice_index = 4.5
[docs]
def test_invalid_cor_algorithm_assignment(valid_model):
with pytest.raises(ValueError):
valid_model.cor_algorithm = "invalid-method"
with pytest.raises(ValueError):
valid_model.cor_algorithm = [1, 2, 3]
[docs]
def test_show_last_slice(valid_model):
assert valid_model.show_last_slice is False
valid_model.show_last_slice = True
assert valid_model.show_last_slice is True
with pytest.raises(pydantic.ValidationError):
valid_model.show_last_slice = 123
with pytest.raises(pydantic.ValidationError):
valid_model.show_last_slice = "wrong_type"
[docs]
def test_invalid_slice_index_range_assignment(valid_model):
with pytest.raises(ValueError):
valid_model.slice_index_range = "not-a-list"
with pytest.raises(ValueError):
valid_model.slice_index_range = [1]
with pytest.raises(ValueError):
valid_model.slice_index_range = [1, "two"]
[docs]
def test_cor_algorithm_for_scan_range_uses_180_algorithm_for_180_scan(
mock_persistent, caplog
):
processor = TomoProcessor(defaults={"cor_algorithm": "composite-coarse-to-fine"})
with caplog.at_level("INFO"):
cor_algorithm = processor._cor_algorithm_for_scan_range(180.0)
assert cor_algorithm == "sliding-window"
assert "requires a 360 degree scan" in caplog.text
[docs]
def test_cor_algorithm_for_scan_range_keeps_360_algorithm_for_360_scan(
mock_persistent,
):
processor = TomoProcessor(defaults={"cor_algorithm": "composite-coarse-to-fine"})
cor_algorithm = processor._cor_algorithm_for_scan_range(360.0)
assert cor_algorithm == "composite-coarse-to-fine"
[docs]
def test_load_nabu_config_file_preserves_phase_section(mock_persistent, tmp_path):
nabu_config = tmp_path / "nabu.conf"
nabu_config.write_text("""
[phase]
method = Paganin
delta_beta = 42
""".strip())
processor = TomoProcessor(defaults={"nabu_config_file": str(nabu_config)})
processor._output_path = str(tmp_path / "sample" / "projections" / "sample.nx")
nabu_dict = processor.load_nabu_config_file(str(nabu_config))
assert nabu_dict["phase"]["method"] == "Paganin"
assert nabu_dict["phase"]["delta_beta"] == "42"