智慧水务管理系统 - 精河县供水工程综合管理平台

test_data_engine.py 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. """
  2. 数据引擎单元测试
  3. 覆盖CRUD操作、批量导入功能
  4. """
  5. import unittest
  6. from unittest.mock import Mock, patch, MagicMock
  7. import json
  8. from src.data.engine import DataEngine
  9. from src.data.models import DataModel, BatchImportModel
  10. class TestDataEngine(unittest.TestCase):
  11. """数据引擎测试"""
  12. def setUp(self):
  13. self.engine = DataEngine("postgresql://localhost:5432/water_db")
  14. def test_create_operation(self):
  15. """测试数据创建"""
  16. test_data = {
  17. "device_id": "test_device_001",
  18. "timestamp": "2026-06-16T12:00:00Z",
  19. "temperature": 25.5,
  20. "humidity": 60.2
  21. }
  22. with patch('src.data.engine.session') as mock_session:
  23. mock_query = Mock()
  24. mock_query.return_value = Mock()
  25. mock_query.return_value.execute.return_value = Mock()
  26. mock_session.query.return_value = mock_query
  27. result = self.engine.create("sensor_data", test_data)
  28. self.assertTrue(result["success"])
  29. mock_session.add.assert_called_once()
  30. def test_read_operation(self):
  31. """测试数据读取"""
  32. device_id = "test_device_001"
  33. with patch('src.data.engine.session') as mock_session:
  34. mock_query = Mock()
  35. mock_session.query.return_value.filter.return_value.all.return_value = [
  36. {"device_id": device_id, "temperature": 25.5}
  37. ]
  38. results = self.engine.read("sensor_data", {"device_id": device_id})
  39. self.assertEqual(len(results), 1)
  40. self.assertEqual(results[0]["device_id"], device_id)
  41. def test_update_operation(self):
  42. """测试数据更新"""
  43. update_data = {"temperature": 26.0}
  44. condition = {"device_id": "test_device_001"}
  45. with patch('src.data.engine.session') as mock_session:
  46. mock_query = Mock()
  47. mock_session.query.return_value.filter.return_value.update.return_value = 1
  48. result = self.engine.update("sensor_data", update_data, condition)
  49. self.assertEqual(result["updated_count"], 1)
  50. def test_delete_operation(self):
  51. """测试数据删除"""
  52. condition = {"device_id": "test_device_001", "timestamp": "2026-06-16T12:00:00Z"}
  53. with patch('src.data.engine.session') as mock_session:
  54. mock_query = Mock()
  55. mock_session.query.return_value.filter.return_value.delete.return_value = 1
  56. result = self.engine.delete("sensor_data", condition)
  57. self.assertEqual(result["deleted_count"], 1)
  58. def test_batch_import(self):
  59. """测试批量导入"""
  60. batch_data = [
  61. {"device_id": "dev001", "temperature": 25.0, "timestamp": "2026-06-16T12:00:00Z"},
  62. {"device_id": "dev002", "temperature": 26.1, "timestamp": "2026-06-16T12:01:00Z"},
  63. {"device_id": "dev003", "temperature": 24.8, "timestamp": "2026-06-16T12:02:00Z"}
  64. ]
  65. with patch('src.data.engine.session') as mock_session:
  66. mock_batch_model = Mock()
  67. mock_session.bulk_save_objects.return_value = Mock()
  68. result = self.engine.batch_import("sensor_data", batch_data)
  69. self.assertEqual(result["imported_count"], 3)
  70. mock_session.bulk_save_objects.assert_called_once()
  71. def test_batch_import_validation(self):
  72. """测试批量导入数据验证"""
  73. batch_data = [
  74. {"device_id": "dev001", "temperature": "invalid_temp"}, # 无效温度
  75. {"device_id": "dev002", "temperature": 26.1}
  76. ]
  77. with patch('src.data.engine.DataModel.validate') as mock_validate:
  78. mock_validate.side_effect = [
  79. {"valid": False, "errors": ["Invalid temperature format"]},
  80. {"valid": True, "errors": []}
  81. ]
  82. result = self.engine.batch_import("sensor_data", batch_data)
  83. self.assertEqual(result["imported_count"], 1)
  84. self.assertEqual(result["validation_errors"], 1)
  85. class TestDataModel(unittest.TestCase):
  86. """数据模型测试"""
  87. def setUp(self):
  88. self.model = DataModel()
  89. def test_field_validation(self):
  90. """测试字段验证"""
  91. valid_data = {
  92. "device_id": "test_device",
  93. "timestamp": "2026-06-16T12:00:00Z",
  94. "temperature": 25.5,
  95. "humidity": 60.2
  96. }
  97. result = self.model.validate(valid_data)
  98. self.assertTrue(result["valid"])
  99. def test_invalid_data_validation(self):
  100. """测试无效数据验证"""
  101. invalid_data = {
  102. "device_id": "", # 空设备ID
  103. "temperature": "not_a_number", # 非数字温度
  104. "timestamp": "invalid_timestamp" # 无效时间戳
  105. }
  106. result = self.model.validate(invalid_data)
  107. self.assertFalse(result["valid"])
  108. self.assertGreater(len(result["errors"]), 0)
  109. class TestBatchImportModel(unittest.TestCase):
  110. """批量导入模型测试"""
  111. def setUp(self):
  112. self.batch_model = BatchImportModel()
  113. def test_batch_size_limit(self):
  114. """测试批量大小限制"""
  115. # 创建超过限制的数据
  116. large_batch = [{"device_id": f"dev{i}", "value": i} for i in range(1001)]
  117. result = self.batch_model.validate_batch(large_batch)
  118. self.assertFalse(result["valid"])
  119. self.assertIn("Batch size exceeds limit", result["errors"])
  120. def test_batch_structure_validation(self):
  121. """测试批量结构验证"""
  122. valid_batch = [
  123. {"device_id": "dev001", "value": 100},
  124. {"device_id": "dev002", "value": 200}
  125. ]
  126. result = self.batch_model.validate_batch(valid_batch)
  127. self.assertTrue(result["valid"])
  128. if __name__ == '__main__':
  129. unittest.main()