您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

services_test_help.py 2.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from unittest.mock import MagicMock
  2. class ServiceDbTestHelper:
  3. """
  4. Helper class for service database query tests.
  5. """
  6. @staticmethod
  7. def setup_db_query_filter_by_mock(mock_db, query_results):
  8. """
  9. Smart database query mock that responds based on model type and query parameters.
  10. Args:
  11. mock_db: Mock database session
  12. query_results: Dict mapping (model_name, filter_key, filter_value) to return value
  13. Example: {('Account', 'email', 'test@example.com'): mock_account}
  14. """
  15. def query_side_effect(model):
  16. mock_query = MagicMock()
  17. def filter_by_side_effect(**kwargs):
  18. mock_filter_result = MagicMock()
  19. def first_side_effect():
  20. # Find matching result based on model and filter parameters
  21. for (model_name, filter_key, filter_value), result in query_results.items():
  22. if model.__name__ == model_name and filter_key in kwargs and kwargs[filter_key] == filter_value:
  23. return result
  24. return None
  25. mock_filter_result.first.side_effect = first_side_effect
  26. # Handle order_by calls for complex queries
  27. def order_by_side_effect(*args, **kwargs):
  28. mock_order_result = MagicMock()
  29. def order_first_side_effect():
  30. # Look for order_by results in the same query_results dict
  31. for (model_name, filter_key, filter_value), result in query_results.items():
  32. if (
  33. model.__name__ == model_name
  34. and filter_key == "order_by"
  35. and filter_value == "first_available"
  36. ):
  37. return result
  38. return None
  39. mock_order_result.first.side_effect = order_first_side_effect
  40. return mock_order_result
  41. mock_filter_result.order_by.side_effect = order_by_side_effect
  42. return mock_filter_result
  43. mock_query.filter_by.side_effect = filter_by_side_effect
  44. return mock_query
  45. mock_db.session.query.side_effect = query_side_effect