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_invalid_output_format_assignment(valid_model): with pytest.raises(ValueError): valid_model.output_format = "unsupported_format" with pytest.raises(ValueError): valid_model.output_format = 123
[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"