""" 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'])