"""
Shared pytest fixtures for all backend tests.

Strategy:
- Use mongomock to create an in-memory MongoDB per test.
- Directly set MongoDB.db to the mock database so get_database() returns it.
- Patch MongoDB.connect_db / close_db so FastAPI's lifespan doesn't try
  to connect to a real MongoDB server.
"""
import pytest
import mongomock
from unittest.mock import patch
from fastapi.testclient import TestClient


@pytest.fixture
def mock_db():
    """Fresh in-memory MongoDB database for each test."""
    client = mongomock.MongoClient()
    return client["test_grateful_journal"]


@pytest.fixture
def client(mock_db):
    """
    FastAPI TestClient with MongoDB replaced by an in-memory mock.

    Yields (TestClient, mock_db) so tests can inspect the database directly.
    """
    from db import MongoDB
    from main import app

    with (
        patch.object(MongoDB, "connect_db"),
        patch.object(MongoDB, "close_db"),
    ):
        MongoDB.db = mock_db
        with TestClient(app) as c:
            yield c, mock_db

    MongoDB.db = None
