import pytest
from sqlalchemy.exc import IntegrityError, DataError, DBAPIError
from src.exceptions import handle_sqlalchemy_error

def test_handle_sqlalchemy_error_unique_constraint():
    # Mocking IntegrityError is tricky, but we can check the string matching logic
    # In a real test we might want to actually raise these, but for unit testing the logic:
    err = IntegrityError("Unique constraint", params=None, orig=Exception("unique constraint violation"))
    msg, status = handle_sqlalchemy_error(err)
    assert status == 409
    assert "already exists" in msg

def test_handle_sqlalchemy_error_foreign_key():
    err = IntegrityError("Foreign key constraint", params=None, orig=Exception("foreign key constraint violation"))
    msg, status = handle_sqlalchemy_error(err)
    assert status == 400
    assert "Related record not found" in msg

def test_handle_sqlalchemy_error_data_error():
    err = DataError("Invalid data", params=None, orig=None)
    msg, status = handle_sqlalchemy_error(err)
    assert status == 400
    assert "Invalid data" in msg

def test_handle_sqlalchemy_error_generic_dbapi():
    # DBAPIError needs an 'orig' or it might fail some attribute checks depending on implementation
    # But let's test a generic one
    class MockError:
        def __str__(self):
            return "Some generic database error"
    
    err = DBAPIError("Generic error", params=None, orig=MockError())
    msg, status = handle_sqlalchemy_error(err)
    assert status == 500
    assert "Database error" in msg
