Spaces:
Sleeping
Sleeping
| from unittest.mock import MagicMock, patch | |
| import numpy as np | |
| def test_search_interventions_filters_by_score(): | |
| """ | |
| Ensures the search function correctly filters out results | |
| that are below the minimum similarity score threshold. | |
| """ | |
| from src.fot_recommender.rag_pipeline import search_interventions | |
| # 1. Arrange: Create mock objects and sample data | |
| mock_model = MagicMock() | |
| mock_index = MagicMock() | |
| # Fake knowledge base | |
| sample_kb = [{"id": 1, "content": "high score"}, {"id": 2, "content": "low score"}] | |
| # Configure the mock FAISS index to return specific scores and indices | |
| # Let's say it finds two results, one with a high score (0.9) and one low (0.3) | |
| mock_index.search.return_value = ( | |
| np.array([[0.9, 0.3]]), # scores | |
| np.array([[0, 1]]), # indices | |
| ) | |
| # 2. Act: Run the search with a minimum score of 0.5 | |
| results = search_interventions( | |
| query="test query", | |
| model=mock_model, | |
| index=mock_index, | |
| knowledge_base=sample_kb, | |
| k=2, | |
| min_similarity_score=0.5, | |
| ) | |
| # 3. Assert: Check that only the high-scoring result was returned | |
| assert len(results) == 1 | |
| assert results[0][0]["content"] == "high score" # Check the chunk content | |
| assert results[0][1] == 0.9 # Check the score | |
| def test_generate_recommendation_summary_builds_correct_prompt(): | |
| """ | |
| Ensures that the context from retrieved chunks and the student narrative | |
| are correctly formatted into the final prompt sent to the LLM. | |
| """ | |
| from src.fot_recommender.rag_pipeline import generate_recommendation_summary | |
| # 1. Arrange: Create sample inputs | |
| sample_chunks = [ | |
| ( | |
| { | |
| "title": "Tip 1", | |
| "original_content": "Do this.", | |
| "source_document": "doc_A", | |
| }, | |
| 0.9, | |
| ), | |
| ] | |
| student_narrative = "Student is struggling." | |
| # 2. Act & Assert: Use a patch to intercept the API call | |
| # This temporarily replaces genai.GenerativeModel with our mock | |
| with patch( | |
| "src.fot_recommender.rag_pipeline.genai.GenerativeModel" | |
| ) as mock_gen_model: | |
| # Create a mock instance that the function will use | |
| mock_model_instance = MagicMock() | |
| mock_gen_model.return_value = mock_model_instance | |
| generate_recommendation_summary( | |
| retrieved_chunks=sample_chunks, | |
| student_narrative=student_narrative, | |
| api_key="fake_key", | |
| persona="teacher", | |
| ) | |
| # 3. Assert: Check what our function tried to do | |
| # Was the API call made once? | |
| mock_model_instance.generate_content.assert_called_once() | |
| # Get the actual prompt that was passed to the LLM | |
| actual_prompt = mock_model_instance.generate_content.call_args[0][0] | |
| # Check if our key pieces of information are in the prompt | |
| assert "Student is struggling." in actual_prompt | |
| assert "--- Intervention Chunk 1 ---" in actual_prompt | |
| assert "Title: Tip 1" in actual_prompt | |
| assert "Content: Do this." in actual_prompt | |
| assert "(Source Document: doc_A)" in actual_prompt | |