test_template.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import pytest
  2. import pytest_asyncio
  3. import asyncio
  4. from src.models.template_model import Template, TemplateType
  5. from src.manager.template_manager import TemplateManager, TemplateService
  6. from src.manager.core.db_mongo import BaseMongoManager
  7. from bson import json_util
  8. import json
  9. from utils.logu import get_logger
  10. logger = get_logger('test', console_level='DEBUG')
  11. @pytest.fixture(scope="module")
  12. def event_loop():
  13. """Create an instance of the default event loop for each test case."""
  14. loop = asyncio.get_event_loop_policy().new_event_loop()
  15. yield loop
  16. loop.close()
  17. @pytest_asyncio.fixture(scope="module")
  18. async def template_manager(event_loop):
  19. # 确保在同一个事件循环中执行
  20. logger.info("Initializing template manager...")
  21. manager = TemplateManager()
  22. await manager.initialize()
  23. try:
  24. yield manager
  25. finally:
  26. # 清理测试数据
  27. logger.info("Cleaning up test data...")
  28. await Template.find().delete()
  29. @pytest.mark.asyncio
  30. async def test_template_crud(template_manager):
  31. logger.info("Running test_template_crud...")
  32. # 测试创建模板
  33. logger.debug("Creating template...")
  34. template = await template_manager.create_template(
  35. name="test_agg",
  36. template_str=json.dumps([{"$match": {"name": "{{product_name}}"}}]),
  37. template_type=TemplateType.AGGREGATION,
  38. description="测试聚合模板"
  39. )
  40. logger.info(f"Created template: {template}")
  41. assert template.name == "test_agg"
  42. # 测试获取模板
  43. logger.debug("Fetching template...")
  44. fetched = await template_manager.get_template("test_agg")
  45. logger.info(f"Fetched template: {fetched}")
  46. assert fetched is not None
  47. assert fetched.description == "测试聚合模板"
  48. # 测试更新模板
  49. logger.debug("Updating template...")
  50. updated = await template_manager.update_template(
  51. "test_agg",
  52. new_description="更新后的描述"
  53. )
  54. logger.info(f"Updated template: {updated}")
  55. assert updated.description == "更新后的描述"
  56. # 测试删除模板
  57. logger.debug("Deleting template...")
  58. result = await template_manager.delete_template("test_agg")
  59. logger.info(f"Delete result: {result}")
  60. assert result is True
  61. assert await template_manager.get_template("test_agg") is None
  62. @pytest.mark.asyncio
  63. async def test_template_render(template_manager):
  64. logger.info("Running test_template_render...")
  65. # 创建测试模板
  66. logger.debug("Creating template for rendering...")
  67. await template_manager.create_template(
  68. name="render_test",
  69. template_str=json.dumps([{"$match": {"name": "{{product_name}}"}}]),
  70. template_type=TemplateType.AGGREGATION
  71. )
  72. # 测试渲染
  73. logger.debug("Rendering template...")
  74. context = {"product_name": "电线保护套"}
  75. pipeline = template_manager.render_template(
  76. '[{"$match": {"name": "{{product_name}}"}}]',
  77. context
  78. )
  79. logger.info(f"Rendered pipeline: {pipeline}")
  80. assert pipeline == [{"$match": {"name": "电线保护套"}}]
  81. @pytest.mark.asyncio
  82. async def test_template_execute(template_manager):
  83. logger.info("Running test_template_execute...")
  84. # 创建测试模板
  85. logger.debug("Creating template for execution...")
  86. await template_manager.create_template(
  87. name="exec_test",
  88. template_str=json.dumps([{"$match": {"basic_info.name": "{{product_name}}"}}]),
  89. template_type=TemplateType.AGGREGATION
  90. )
  91. # 测试执行(需要mock数据库或已有测试数据)
  92. try:
  93. logger.debug("Executing template...")
  94. result = await template_manager.execute_template(
  95. "exec_test",
  96. {"product_name": "电线保护套"}
  97. )
  98. logger.info(f"Execution result: {result}")
  99. assert isinstance(result, list)
  100. except Exception as e:
  101. logger.warning(f"Skipping test due to missing MongoDB or test data: {e}")
  102. pytest.skip(f"需要有效的MongoDB连接或测试数据: {e}")
  103. @pytest.mark.asyncio
  104. async def test_template_service():
  105. logger.info("Running test_template_service...")
  106. # 测试服务单例
  107. logger.debug("Getting TemplateService instance...")
  108. service1 = await TemplateService.get_instance()
  109. service2 = await TemplateService.get_instance()
  110. logger.info(f"Service1: {service1}, Service2: {service2}")
  111. assert service1 is service2