book-rec-with-LLMs / tests /test_integration.py
ymlin105's picture
feat: integrate A/B testing framework and enhance RAG diversity in recommendation system
b4bfa19
"""
End-to-end integration tests.
Uses mocked recommender/rec_service to avoid loading real models.
Tests full request/response flow for key endpoints.
"""
from unittest.mock import patch, MagicMock, AsyncMock
import pytest
from fastapi.testclient import TestClient
from src.main import app
def _mock_recommender():
mock = MagicMock()
mock.get_recommendations = AsyncMock(return_value=[
{"isbn": "123", "title": "Book A", "authors": "Author", "description": "", "thumbnail": "", "caption": ""},
])
mock.get_categories.return_value = ["All", "Fiction"]
mock.get_similar_books.return_value = []
mock.vector_db = MagicMock()
return mock
def _mock_rec_service():
mock = MagicMock()
mock.get_recommendations.return_value = []
mock.get_popular_books.return_value = []
return mock
def test_e2e_recommend_flow():
"""Full flow: POST /recommend -> 200 -> recommendations in response."""
mock_rec = _mock_recommender()
mock_svc = _mock_rec_service()
with patch("src.main.recommender", mock_rec), patch("src.main.rec_service", mock_svc):
client = TestClient(app)
response = client.post(
"/recommend",
json={"query": "thriller with plot twists", "category": "All", "user_id": "test"},
)
assert response.status_code == 200
data = response.json()
assert "recommendations" in data
assert len(data["recommendations"]) >= 1
book = data["recommendations"][0]
assert "isbn" in book and "title" in book
def test_e2e_personal_recommend_flow():
"""Full flow: GET /api/recommend/personal -> 200."""
mock_rec = _mock_recommender()
mock_svc = _mock_rec_service()
mock_svc.get_recommendations.return_value = [
("978123", 0.9, []),
("978456", 0.8, []),
]
mock_rec.vector_db.get_book_details.return_value = {
"title": "Test", "authors": "Auth", "description": "", "thumbnail": "",
}
with patch("src.main.recommender", mock_rec), patch("src.main.rec_service", mock_svc):
client = TestClient(app)
response = client.get("/api/recommend/personal?user_id=test&top_k=5")
assert response.status_code == 200
data = response.json()
assert "recommendations" in data