AskXeno / tests /conftest.py
github-actions
Sync from GitHub
3cdce90
"""
Pytest configuration file
Sets up test environment and fixtures
"""
import os
import sys
from unittest.mock import MagicMock, Mock, patch
import pytest
# Add src to path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
# Set mock environment variables before importing any modules
os.environ.setdefault("GEMINI_API_KEY", "test-api-key-12345")
# Mock Google Sheets credentials
mock_credentials = {
"type": "service_account",
"project_id": "test-project",
"private_key_id": "test-key-id",
"private_key": "-----BEGIN PRIVATE KEY-----\ntest\n-----END PRIVATE KEY-----\n",
"client_email": "test@test.iam.gserviceaccount.com",
"client_id": "12345",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/test",
}
import json
os.environ.setdefault("GOOGLE_SHEETS_CREDENTIALS", json.dumps(mock_credentials))
# Mock google.oauth2 and gspread modules before src.logger imports them
mock_credentials_class = MagicMock()
mock_creds_instance = MagicMock()
mock_credentials_class.from_service_account_info = Mock(
return_value=mock_creds_instance
)
mock_oauth2 = MagicMock()
mock_oauth2.service_account.Credentials = mock_credentials_class
sys.modules["google.oauth2"] = mock_oauth2
sys.modules["google.oauth2.service_account"] = mock_oauth2.service_account
mock_gspread = MagicMock()
mock_spreadsheet = MagicMock()
mock_worksheet = MagicMock()
mock_worksheet.append_row = Mock()
mock_spreadsheet.get_worksheet = Mock(return_value=mock_worksheet)
mock_spreadsheet.worksheet = Mock(return_value=mock_worksheet)
mock_spreadsheet.add_worksheet = Mock(return_value=mock_worksheet)
mock_client = MagicMock()
mock_client.open = Mock(return_value=mock_spreadsheet)
mock_gspread.authorize = Mock(return_value=mock_client)
sys.modules["gspread"] = mock_gspread
@pytest.fixture(autouse=True)
def mock_google_sheets():
"""Mock Google Sheets to avoid actual connections during testing"""
with patch("src.logger.response_sheet") as mock_response, patch(
"src.logger.timing_sheet"
) as mock_timing:
mock_response.append_row = Mock()
mock_timing.append_row = Mock()
yield mock_response, mock_timing
@pytest.fixture
def mock_genai():
"""Mock Google Generative AI"""
with patch("google.generativeai.configure") as mock_config, patch(
"google.generativeai.GenerativeModel"
) as mock_model, patch("google.generativeai.embed_content") as mock_embed:
yield {"configure": mock_config, "model": mock_model, "embed": mock_embed}
@pytest.fixture
def mock_chromadb():
"""Mock ChromaDB client"""
with patch("chromadb.PersistentClient") as mock_client:
mock_collection = Mock()
mock_client.return_value.get_collection.return_value = mock_collection
yield mock_client
@pytest.fixture
def mock_sqlite():
"""Mock SQLite connections for memory"""
with patch("sqlite3.connect") as mock_connect:
mock_conn = Mock()
mock_connect.return_value = mock_conn
yield mock_conn
@pytest.fixture
def sample_documents():
"""Provide sample documents for testing"""
doc1 = Mock()
doc1.page_content = (
"Question: How do I create an account?\nAnswer: Visit our website."
)
doc1.metadata = {
"id": "KB001",
"question": "How do I create an account?",
"content": "Visit our website.",
"section": "Account Management",
}
doc2 = Mock()
doc2.page_content = "Question: What are the fees?\nAnswer: 1% per transaction."
doc2.metadata = {
"id": "KB002",
"question": "What are the fees?",
"content": "1% per transaction.",
"section": "Fees",
}
return [doc1, doc2]
@pytest.fixture
def mock_genai_client():
"""Mock Google Generative AI client with new SDK structure"""
with patch("src.config.genai_client") as mock_client:
# Mock generate_content for LLM
mock_generate_response = Mock()
mock_generate_response.text = "Test response from LLM"
mock_client.models.generate_content.return_value = mock_generate_response
# Mock embed_content for embeddings
mock_embedding = Mock()
mock_embedding.values = [0.1, 0.2, 0.3]
mock_embed_response = Mock()
mock_embed_response.embeddings = [mock_embedding]
mock_client.models.embed_content.return_value = mock_embed_response
yield mock_client