diff --git a/tests/test_coverage_remaining_gaps.py b/tests/test_coverage_remaining_gaps.py index 5524ea71..d0457273 100644 --- a/tests/test_coverage_remaining_gaps.py +++ b/tests/test_coverage_remaining_gaps.py @@ -820,6 +820,71 @@ class TestSettingsSyncAdditional: # Should not raise handler_fn(sender=None) + def test_signal_handler_no_version_returned(self): + """Test that handler does nothing if Redis returns None for version.""" + from app.utils.settings_sync import register_settings_reload_signal + + handler_fn = None + def capture_connect(fn=None, weak=None, **kwargs): + nonlocal handler_fn + if fn is not None: + handler_fn = fn + return fn + def decorator(func): + nonlocal handler_fn + handler_fn = func + return func + return decorator + + with patch("app.utils.settings_sync.task_prerun") as mock_signal: + mock_signal.connect = capture_connect + register_settings_reload_signal() + + assert handler_fn is not None + + mock_redis = MagicMock() + mock_redis.get.return_value = None # Return None for version + + with patch("app.utils.settings_sync.redis") as mock_redis_mod: + mock_redis_mod.from_url.return_value = mock_redis + with patch("app.utils.config_loader.reload_settings_from_db") as mock_reload: + handler_fn(sender=None) + mock_reload.assert_not_called() + + def test_signal_handler_ocr_language_manager_exception(self): + """Test that OCR language check exception inside handler is caught and logged.""" + from app.utils.settings_sync import register_settings_reload_signal + + handler_fn = None + def capture_connect(fn=None, weak=None, **kwargs): + nonlocal handler_fn + if fn is not None: + handler_fn = fn + return fn + def decorator(func): + nonlocal handler_fn + handler_fn = func + return func + return decorator + + with patch("app.utils.settings_sync.task_prerun") as mock_signal: + mock_signal.connect = capture_connect + register_settings_reload_signal() + + assert handler_fn is not None + + mock_redis = MagicMock() + mock_redis.get.return_value = b"9999999.0" # New version + + with patch("app.utils.settings_sync.redis") as mock_redis_mod: + mock_redis_mod.from_url.return_value = mock_redis + with patch("app.utils.config_loader.reload_settings_from_db") as mock_reload: + with patch("app.utils.settings_sync._last_seen_version", "111.0"): + with patch("app.utils.settings_sync.logger") as mock_logger: + with patch("app.utils.ocr_language_manager.ensure_ocr_languages_async", side_effect=Exception("OCR failed")): + handler_fn(sender=None) + mock_reload.assert_called_once() + mock_logger.warning.assert_called_with("Could not schedule OCR language check on worker: OCR failed") # =========================================================================== # app/api/logs.py – additional branches