import unittest from unittest.mock import MagicMock from app.modules.cases.repository import CaseRepository from core.database import CaseNote, User class TestCaseNoteNPlus1(unittest.TestCase): def test_get_notes_optimized(self): """ Verify that fetching notes now uses joinedload (options) to prevent N+1 queries. """ # Mock database session mock_session = MagicMock() # Setup test data case_id = "test-case-id" user1 = User(id="user-1", full_name="User 1") user2 = User(id="user-2", full_name="User 2") note1 = CaseNote(id="note-1", case_id=case_id, user_id=user1.id) note2 = CaseNote(id="note-2", case_id=case_id, user_id=user2.id) # Mock the initial query for notes mock_query = mock_session.query.return_value # In the optimized version, we expect .options(...) to be called mock_options = mock_query.options.return_value mock_filter = mock_options.filter.return_value mock_order = mock_filter.order_by.return_value mock_order.all.return_value = [note1, note2] repo = CaseRepository(mock_session) repo.get_notes(case_id) # Initial query should be called mock_session.query.assert_called_with(CaseNote) # Check if 'options' was called on the query object has_options_call = False # We need to check calls on mock_query for call_obj in mock_query.mock_calls: if call_obj[0] == "options": has_options_call = True self.assertTrue(has_options_call, "options() SHOULD be called now (confirming optimized state)") print("Confirmed: options() IS called in get_notes") if __name__ == "__main__": unittest.main()