forked from erp-dev/erp
feat: printing module
This commit is contained in:
1
stateflow/tests/__init__.py
Normal file
1
stateflow/tests/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# Stateflow tests
|
||||
182
stateflow/tests/test_step_back.py
Normal file
182
stateflow/tests/test_step_back.py
Normal file
@@ -0,0 +1,182 @@
|
||||
"""
|
||||
测试单步回退功能
|
||||
"""
|
||||
from django.test import TestCase
|
||||
from django.contrib.auth import get_user_model
|
||||
from stateflow import models, services
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
|
||||
class StepBackTestCase(TestCase):
|
||||
"""测试单步回退功能"""
|
||||
|
||||
def setUp(self):
|
||||
# 创建测试用户
|
||||
self.user = User.objects.create_user(username='testuser', password='testpass')
|
||||
|
||||
# 创建状态
|
||||
self.state1 = models.State.objects.create(name='状态1', description='第一个状态')
|
||||
self.state2 = models.State.objects.create(name='状态2', description='第二个状态')
|
||||
self.state3 = models.State.objects.create(name='状态3', description='第三个状态')
|
||||
|
||||
# 创建流程
|
||||
self.process = models.Process.objects.create(name='测试流程', description='三个状态的测试流程')
|
||||
|
||||
# 创建流程节点
|
||||
models.ProcessNode.objects.create(process=self.process, state=self.state1, order=1)
|
||||
models.ProcessNode.objects.create(process=self.process, state=self.state2, order=2)
|
||||
models.ProcessNode.objects.create(process=self.process, state=self.state3, order=3)
|
||||
|
||||
# 创建业务对象
|
||||
self.business_object = models.BusinessObject.objects.create(
|
||||
name='测试业务对象',
|
||||
process=self.process,
|
||||
description='测试回退功能'
|
||||
)
|
||||
|
||||
def test_step_back_from_not_started(self):
|
||||
"""测试从未开始状态回退(应该返回失败)"""
|
||||
success, message = services.step_back_one_state(self.business_object, self.user)
|
||||
|
||||
self.assertFalse(success)
|
||||
self.assertIn('没有任何状态流转记录', message)
|
||||
|
||||
# 验证仍然是未开始状态
|
||||
self.assertEqual(services.get_overall_status(self.business_object), 'not_started')
|
||||
|
||||
def test_step_back_from_first_state(self):
|
||||
"""测试从第一个状态回退到未开始"""
|
||||
# 推进到第一个状态
|
||||
success, _ = services.advance_to_next_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
|
||||
# 验证当前在第一个状态(进行中,准备完成第二个状态)
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current_state.id, self.state2.id)
|
||||
|
||||
# 回退一步
|
||||
success, message = services.step_back_one_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
self.assertIn('状态1', message)
|
||||
|
||||
# 验证回到未开始状态
|
||||
self.assertEqual(services.get_overall_status(self.business_object), 'not_started')
|
||||
|
||||
# 验证状态1的记录已被撤销
|
||||
record = models.StateFlowRecord.objects.filter(
|
||||
business_object=self.business_object,
|
||||
state=self.state1
|
||||
).first()
|
||||
self.assertTrue(record.is_cancelled)
|
||||
self.assertIsNotNone(record.cancelled_at)
|
||||
|
||||
def test_step_back_from_middle_state(self):
|
||||
"""测试从中间状态回退"""
|
||||
# 推进到第二个状态
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
|
||||
# 验证当前在第二个状态(进行中,准备完成第三个状态)
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current_state.id, self.state3.id)
|
||||
|
||||
# 回退一步
|
||||
success, message = services.step_back_one_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
self.assertIn('状态2', message)
|
||||
|
||||
# 验证回到第一个状态(进行中,准备完成第二个状态)
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current_state.id, self.state2.id)
|
||||
|
||||
# 验证状态2的记录已被撤销
|
||||
record = models.StateFlowRecord.objects.filter(
|
||||
business_object=self.business_object,
|
||||
state=self.state2
|
||||
).first()
|
||||
self.assertTrue(record.is_cancelled)
|
||||
|
||||
def test_step_back_from_completed(self):
|
||||
"""测试从已完成状态回退"""
|
||||
# 推进到完成
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
|
||||
# 验证已完成
|
||||
self.assertEqual(services.get_overall_status(self.business_object), 'completed')
|
||||
|
||||
# 回退一步
|
||||
success, message = services.step_back_one_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
self.assertIn('状态3', message)
|
||||
|
||||
# 验证回到进行中状态(准备完成第三个状态)
|
||||
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.id, self.state3.id)
|
||||
|
||||
def test_step_back_multiple_times(self):
|
||||
"""测试多次回退"""
|
||||
# 推进到完成
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
|
||||
# 第一次回退
|
||||
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.id, self.state3.id)
|
||||
|
||||
# 第二次回退
|
||||
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.id, self.state2.id)
|
||||
|
||||
# 第三次回退
|
||||
success, _ = services.step_back_one_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
self.assertEqual(services.get_overall_status(self.business_object), 'not_started')
|
||||
|
||||
# 第四次回退(应该失败)
|
||||
success, message = services.step_back_one_state(self.business_object, self.user)
|
||||
self.assertFalse(success)
|
||||
self.assertIn('没有任何状态流转记录', message)
|
||||
|
||||
def test_advance_after_step_back(self):
|
||||
"""测试回退后再前进"""
|
||||
# 推进两步
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
|
||||
# 回退一步
|
||||
services.step_back_one_state(self.business_object, self.user)
|
||||
|
||||
# 再前进
|
||||
success, _ = services.advance_to_next_state(self.business_object, self.user)
|
||||
self.assertTrue(success)
|
||||
|
||||
# 验证当前在第二个状态
|
||||
current_state = services.get_business_object_current_state(self.business_object)
|
||||
self.assertEqual(current_state.id, self.state3.id)
|
||||
|
||||
def test_step_back_preserves_history(self):
|
||||
"""测试回退操作保留历史记录"""
|
||||
# 推进两步
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
services.advance_to_next_state(self.business_object, self.user)
|
||||
|
||||
# 回退一步
|
||||
services.step_back_one_state(self.business_object, self.user)
|
||||
|
||||
# 验证记录仍然存在,只是被标记为已撤销
|
||||
all_records = models.StateFlowRecord.objects.filter(
|
||||
business_object=self.business_object
|
||||
).order_by('completed_at')
|
||||
|
||||
self.assertEqual(all_records.count(), 2)
|
||||
self.assertFalse(all_records[0].is_cancelled) # 状态1未撤销
|
||||
self.assertTrue(all_records[1].is_cancelled) # 状态2已撤销
|
||||
81
stateflow/tests/test_step_back_api.py
Normal file
81
stateflow/tests/test_step_back_api.py
Normal file
@@ -0,0 +1,81 @@
|
||||
"""
|
||||
测试 step_back API 端点
|
||||
"""
|
||||
from django.test import TestCase
|
||||
from rest_framework.test import APIClient
|
||||
from rest_framework import status
|
||||
from django.contrib.auth import get_user_model
|
||||
from stateflow import models
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
|
||||
class StepBackAPITestCase(TestCase):
|
||||
"""测试单步回退 API"""
|
||||
|
||||
def setUp(self):
|
||||
self.client = APIClient()
|
||||
|
||||
# 创建用户
|
||||
self.user = User.objects.create_user(username='testuser', password='testpass')
|
||||
self.client.force_authenticate(user=self.user)
|
||||
|
||||
# 创建状态
|
||||
self.state1 = models.State.objects.create(name='状态1')
|
||||
self.state2 = models.State.objects.create(name='状态2')
|
||||
self.state3 = models.State.objects.create(name='状态3')
|
||||
|
||||
# 创建流程
|
||||
self.process = models.Process.objects.create(name='测试流程')
|
||||
models.ProcessNode.objects.create(process=self.process, state=self.state1, order=1)
|
||||
models.ProcessNode.objects.create(process=self.process, state=self.state2, order=2)
|
||||
models.ProcessNode.objects.create(process=self.process, state=self.state3, order=3)
|
||||
|
||||
# 创建业务对象
|
||||
self.business_object = models.BusinessObject.objects.create(
|
||||
name='测试对象',
|
||||
process=self.process
|
||||
)
|
||||
|
||||
def test_step_back_api_success(self):
|
||||
"""测试回退 API 成功"""
|
||||
# 先推进两步
|
||||
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/')
|
||||
|
||||
# 回退一步
|
||||
response = self.client.post(f'/api/v1/stateflow/business-objects/{self.business_object.id}/step_back/')
|
||||
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertTrue(response.data['success'])
|
||||
self.assertIn('状态2', response.data['message'])
|
||||
self.assertIn('business_object', response.data)
|
||||
|
||||
def test_step_back_api_not_started(self):
|
||||
"""测试未开始状态回退失败"""
|
||||
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_step_back_advance_cycle(self):
|
||||
"""测试前进-回退-前进循环"""
|
||||
# 前进
|
||||
response1 = self.client.post(f'/api/v1/stateflow/business-objects/{self.business_object.id}/advance/')
|
||||
self.assertEqual(response1.status_code, status.HTTP_200_OK)
|
||||
|
||||
# 回退
|
||||
response2 = self.client.post(f'/api/v1/stateflow/business-objects/{self.business_object.id}/step_back/')
|
||||
self.assertEqual(response2.status_code, status.HTTP_200_OK)
|
||||
|
||||
# 再前进
|
||||
response3 = self.client.post(f'/api/v1/stateflow/business-objects/{self.business_object.id}/advance/')
|
||||
self.assertEqual(response3.status_code, status.HTTP_200_OK)
|
||||
|
||||
# 验证数据库中有已撤销的记录
|
||||
cancelled_count = models.StateFlowRecord.objects.filter(
|
||||
business_object=self.business_object,
|
||||
is_cancelled=True
|
||||
).count()
|
||||
self.assertEqual(cancelled_count, 1)
|
||||
Reference in New Issue
Block a user