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"
assert valid_model.phase_retrieval_method == "None"
assert valid_model.delta_beta == "100"
[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
valid_model.phase_retrieval_method = "CTF"
assert valid_model.phase_retrieval_method == "CTF"
valid_model.delta_beta = 100
assert valid_model.delta_beta == "100"
[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_invalid_phase_retrieval_method_assignment(valid_model):
with pytest.raises(ValueError):
valid_model.phase_retrieval_method = "wrong"
with pytest.raises(ValueError):
valid_model.phase_retrieval_method = 123
[docs]
def test_invalid_delta_beta_assignment(valid_model):
with pytest.raises(ValueError, match="delta_beta must be positive"):
valid_model.delta_beta = -5
with pytest.raises(ValueError):
valid_model.delta_beta = "0"
with pytest.raises(ValueError):
valid_model.delta_beta = "invalid"
[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"