forked from erp-dev/erp
patch: patch testing (api & services)
This commit is contained in:
@@ -73,9 +73,10 @@ class BusinessObjectAPITestCase(TestCase):
|
||||
self.assertTrue(response.data['success'])
|
||||
self.assertIn('重置', response.data['message'])
|
||||
|
||||
# 验证进度已重置
|
||||
# 验证进度已重置(current_state 返回第一个待执行的节点)
|
||||
self.business_object.refresh_from_db()
|
||||
self.assertIsNone(services.get_business_object_current_state(self.business_object))
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current_state.name, self.state1.name)
|
||||
self.assertEqual(self.business_object.state_logs.filter(is_cancelled=False).count(), 0)
|
||||
|
||||
def test_reset_api_not_started(self):
|
||||
@@ -120,8 +121,8 @@ class BusinessObjectAPITestCase(TestCase):
|
||||
self.assertEqual(response.data[0]['completed_by'], 'testuser')
|
||||
self.assertFalse(response.data[0]['is_cancelled'])
|
||||
|
||||
# 其他状态仍是待执行
|
||||
self.assertEqual(response.data[1]['status'], 'not_started')
|
||||
# 第二个状态是进行中(下一个待执行的)
|
||||
self.assertEqual(response.data[1]['status'], 'in_progress')
|
||||
self.assertEqual(response.data[2]['status'], 'not_started')
|
||||
|
||||
def test_timeline_api_with_step_back(self):
|
||||
@@ -469,3 +470,59 @@ class BusinessObjectAPITestCase(TestCase):
|
||||
self.assertIsNotNone(item['completed_at'])
|
||||
self.assertIsNotNone(item['completed_by'])
|
||||
self.assertFalse(item['is_cancelled'])
|
||||
|
||||
def test_advance_when_already_completed(self):
|
||||
"""测试流程已完成时尝试推进(预期错误)"""
|
||||
# 完成所有状态
|
||||
self.client.post(
|
||||
f'/api/v1/stateflow/business-objects/{self.business_object.id}/advance/',
|
||||
{'parameters': {'temperature': '25.5'}},
|
||||
format='json'
|
||||
)
|
||||
self.client.post(f'/api/v1/stateflow/business-objects/{self.business_object.id}/advance/')
|
||||
self.client.post(f'/api/v1/stateflow/business-objects/{self.business_object.id}/advance/')
|
||||
|
||||
# 验证已完成
|
||||
self.assertEqual(services.get_overall_status(self.business_object), 'completed')
|
||||
|
||||
# 尝试再次推进(应该失败)
|
||||
response = self.client.post(
|
||||
f'/api/v1/stateflow/business-objects/{self.business_object.id}/advance/'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||
self.assertFalse(response.data['success'])
|
||||
self.assertIn('流程已完成', response.data['message'])
|
||||
self.assertIn('无法继续推进', response.data['message'])
|
||||
|
||||
def test_step_back_when_not_started(self):
|
||||
"""测试未开始时尝试回退(预期错误)"""
|
||||
# 验证未开始
|
||||
self.assertEqual(services.get_overall_status(self.business_object), 'not_started')
|
||||
|
||||
# 尝试回退(应该失败)
|
||||
response = self.client.post(
|
||||
f'/api/v1/stateflow/business-objects/{self.business_object.id}/step_back/'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||
self.assertFalse(response.data['success'])
|
||||
self.assertIn('没有任何状态流转记录', response.data['message'])
|
||||
|
||||
def test_advance_process_without_nodes(self):
|
||||
"""测试流程没有节点时尝试推进(预期错误)"""
|
||||
# 创建一个没有节点的流程
|
||||
empty_process = models.Process.objects.create(name='空流程')
|
||||
empty_business_object = models.BusinessObject.objects.create(
|
||||
name='空业务对象',
|
||||
process=empty_process
|
||||
)
|
||||
|
||||
# 尝试推进(应该失败)
|
||||
response = self.client.post(
|
||||
f'/api/v1/stateflow/business-objects/{empty_business_object.id}/advance/'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||
self.assertFalse(response.data['success'])
|
||||
self.assertIn('流程没有任何节点', response.data['message'])
|
||||
|
||||
@@ -72,9 +72,9 @@ class ParameterManagementTestCase(TestCase):
|
||||
self.assertIn('temperature', message)
|
||||
self.assertIsNone(state_log)
|
||||
|
||||
# 验证状态未改变
|
||||
# 验证状态未改变(仍然是第一个待执行的节点)
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertIsNone(current_state)
|
||||
self.assertEqual(current_state.name, self.state1.name)
|
||||
|
||||
# 验证没有创建状态流转记录
|
||||
self.assertEqual(self.business_object.state_logs.count(), 0)
|
||||
@@ -92,9 +92,9 @@ class ParameterManagementTestCase(TestCase):
|
||||
self.assertTrue(success)
|
||||
self.assertIsNotNone(state_log)
|
||||
|
||||
# 验证状态已推进
|
||||
# 验证状态已推进(下一个待执行的是 state2)
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current_state.name, self.state1.name)
|
||||
self.assertEqual(current_state.name, self.state2.name)
|
||||
|
||||
# 验证参数记录已创建
|
||||
self.assertEqual(state_log.parameter_records.count(), 1)
|
||||
|
||||
@@ -42,9 +42,9 @@ class StateFlowServicesTestCase(TestCase):
|
||||
)
|
||||
|
||||
def test_initial_state(self):
|
||||
"""测试初始状态 - 应该是 None(未开始)"""
|
||||
"""测试初始状态 - 应该返回第一个待执行的节点"""
|
||||
current_state = self.business_object.get_current_state()
|
||||
self.assertIsNone(current_state, '初始状态应该是 None(未开始)')
|
||||
self.assertEqual(current_state.name, self.state1.name, '初始状态应该返回第一个待执行的节点')
|
||||
self.assertEqual(self.business_object.get_progress_percentage(), 0.0)
|
||||
|
||||
# 整体状态应该是 not_started
|
||||
@@ -57,18 +57,18 @@ class StateFlowServicesTestCase(TestCase):
|
||||
success, message, _ = services.advance_to_next_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
|
||||
# current_state 应该是最后完成的状态(state1)
|
||||
# current_state 应该是下一个待执行的状态(state2)
|
||||
current_state = self.business_object.get_current_state()
|
||||
self.assertEqual(current_state.name, self.state1.name)
|
||||
self.assertEqual(current_state.name, self.state2.name)
|
||||
self.assertAlmostEqual(self.business_object.get_progress_percentage(), 33.33, places=1)
|
||||
|
||||
# 推进到状态2(完成state2)
|
||||
success, message, _ = services.advance_to_next_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
|
||||
# current_state 应该是 state2
|
||||
# current_state 应该是 state3(下一个待执行的)
|
||||
current_state = self.business_object.get_current_state()
|
||||
self.assertEqual(current_state.name, self.state2.name)
|
||||
self.assertEqual(current_state.name, self.state3.name)
|
||||
self.assertAlmostEqual(self.business_object.get_progress_percentage(), 66.67, places=1)
|
||||
|
||||
# 完成最后一个状态(state3)
|
||||
@@ -76,9 +76,9 @@ class StateFlowServicesTestCase(TestCase):
|
||||
self.assertTrue(success)
|
||||
self.assertEqual(self.business_object.get_progress_percentage(), 100.0)
|
||||
|
||||
# current_state 应该是 state3(最后完成的状态)
|
||||
# current_state 应该是 None(没有待执行的节点了)
|
||||
current_state = self.business_object.get_current_state()
|
||||
self.assertEqual(current_state.name, self.state3.name)
|
||||
self.assertIsNone(current_state)
|
||||
|
||||
# 整体状态应该是 completed
|
||||
status = services.get_overall_status(self.business_object)
|
||||
@@ -116,7 +116,7 @@ class StateFlowServicesTestCase(TestCase):
|
||||
|
||||
timeline = self.business_object.get_timeline()
|
||||
self.assertEqual(timeline[0]['status'], 'completed')
|
||||
self.assertEqual(timeline[1]['status'], 'not_started')
|
||||
self.assertEqual(timeline[1]['status'], 'in_progress') # 下一个待执行的节点
|
||||
self.assertEqual(timeline[2]['status'], 'not_started')
|
||||
self.assertIsNotNone(timeline[0]['completed_by'])
|
||||
self.assertEqual(timeline[0]['completed_by'].id, self.user.id)
|
||||
@@ -141,9 +141,9 @@ class StateFlowServicesTestCase(TestCase):
|
||||
cancelled_count = self.business_object.state_logs.filter(is_cancelled=True).count()
|
||||
self.assertEqual(cancelled_count, 2)
|
||||
|
||||
# 应该回到初始状态(未开始)
|
||||
# 应该回到初始状态(返回第一个待执行的节点)
|
||||
current_state = self.business_object.get_current_state()
|
||||
self.assertIsNone(current_state)
|
||||
self.assertEqual(current_state.name, self.state1.name)
|
||||
|
||||
# 所有撤销的记录都应该有撤销时间
|
||||
for log in self.business_object.state_logs.all():
|
||||
|
||||
@@ -51,9 +51,9 @@ class StepBackTestCase(TestCase):
|
||||
success, _, _ = services.advance_to_next_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
|
||||
# 验证 current_state 是 state1(最后完成的状态)
|
||||
# 验证 current_state 是 state2(下一个待执行的状态)
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current_state.name, self.state1.name)
|
||||
self.assertEqual(current_state.name, self.state2.name)
|
||||
|
||||
# 回退一步
|
||||
success, message = services.step_back_one_state(self.business_object, self.user)
|
||||
@@ -63,7 +63,7 @@ class StepBackTestCase(TestCase):
|
||||
# 验证回到未开始状态
|
||||
self.assertEqual(services.get_overall_status(self.business_object), 'not_started')
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertIsNone(current_state)
|
||||
self.assertEqual(current_state.name, self.state1.name)
|
||||
|
||||
# 验证状态1的记录已被撤销
|
||||
record = models.StateFlowRecord.objects.filter(
|
||||
@@ -79,18 +79,18 @@ class StepBackTestCase(TestCase):
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
|
||||
# 验证 current_state 是 state2(最后完成的状态)
|
||||
# 验证 current_state 是 state3(下一个待执行的状态)
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current_state.name, self.state2.name)
|
||||
self.assertEqual(current_state.name, self.state3.name)
|
||||
|
||||
# 回退一步
|
||||
success, message = services.step_back_one_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
self.assertIn('状态2', message)
|
||||
|
||||
# 验证 current_state 变为state1
|
||||
# 验证 current_state 变为 state2(下一个待执行的)
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current_state.name, self.state1.name)
|
||||
self.assertEqual(current_state.name, self.state2.name)
|
||||
|
||||
# 验证状态2的记录已被撤销
|
||||
record = models.StateFlowRecord.objects.filter(
|
||||
@@ -106,20 +106,20 @@ class StepBackTestCase(TestCase):
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
|
||||
# 验证已完成,current_state 是 state3
|
||||
# 验证已完成,current_state 是 None(没有待执行的节点)
|
||||
self.assertEqual(services.get_overall_status(self.business_object), 'completed')
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current_state.name, self.state3.name)
|
||||
self.assertIsNone(current_state)
|
||||
|
||||
# 回退一步
|
||||
success, message = services.step_back_one_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
self.assertIn('状态3', message)
|
||||
|
||||
# 验证回到进行中状态,current_state 变为state2
|
||||
# 验证回到进行中状态,current_state 变为 state3(下一个待执行的)
|
||||
self.assertEqual(services.get_overall_status(self.business_object), 'in_progress')
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current_state.name, self.state2.name)
|
||||
self.assertEqual(current_state.name, self.state3.name)
|
||||
|
||||
def test_step_back_multiple_times(self):
|
||||
"""测试多次回退"""
|
||||
@@ -132,13 +132,13 @@ class StepBackTestCase(TestCase):
|
||||
success, _ = services.step_back_one_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
current = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current.name, self.state2.name)
|
||||
self.assertEqual(current.name, self.state3.name)
|
||||
|
||||
# 第二次回退(撤销 state2)
|
||||
success, _ = services.step_back_one_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
current = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current.name, self.state1.name)
|
||||
self.assertEqual(current.name, self.state2.name) # 下一个待执行的是 state2
|
||||
|
||||
# 第三次回退
|
||||
success, _ = services.step_back_one_state(self.business_object, self.user)
|
||||
@@ -163,9 +163,9 @@ class StepBackTestCase(TestCase):
|
||||
success, _, _ = services.advance_to_next_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
|
||||
# 验证 current_state 是 state2(最后完成的)
|
||||
# 验证 current_state 是 state3(下一个待执行的)
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current_state.name, self.state2.name)
|
||||
self.assertEqual(current_state.name, self.state3.name)
|
||||
|
||||
def test_step_back_preserves_history(self):
|
||||
"""测试回退操作保留历史记录"""
|
||||
|
||||
Reference in New Issue
Block a user