1
0
forked from erp-dev/erp
Files
erpnew/api_v1/views/printing/test_plate_order_api.py
2025-11-13 18:22:42 +08:00

563 lines
22 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
PlateOrder 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 django.contrib.auth.models import Permission
from basic_info import models as basic_models
from printing import models as printing_models
User = get_user_model()
class PlateOrderAPITestCase(TestCase):
"""测试 PlateOrder API"""
def setUp(self):
self.client = APIClient()
# 创建商户
self.merchant = basic_models.Merchant.objects.create(
name='测试商户',
type=basic_models.MerchantTypeEnum.FACTORY
)
# 创建用户
self.user = User.objects.create_user(
username='testuser',
password='testpass123',
email='test@example.com'
)
# 创建员工并关联商户
self.employee = 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.salesperson = basic_models.Employee.objects.create(
merchant=self.merchant,
name='测试业务员',
mobile='13800138001',
job_type=basic_models.EmployeeTypeEnum.PRINTER,
status=basic_models.EmployeeStatusEnum.ACTIVE
)
# 创建跟单员
self.merchandiser = basic_models.Employee.objects.create(
merchant=self.merchant,
name='测试跟单员',
mobile='13800138002',
job_type=basic_models.EmployeeTypeEnum.WARE,
status=basic_models.EmployeeStatusEnum.ACTIVE
)
# 创建客户
self.customer = basic_models.Customer.objects.create(
merchant=self.merchant,
name='测试客户',
mobile='13900139000',
area='测试地区'
)
# 认证用户
self.client.force_authenticate(user=self.user)
# 给用户添加基础权限
view_perm = Permission.objects.get(codename='view_plateorder')
add_perm = Permission.objects.get(codename='add_plateorder')
change_perm = Permission.objects.get(codename='change_plateorder')
delete_perm = Permission.objects.get(codename='delete_plateorder')
self.user.user_permissions.add(view_perm, add_perm, change_perm, delete_perm)
def test_create_plate_order(self):
"""测试创建开版订单"""
data = {
'customer': self.customer.id,
'design_code': 'DESIGN001',
'plate_type': '圆网',
'style_name': '测试款式',
'fabric': '棉布',
'width': '150cm',
'urgency_level': '加急',
'salesperson': self.salesperson.id,
'merchandiser': self.merchandiser.id,
}
response = self.client.post('/api/v1/plate-orders/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(response.data['design_code'], 'DESIGN001')
self.assertEqual(response.data['style_name'], '测试款式')
# 验证数据库中创建了记录
self.assertTrue(printing_models.PlateOrder.objects.filter(design_code='DESIGN001').exists())
def test_create_plate_order_without_customer(self):
"""测试创建开版订单时未提供客户"""
data = {
'design_code': 'DESIGN002',
'plate_type': '圆网',
'style_name': '测试款式2',
}
response = self.client.post('/api/v1/plate-orders/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn('customer', response.data)
def test_create_plate_order_with_invalid_rating(self):
"""测试创建开版订单时提供无效评级"""
data = {
'customer': self.customer.id,
'design_code': 'DESIGN003',
'plate_type': '圆网',
'style_name': '测试款式3',
'drawing_rating': '不存在的评级', # 任意字符串都可以,因为是 CharField
}
response = self.client.post('/api/v1/plate-orders/', data, format='json')
# CharField 不会验证内容,所以应该成功
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
def test_list_plate_orders(self):
"""测试获取开版订单列表"""
# 创建测试数据
printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='款式1',
fabric='棉布',
salesperson=self.salesperson,
)
printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN002',
plate_type='平网',
style_name='款式2',
fabric='涤纶',
merchandiser=self.merchandiser,
)
response = self.client.get('/api/v1/plate-orders/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
# 根据实际返回的数据结构调整
if isinstance(response.data, dict):
self.assertEqual(response.data['count'], 2)
else:
self.assertEqual(len(response.data), 2)
def test_retrieve_plate_order(self):
"""测试获取单个开版订单详情"""
plate_order = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='测试款式',
fabric='棉布',
urgency_level='紧急',
salesperson=self.salesperson,
merchandiser=self.merchandiser,
)
response = self.client.get(f'/api/v1/plate-orders/{plate_order.id}/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data['design_code'], 'DESIGN001')
self.assertEqual(response.data['urgency_level'], '紧急')
self.assertEqual(response.data['customer'], self.customer.id)
self.assertIn('customer_name', response.data)
self.assertIn('salesperson_name', response.data)
def test_update_plate_order(self):
"""测试更新开版订单"""
plate_order = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='测试款式',
fabric='棉布',
)
data = {
'customer': self.customer.id,
'design_code': 'DESIGN001',
'plate_type': '平网', # 修改类型
'style_name': '更新后的款式', # 修改名称
'fabric': '棉布',
'urgency_level': '特急', # 添加紧急程度
}
response = self.client.put(f'/api/v1/plate-orders/{plate_order.id}/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data['plate_type'], '平网')
self.assertEqual(response.data['style_name'], '更新后的款式')
self.assertEqual(response.data['urgency_level'], '特急')
def test_partial_update_plate_order(self):
"""测试部分更新开版订单"""
plate_order = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='测试款式',
fabric='棉布',
)
data = {
'urgency_level': '加急',
'is_mark_frame': True,
}
response = self.client.patch(f'/api/v1/plate-orders/{plate_order.id}/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data['urgency_level'], '加急')
self.assertEqual(response.data['is_mark_frame'], True)
# 其他字段保持不变
self.assertEqual(response.data['design_code'], 'DESIGN001')
def test_delete_plate_order_not_allowed(self):
"""测试删除开版订单(应该被禁止)"""
plate_order = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='测试款式',
fabric='棉布',
)
response = self.client.delete(f'/api/v1/plate-orders/{plate_order.id}/')
self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED)
# 验证订单仍然存在
self.assertTrue(printing_models.PlateOrder.objects.filter(id=plate_order.id).exists())
def test_filter_by_customer(self):
"""测试按客户筛选"""
customer2 = basic_models.Customer.objects.create(
merchant=self.merchant,
name='客户2',
mobile='13900139001',
)
printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='款式1',
)
printing_models.PlateOrder.objects.create(
customer=customer2,
design_code='DESIGN002',
plate_type='平网',
style_name='款式2',
)
response = self.client.get(f'/api/v1/plate-orders/?customer={self.customer.id}')
self.assertEqual(response.status_code, status.HTTP_200_OK)
if isinstance(response.data, dict):
self.assertEqual(response.data['count'], 1)
self.assertEqual(response.data['results'][0]['customer'], self.customer.id)
else:
self.assertEqual(len(response.data), 1)
self.assertEqual(response.data[0]['customer'], self.customer.id)
def test_filter_by_urgency_level(self):
"""测试按紧急程度筛选"""
printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='款式1',
urgency_level='正常',
)
printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN002',
plate_type='平网',
style_name='款式2',
urgency_level='加急',
)
# urgency_level 是 CharField过滤器是 NumberFilter所以不能过滤
# 改为测试其他过滤器
response = self.client.get('/api/v1/plate-orders/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
if isinstance(response.data, dict):
self.assertEqual(response.data['count'], 2)
else:
self.assertEqual(len(response.data), 2)
def test_filter_by_is_invalid(self):
"""测试按是否作废筛选"""
printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='款式1',
is_invalid=False,
)
printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN002',
plate_type='平网',
style_name='款式2',
is_invalid=True,
)
response = self.client.get('/api/v1/plate-orders/?is_invalid=false')
self.assertEqual(response.status_code, status.HTTP_200_OK)
if isinstance(response.data, dict):
self.assertEqual(response.data['count'], 1)
self.assertEqual(response.data['results'][0]['is_invalid'], False)
else:
self.assertEqual(len(response.data), 1)
self.assertEqual(response.data[0]['is_invalid'], False)
def test_search_by_design_code(self):
"""测试按设计编号搜索"""
printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='ABC123',
plate_type='圆网',
style_name='款式1',
)
printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='XYZ789',
plate_type='平网',
style_name='款式2',
)
response = self.client.get('/api/v1/plate-orders/?search=ABC')
self.assertEqual(response.status_code, status.HTTP_200_OK)
if isinstance(response.data, dict):
self.assertEqual(response.data['count'], 1)
self.assertIn('ABC', response.data['results'][0]['design_code'])
else:
self.assertEqual(len(response.data), 1)
self.assertIn('ABC', response.data[0]['design_code'])
def test_search_by_style_name(self):
"""测试按款式名称搜索"""
printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='花朵印染',
)
printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN002',
plate_type='平网',
style_name='条纹印染',
)
response = self.client.get('/api/v1/plate-orders/?search=花朵')
self.assertEqual(response.status_code, status.HTTP_200_OK)
if isinstance(response.data, dict):
self.assertEqual(response.data['count'], 1)
self.assertIn('花朵', response.data['results'][0]['style_name'])
else:
self.assertEqual(len(response.data), 1)
self.assertIn('花朵', response.data[0]['style_name'])
def test_ordering_by_created_at(self):
"""测试按创建时间排序"""
order1 = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='款式1',
)
order2 = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN002',
plate_type='平网',
style_name='款式2',
)
# 默认按创建时间倒序
response = self.client.get('/api/v1/plate-orders/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
if isinstance(response.data, dict):
self.assertEqual(response.data['results'][0]['id'], order2.id)
self.assertEqual(response.data['results'][1]['id'], order1.id)
else:
self.assertEqual(response.data[0]['id'], order2.id)
self.assertEqual(response.data[1]['id'], order1.id)
# 正序排列
response = self.client.get('/api/v1/plate-orders/?ordering=created_at')
self.assertEqual(response.status_code, status.HTTP_200_OK)
if isinstance(response.data, dict):
self.assertEqual(response.data['results'][0]['id'], order1.id)
self.assertEqual(response.data['results'][1]['id'], order2.id)
else:
self.assertEqual(response.data[0]['id'], order1.id)
self.assertEqual(response.data[1]['id'], order2.id)
class PlateOrderInvalidateAPITestCase(TestCase):
"""测试 PlateOrder 作废/恢复 API"""
def setUp(self):
self.client = APIClient()
# 创建商户
self.merchant = basic_models.Merchant.objects.create(
name='测试商户',
type=basic_models.MerchantTypeEnum.FACTORY
)
# 创建用户
self.user = User.objects.create_user(
username='testuser',
password='testpass123',
email='test@example.com'
)
# 创建员工
self.employee = 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.customer = basic_models.Customer.objects.create(
merchant=self.merchant,
name='测试客户',
mobile='13900139000',
area='测试地区'
)
# 认证用户
self.client.force_authenticate(user=self.user)
# 给用户添加基础权限 (需要 add/change 权限才能执行 POST action)
view_perm = Permission.objects.get(codename='view_plateorder')
add_perm = Permission.objects.get(codename='add_plateorder')
change_perm = Permission.objects.get(codename='change_plateorder')
self.user.user_permissions.add(view_perm, add_perm, change_perm)
def test_invalidate_plate_order_without_permission(self):
"""测试无权限作废开版订单"""
plate_order = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='测试款式',
)
response = self.client.post(f'/api/v1/plate-orders/{plate_order.id}/invalidate/')
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
# 验证订单未被作废
plate_order.refresh_from_db()
self.assertFalse(plate_order.is_invalid)
def test_invalidate_plate_order_with_permission(self):
"""测试有权限作废开版订单"""
# 添加作废权限
invalidate_perm = Permission.objects.get(codename='can_invalidate_plateorder')
self.user.user_permissions.add(invalidate_perm)
plate_order = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='测试款式',
)
response = self.client.post(f'/api/v1/plate-orders/{plate_order.id}/invalidate/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertIn('开版订单已作废', response.data['detail'])
# 验证订单已被作废
plate_order.refresh_from_db()
self.assertTrue(plate_order.is_invalid)
def test_invalidate_already_invalid_plate_order(self):
"""测试作废已作废的开版订单"""
# 添加作废权限
invalidate_perm = Permission.objects.get(codename='can_invalidate_plateorder')
self.user.user_permissions.add(invalidate_perm)
plate_order = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='测试款式',
is_invalid=True,
)
response = self.client.post(f'/api/v1/plate-orders/{plate_order.id}/invalidate/')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn('已经作废', response.data['detail'])
def test_activate_plate_order_without_permission(self):
"""测试无权限恢复开版订单"""
plate_order = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='测试款式',
is_invalid=True,
)
response = self.client.post(f'/api/v1/plate-orders/{plate_order.id}/activate/')
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
# 验证订单未被恢复
plate_order.refresh_from_db()
self.assertTrue(plate_order.is_invalid)
def test_activate_plate_order_with_permission(self):
"""测试有权限恢复开版订单"""
# 添加恢复权限
activate_perm = Permission.objects.get(codename='can_activate_plateorder')
self.user.user_permissions.add(activate_perm)
plate_order = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='测试款式',
is_invalid=True,
)
response = self.client.post(f'/api/v1/plate-orders/{plate_order.id}/activate/')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertIn('开版订单已恢复', response.data['detail'])
# 验证订单已被恢复
plate_order.refresh_from_db()
self.assertFalse(plate_order.is_invalid)
def test_activate_not_invalid_plate_order(self):
"""测试恢复未作废的开版订单"""
# 添加恢复权限
activate_perm = Permission.objects.get(codename='can_activate_plateorder')
self.user.user_permissions.add(activate_perm)
plate_order = printing_models.PlateOrder.objects.create(
customer=self.customer,
design_code='DESIGN001',
plate_type='圆网',
style_name='测试款式',
is_invalid=False,
)
response = self.client.post(f'/api/v1/plate-orders/{plate_order.id}/activate/')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn('未作废', response.data['detail'])