test_basic_experiment_application.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. """基础实验申请单与售卖计划批量创建"""
  2. import unittest
  3. from unittest.mock import MagicMock, patch
  4. from app.crud import pilot_application as crud
  5. class TestBasicExperimentApplicationNo(unittest.TestCase):
  6. @patch("app.crud.pilot_application.datetime")
  7. def test_generate_application_no_basic_experiment_prefix(self, mock_dt):
  8. mock_dt.now.return_value.strftime.return_value = "20260610"
  9. db = MagicMock()
  10. mock_query = MagicMock()
  11. db.query.return_value = mock_query
  12. mock_query.filter.return_value = mock_query
  13. mock_query.order_by.return_value = mock_query
  14. mock_query.first.return_value = None
  15. result = crud._generate_application_no(db, "zkxw", biz_type="basic_experiment")
  16. self.assertTrue(result.startswith("JCSY"))
  17. self.assertNotIn("JCSQ", result)
  18. self.assertEqual(result, "JCSY202606100001")
  19. class TestBasicExperimentCreateValidation(unittest.TestCase):
  20. def test_create_basic_experiment_requires_customer_fields(self):
  21. db = MagicMock()
  22. data = {
  23. "bizType": "basic_experiment",
  24. "projectTitle": "课题A",
  25. "customerName": "",
  26. "customerContact": "张三",
  27. "customerPhone": "13800000000",
  28. }
  29. with self.assertRaises(ValueError) as ctx:
  30. crud.create_application(
  31. db,
  32. data=data,
  33. tenant_no="zkxw",
  34. user_id="user-1",
  35. dept_id="dept-1",
  36. )
  37. self.assertIn("客户名称", str(ctx.exception))
  38. class TestBasicExperimentSaleSchedules(unittest.TestCase):
  39. @patch("app.crud.pilot_application.create_schedule")
  40. @patch("app.crud.pilot_application._get_or_create_infusion_plan")
  41. def test_two_product_lines_create_two_schedules(self, mock_get_plan, mock_create_schedule):
  42. db = MagicMock()
  43. app = MagicMock()
  44. app.biz_type = "basic_experiment"
  45. plan = MagicMock()
  46. plan.id = "plan-1"
  47. mock_query = MagicMock()
  48. db.query.return_value = mock_query
  49. mock_query.filter.return_value = mock_query
  50. mock_query.first.return_value = app
  51. mock_query.scalar.return_value = 2
  52. mock_get_plan.return_value = plan
  53. mock_create_schedule.side_effect = [{"id": "sched-1"}, {"id": "sched-2"}]
  54. product_lines = [
  55. {
  56. "cellTypeName": "NK",
  57. "specText": "1e8",
  58. "pickupTime": "2026-06-15",
  59. "amount": 1000,
  60. "priceId": "p1",
  61. "projectCode": "C01",
  62. "projectName": "产品1",
  63. "agreementPrice": 1000,
  64. "actualPrice": 900,
  65. "quantity": 1,
  66. },
  67. {
  68. "cellTypeName": "T",
  69. "specText": "5e7",
  70. "pickupTime": "2026-06-20",
  71. "amount": 2000,
  72. "priceId": "p2",
  73. "projectCode": "C02",
  74. "projectName": "产品2",
  75. "agreementPrice": 2000,
  76. "actualPrice": 1800,
  77. "quantity": 2,
  78. },
  79. ]
  80. results = crud.create_basic_experiment_sale_schedules(
  81. db,
  82. application_id="app-1",
  83. product_lines=product_lines,
  84. tenant_no="zkxw",
  85. user_id="user-1",
  86. dept_id="dept-1",
  87. )
  88. self.assertEqual(len(results), 2)
  89. self.assertEqual(mock_create_schedule.call_count, 2)
  90. first_call = mock_create_schedule.call_args_list[0]
  91. self.assertEqual(first_call.kwargs.get("commit"), False)
  92. self.assertEqual(len(first_call.args[2].get("cellProducts", [])), 1)
  93. db.commit.assert_called_once()
  94. if __name__ == "__main__":
  95. unittest.main()