forked from erp-dev/erp
228 lines
8.5 KiB
Python
228 lines
8.5 KiB
Python
"""
|
||
PlateOrder 模型测试
|
||
"""
|
||
from django.test import TestCase
|
||
from django.contrib.auth import get_user_model
|
||
from django.utils import timezone
|
||
from decimal import Decimal
|
||
from printing import models as printing_models
|
||
from basic_info import models as basic_models
|
||
from stateflow import models as stateflow_models
|
||
|
||
User = get_user_model()
|
||
|
||
|
||
class PlateOrderModelTestCase(TestCase):
|
||
"""测试 PlateOrder 模型"""
|
||
|
||
def setUp(self):
|
||
"""设置测试数据"""
|
||
self.user = User.objects.create_user(username='testuser', password='testpass')
|
||
|
||
# 创建商户
|
||
self.merchant = basic_models.Merchant.objects.create(
|
||
name='测试印花厂',
|
||
type=basic_models.MerchantTypeEnum.FACTORY
|
||
)
|
||
|
||
# 创建客户
|
||
self.customer = basic_models.Customer.objects.create(
|
||
merchant=self.merchant,
|
||
name='测试客户',
|
||
mobile='13900139000',
|
||
area='测试地区'
|
||
)
|
||
|
||
# 创建员工
|
||
self.salesperson = basic_models.Employee.objects.create(
|
||
sys_user=self.user,
|
||
merchant=self.merchant,
|
||
name='销售员',
|
||
mobile='13800138000',
|
||
job_type=basic_models.EmployeeTypeEnum.PRINTER,
|
||
status=basic_models.EmployeeStatusEnum.ACTIVE
|
||
)
|
||
|
||
self.merchandiser = basic_models.Employee.objects.create(
|
||
merchant=self.merchant,
|
||
name='跟单员',
|
||
mobile='13800138001',
|
||
job_type=basic_models.EmployeeTypeEnum.ROLLING,
|
||
status=basic_models.EmployeeStatusEnum.ACTIVE
|
||
)
|
||
|
||
def test_create_plate_order_basic(self):
|
||
"""测试创建基本的开版订单"""
|
||
plate_order = printing_models.PlateOrder.objects.create(
|
||
design_code='DES001',
|
||
customer=self.customer,
|
||
plate_type='首版',
|
||
urgency_level='正常',
|
||
style_name='测试款式',
|
||
fabric='纯棉',
|
||
width='150cm',
|
||
)
|
||
|
||
self.assertIsNotNone(plate_order.id)
|
||
self.assertEqual(plate_order.design_code, 'DES001')
|
||
self.assertEqual(plate_order.customer, self.customer)
|
||
self.assertEqual(plate_order.style_name, '测试款式')
|
||
|
||
def test_plate_order_with_employees(self):
|
||
"""测试带销售员和跟单员的开版订单"""
|
||
plate_order = printing_models.PlateOrder.objects.create(
|
||
design_code='DES002',
|
||
customer=self.customer,
|
||
salesperson=self.salesperson,
|
||
merchandiser=self.merchandiser,
|
||
urgency_level='加急',
|
||
)
|
||
|
||
self.assertEqual(plate_order.salesperson, self.salesperson)
|
||
self.assertEqual(plate_order.merchandiser, self.merchandiser)
|
||
self.assertEqual(plate_order.urgency_level, '加急')
|
||
|
||
def test_plate_order_with_ratings(self):
|
||
"""测试带质量评级的开版订单"""
|
||
plate_order = printing_models.PlateOrder.objects.create(
|
||
design_code='DES003',
|
||
customer=self.customer,
|
||
drawing_rating='A',
|
||
color_matching_rating='B',
|
||
sample_rating='A',
|
||
difficulty_rating='高',
|
||
is_mark_frame=True,
|
||
)
|
||
|
||
self.assertEqual(plate_order.drawing_rating, 'A')
|
||
self.assertEqual(plate_order.color_matching_rating, 'B')
|
||
self.assertEqual(plate_order.sample_rating, 'A')
|
||
self.assertEqual(plate_order.difficulty_rating, '高')
|
||
self.assertTrue(plate_order.is_mark_frame)
|
||
|
||
def test_plate_order_with_dates(self):
|
||
"""测试带时间信息的开版订单"""
|
||
now = timezone.now()
|
||
completion_date = now + timezone.timedelta(days=7)
|
||
required_date = (now + timezone.timedelta(days=10)).date()
|
||
|
||
plate_order = printing_models.PlateOrder.objects.create(
|
||
design_code='DES004',
|
||
customer=self.customer,
|
||
plate_date=now,
|
||
completion_date=completion_date,
|
||
required_completion_date=required_date,
|
||
)
|
||
|
||
self.assertIsNotNone(plate_order.plate_date)
|
||
self.assertIsNotNone(plate_order.completion_date)
|
||
self.assertIsNotNone(plate_order.required_completion_date)
|
||
|
||
def test_plate_order_with_sample_info(self):
|
||
"""测试带样品信息的开版订单"""
|
||
plate_order = printing_models.PlateOrder.objects.create(
|
||
design_code='DES005',
|
||
customer=self.customer,
|
||
sample_meter='米样1',
|
||
required_sample_meters=Decimal('100.50'),
|
||
)
|
||
|
||
self.assertEqual(plate_order.sample_meter, '米样1')
|
||
self.assertEqual(plate_order.required_sample_meters, Decimal('100.50'))
|
||
|
||
def test_plate_order_status_without_business_object(self):
|
||
"""测试没有 business_object 时的状态"""
|
||
plate_order = printing_models.PlateOrder.objects.create(
|
||
design_code='DES006',
|
||
customer=self.customer,
|
||
)
|
||
|
||
self.assertEqual(plate_order.status, '未开始')
|
||
self.assertFalse(plate_order.is_completed)
|
||
self.assertFalse(plate_order.has_started) # 因为没有 business_object
|
||
self.assertEqual(plate_order.progress_percentage, 0.0)
|
||
|
||
def test_plate_order_with_business_object(self):
|
||
"""测试带 business_object 的开版订单"""
|
||
# 创建流程
|
||
state1 = stateflow_models.State.objects.create(name='画图')
|
||
state2 = stateflow_models.State.objects.create(name='调色')
|
||
state3 = stateflow_models.State.objects.create(name='套样')
|
||
|
||
process = stateflow_models.Process.objects.create(name='开版流程')
|
||
process.replace_nodes([state1, state2, state3])
|
||
|
||
# 创建 BusinessObject
|
||
business_object = stateflow_models.BusinessObject.objects.create(
|
||
name='PlateOrder-Test',
|
||
process=process,
|
||
)
|
||
|
||
# 创建开版订单
|
||
plate_order = printing_models.PlateOrder.objects.create(
|
||
design_code='DES007',
|
||
customer=self.customer,
|
||
business_object=business_object,
|
||
)
|
||
|
||
self.assertIsNotNone(plate_order.business_object)
|
||
self.assertEqual(plate_order.progress_percentage, 0.0)
|
||
|
||
# 推进一个状态
|
||
from stateflow.services import advance_to_next_state
|
||
advance_to_next_state(business_object, self.user)
|
||
|
||
# 刷新并检查状态
|
||
plate_order.refresh_from_db()
|
||
self.assertEqual(plate_order.status, state1.name) # current_state 是最后完成的状态(state1)
|
||
self.assertFalse(plate_order.is_completed)
|
||
self.assertTrue(plate_order.has_started)
|
||
self.assertGreater(plate_order.progress_percentage, 0)
|
||
|
||
def test_plate_order_str(self):
|
||
"""测试字符串表示"""
|
||
plate_order = printing_models.PlateOrder.objects.create(
|
||
design_code='DES008',
|
||
customer=self.customer,
|
||
)
|
||
|
||
self.assertEqual(str(plate_order), f'PlateOrder-{plate_order.id}')
|
||
|
||
def test_plate_order_with_approval_and_order_status(self):
|
||
"""测试带审批和订单状态的开版订单"""
|
||
plate_order = printing_models.PlateOrder.objects.create(
|
||
design_code='DES009',
|
||
customer=self.customer,
|
||
approval_result='通过',
|
||
is_ordered=True,
|
||
customer_feedback='颜色需要调整',
|
||
)
|
||
|
||
self.assertEqual(plate_order.approval_result, '通过')
|
||
self.assertTrue(plate_order.is_ordered)
|
||
self.assertEqual(plate_order.customer_feedback, '颜色需要调整')
|
||
|
||
def test_plate_order_with_invalid_flag(self):
|
||
"""测试作废标记"""
|
||
plate_order = printing_models.PlateOrder.objects.create(
|
||
design_code='DES010',
|
||
customer=self.customer,
|
||
is_invalid=True,
|
||
)
|
||
|
||
self.assertTrue(plate_order.is_invalid)
|
||
|
||
def test_plate_order_nullable_fields(self):
|
||
"""测试可空字段"""
|
||
plate_order = printing_models.PlateOrder.objects.create(
|
||
customer=self.customer,
|
||
)
|
||
|
||
# 验证所有可空字段都可以为空
|
||
self.assertIsNone(plate_order.design_code)
|
||
self.assertIsNone(plate_order.plate_type)
|
||
self.assertIsNone(plate_order.plate_date)
|
||
self.assertIsNone(plate_order.salesperson)
|
||
self.assertIsNone(plate_order.merchandiser)
|
||
self.assertIsNone(plate_order.business_object)
|