"""Shared fixtures for socket-service tests.

The chat feature added a research-ownership guard to
``SocketIOService.__handle_subscribe`` so that an authenticated user
cannot subscribe to another user's research_id. The check pulls
``username`` from ``flask.session`` and consults the user's encrypted
DB via the new ``_user_owns_research`` helper.

Pre-existing socket-service tests in this directory exercise the
subscription bookkeeping (set membership, snapshot emit, etc.) and do
NOT set up a Flask request context or a real DB. To keep their intent
intact, this autouse fixture mocks the new authorization layer so every
test in this directory exercises the subscribe-as-owner code path
unless it opts out by overriding the fixtures.

Tests that explicitly want to exercise the negative path
(``_user_owns_research → False`` or ``session.get("username") → None``)
should override the relevant mock with their own ``patch.object`` call
inside the test body.
"""

from unittest.mock import patch

import pytest


@pytest.fixture(autouse=True)
def _allow_socket_subscribe(monkeypatch):
    """Patch ``socket_service.session`` and ``_user_owns_research`` so
    tests that call ``__handle_subscribe`` don't crash on the new
    ownership check.

    Scope: function. The patches are torn down at test exit.
    """
    # Lazy import — keep this conftest cheap for tests that never touch
    # the socket service at all. Some tests in this dir import via
    # ``local_deep_research...`` while others use ``src.local_deep_research...``;
    # Python may cache them as separate module identities, so resolve
    # whichever is importable and patch its session binding.
    try:
        from local_deep_research.web.services.socket_service import (
            SocketIOService,
        )

        module_path = "local_deep_research.web.services.socket_service"
    except ImportError:
        from src.local_deep_research.web.services.socket_service import (
            SocketIOService,
        )

        module_path = "src.local_deep_research.web.services.socket_service"

    with (
        patch(f"{module_path}.session", {"username": "test-owner"}),
        patch.object(SocketIOService, "_user_owns_research", return_value=True),
    ):
        yield
