# tests/fixtures/testing_fixtures.py
"""
Testing utility fixtures for edge cases and error handling.

This module provides fixtures for:
- Empty database sessions for edge case testing
- Mock database sessions for error simulation
- Additional testing utilities
"""

from unittest.mock import Mock

import pytest
from sqlalchemy.exc import SQLAlchemyError


@pytest.fixture
def empty_db(db):
    """Empty database session for edge case testing"""
    from sqlalchemy import text

    # Clear only the tables that are relevant for admin service testing
    # In order to respect foreign key constraints
    tables_to_clear = [
        "marketplace_import_jobs",  # Has foreign keys to stores and users
        "products",  # Has foreign keys to stores and products
        "inventory",  # Fixed: singular not plural
        "products",  # Referenced by products
        "stores",  # Has foreign key to users
        "users",  # Base table
    ]

    for table in tables_to_clear:
        try:
            db.execute(text(f"DELETE FROM {table}"))  # noqa: SEC011
        except Exception:
            # If table doesn't exist or delete fails, continue
            pass

    db.commit()
    return db


@pytest.fixture
def db_with_error():
    """Database session that raises errors for testing error handling"""
    mock_db = Mock()

    # Configure the mock to raise SQLAlchemy errors on query operations
    mock_db.query.side_effect = SQLAlchemyError("Database connection failed")
    mock_db.add.side_effect = SQLAlchemyError("Database insert failed")
    mock_db.commit.side_effect = SQLAlchemyError("Database commit failed")
    mock_db.rollback.return_value = None

    return mock_db
