From b215f1f275dc1c6f7b67f08e9114167efed0cce8 Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Mon, 14 Jul 2025 16:20:39 +0100 Subject: [PATCH 1/2] Additional tests for ispyb service --- tests/util/test_ispyb_commands.py | 77 +++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/tests/util/test_ispyb_commands.py b/tests/util/test_ispyb_commands.py index 6fe870e5..d458f78a 100644 --- a/tests/util/test_ispyb_commands.py +++ b/tests/util/test_ispyb_commands.py @@ -1,10 +1,55 @@ from __future__ import annotations from datetime import datetime +from typing import Callable from unittest import mock +import pytest +from sqlalchemy.exc import SQLAlchemyError + from cryoemservices.util import ispyb_commands +bad_multipart_message_commands = [ + None, + {"not a list": "not a list"}, + [], + [{"missing_command": "not here"}], + [{"ispyb_command": "non_existant"}], +] + + +@pytest.mark.parametrize("commands", bad_multipart_message_commands) +def test_multipart_message_bad_commands(commands): + def ispyb_parameters(p): + return {"ispyb_command_list": commands}.get(p) + + assert ( + ispyb_commands.multipart_message({}, ispyb_parameters, mock.MagicMock()) + is False + ) + + +bad_buffer_commands = [ + {}, + {"buffer_command": "not a dict"}, + {"buffer_command": {"ispyb_command": None}}, + {"buffer_command": {"ispyb_command": "non_existant"}}, + { + "buffer_command": { + "ispyb_command": "insert_movie", + "buffer_lookup": "not a dict", + } + }, +] + + +@pytest.mark.parametrize("commands", bad_multipart_message_commands) +def test_buffer_bad_commands(commands): + def ispyb_parameters(p): + return {"ispyb_command_list": commands}.get(p) + + assert ispyb_commands.buffer({}, ispyb_parameters, mock.MagicMock()) is False + @mock.patch("cryoemservices.util.ispyb_commands.models") def test_insert_movie_id_notime(mock_models): @@ -1043,3 +1088,35 @@ def mock_processing_parameters(p): ) mock_session.add.assert_called() mock_session.commit.assert_called() + + +ispyb_insertion_functions = [ + ispyb_commands.insert_movie, + ispyb_commands.insert_motion_correction, + ispyb_commands.insert_relative_ice_thickness, + ispyb_commands.insert_ctf, + ispyb_commands.insert_particle_picker, + ispyb_commands.insert_particle_classification, + ispyb_commands.insert_particle_classification_group, + ispyb_commands.insert_cryoem_initial_model, + ispyb_commands.insert_bfactor_fit, + ispyb_commands.insert_tomogram, + ispyb_commands.insert_processed_tomogram, + ispyb_commands.insert_tilt_image_alignment, + ispyb_commands.update_processing_status, + ispyb_commands.register_processing, +] + + +@pytest.mark.parametrize("ispyb_function", ispyb_insertion_functions) +def test_sql_failures(ispyb_function: Callable): + def raise_sql_error(): + raise SQLAlchemyError("Test error") + + def mock_processing_parameters(p): + return p if p != "timestamp" else None + + mock_session = mock.MagicMock() + mock_session.commit.side_effect = raise_sql_error + + assert ispyb_function({}, mock_processing_parameters, mock_session) is False From e8754c572a194eb8d7705dee80171f17d5a69c4b Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Mon, 14 Jul 2025 17:01:09 +0100 Subject: [PATCH 2/2] Wasn't testing the right thing --- tests/util/test_ispyb_commands.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/util/test_ispyb_commands.py b/tests/util/test_ispyb_commands.py index d458f78a..6a8a5820 100644 --- a/tests/util/test_ispyb_commands.py +++ b/tests/util/test_ispyb_commands.py @@ -37,18 +37,18 @@ def ispyb_parameters(p): { "buffer_command": { "ispyb_command": "insert_movie", - "buffer_lookup": "not a dict", - } + }, + "buffer_lookup": "not a dict", }, ] -@pytest.mark.parametrize("commands", bad_multipart_message_commands) +@pytest.mark.parametrize("commands", bad_buffer_commands) def test_buffer_bad_commands(commands): def ispyb_parameters(p): - return {"ispyb_command_list": commands}.get(p) + return p - assert ispyb_commands.buffer({}, ispyb_parameters, mock.MagicMock()) is False + assert ispyb_commands.buffer(commands, ispyb_parameters, mock.MagicMock()) is False @mock.patch("cryoemservices.util.ispyb_commands.models") @@ -1114,7 +1114,7 @@ def raise_sql_error(): raise SQLAlchemyError("Test error") def mock_processing_parameters(p): - return p if p != "timestamp" else None + return "10" if p != "timestamp" else None mock_session = mock.MagicMock() mock_session.commit.side_effect = raise_sql_error