sentiment-api / tests /conftest.py
Syed Arfan
Fix tests to run independently without external services
8ba68cb
"""
Test configuration and fixtures
Sets up test database (SQLite in-memory) and mocks Redis cache
so tests can run independently without external services.
"""
import pytest
import sys
from unittest.mock import MagicMock, patch
# Mock Redis BEFORE importing any app modules
mock_redis = MagicMock()
mock_redis.get.return_value = None
mock_redis.setex.return_value = True
mock_redis.keys.return_value = []
mock_redis.delete.return_value = True
mock_redis.dbsize.return_value = 0
mock_redis.info.return_value = {"used_memory": 0, "keyspace_hits": 0, "keyspace_misses": 0}
# Patch redis.from_url before cache module is imported
with patch('redis.from_url', return_value=mock_redis):
# Now import the app modules
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool
from src.database import Base, get_db
from src.main import app
# Create in-memory SQLite database for testing
SQLALCHEMY_DATABASE_URL = "sqlite:///:memory:"
test_engine = create_engine(
SQLALCHEMY_DATABASE_URL,
connect_args={"check_same_thread": False},
poolclass=StaticPool,
)
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=test_engine)
# Create tables
Base.metadata.create_all(bind=test_engine)
def override_get_db():
"""Provide test database session"""
db = TestingSessionLocal()
try:
yield db
finally:
db.close()
# Override the dependency
app.dependency_overrides[get_db] = override_get_db
@pytest.fixture(scope="module")
def client():
"""Create test client with mocked dependencies"""
from fastapi.testclient import TestClient
with TestClient(app) as c:
yield c