"""High-value tests for web/queue module and storage factory.

Covers gaps not addressed by existing tests:
- Storage factory session validation
- QueueManager basic operations
"""

import pytest
from unittest.mock import MagicMock, patch

from local_deep_research.storage.factory import (
    get_report_storage,
)


class TestStorageFactorySessionValidation:
    """Test the storage factory session validation."""

    def test_raises_when_session_is_none(self):
        """get_report_storage raises ValueError when session is None."""
        with pytest.raises(ValueError, match="Database session is required"):
            get_report_storage(session=None)

    @patch("local_deep_research.storage.factory.DatabaseWithFileBackupStorage")
    @patch("local_deep_research.storage.factory.get_setting_from_snapshot")
    def test_explicit_false_skips_settings_lookup(
        self, mock_get_setting, mock_storage_cls
    ):
        """enable_file_backup=False never calls get_setting_from_snapshot."""
        mock_session = MagicMock()
        get_report_storage(session=mock_session, enable_file_backup=False)
        mock_get_setting.assert_not_called()

    @patch("local_deep_research.storage.factory.DatabaseWithFileBackupStorage")
    @patch("local_deep_research.storage.factory.get_setting_from_snapshot")
    def test_explicit_true_skips_settings_lookup(
        self, mock_get_setting, mock_storage_cls
    ):
        """enable_file_backup=True never calls get_setting_from_snapshot."""
        mock_session = MagicMock()
        get_report_storage(session=mock_session, enable_file_backup=True)
        mock_get_setting.assert_not_called()

    @patch("local_deep_research.storage.factory.DatabaseWithFileBackupStorage")
    def test_factory_propagates_session_to_storage(self, mock_storage_cls):
        """Session is passed through to DatabaseWithFileBackupStorage."""
        mock_session = MagicMock()
        get_report_storage(session=mock_session, enable_file_backup=False)
        mock_storage_cls.assert_called_once_with(
            session=mock_session, enable_file_storage=False
        )


class TestQueueManagerBasics:
    """Test web/queue/manager.py basic operations."""

    def test_manager_import(self):
        """QueueManager can be imported."""
        from local_deep_research.web.queue.manager import QueueManager

        assert QueueManager is not None

    def test_manager_has_expected_methods(self):
        """QueueManager has expected public methods."""
        from local_deep_research.web.queue.manager import QueueManager

        assert hasattr(QueueManager, "add_to_queue")
        assert hasattr(QueueManager, "remove_from_queue")
        assert hasattr(QueueManager, "get_queue_position")
        assert hasattr(QueueManager, "get_user_queue")

    def test_queue_manager_add_to_queue_signature(self):
        """add_to_queue method exists and is callable."""
        from local_deep_research.web.queue.manager import QueueManager
        import inspect

        sig = inspect.signature(QueueManager.add_to_queue)
        # Should have self plus other params
        assert len(sig.parameters) > 1
