forked from erp-dev/erp
feat: added pgadmin container
This commit is contained in:
197
api_v1/views/printing/test_plate_order_file_upload.py
Normal file
197
api_v1/views/printing/test_plate_order_file_upload.py
Normal file
@@ -0,0 +1,197 @@
|
||||
"""
|
||||
测试 PlateOrder 文件上传功能
|
||||
"""
|
||||
from django.test import TestCase
|
||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||
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
|
||||
from stateflow import models as stateflow_models
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
|
||||
class PlateOrderFileUploadTestCase(TestCase):
|
||||
"""测试 PlateOrder 文件上传(PATCH 请求)"""
|
||||
|
||||
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)
|
||||
|
||||
# 给用户添加所有 PlateOrder 权限
|
||||
perms = Permission.objects.filter(
|
||||
content_type__app_label='printing',
|
||||
content_type__model='plateorder'
|
||||
)
|
||||
self.user.user_permissions.add(*perms)
|
||||
|
||||
def test_patch_with_file_upload(self):
|
||||
"""测试 PATCH 请求上传文件(问题场景)"""
|
||||
# 创建开版订单
|
||||
plate_order = printing_models.PlateOrder.objects.create(
|
||||
customer=self.customer,
|
||||
design_code='DESIGN001',
|
||||
plate_type='圆网',
|
||||
style_name='测试款式',
|
||||
fabric='棉布',
|
||||
)
|
||||
|
||||
# 创建一个测试图片文件
|
||||
image_content = b'fake image content for testing'
|
||||
image_file = SimpleUploadedFile(
|
||||
"test_plate_image.jpg",
|
||||
image_content,
|
||||
content_type="image/jpeg"
|
||||
)
|
||||
|
||||
# PATCH 请求,同时更新文字字段和上传文件
|
||||
data = {
|
||||
'urgency_level': '加急',
|
||||
'plate_image': image_file,
|
||||
'is_mark_frame': True,
|
||||
}
|
||||
|
||||
response = self.client.patch(
|
||||
f'/api/v1/plate-orders/{plate_order.id}/',
|
||||
data,
|
||||
format='multipart' # 重要:使用 multipart 格式
|
||||
)
|
||||
|
||||
# 验证响应
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK,
|
||||
f"Expected 200, got {response.status_code}: {response.data}")
|
||||
self.assertEqual(response.data['urgency_level'], '加急')
|
||||
self.assertEqual(response.data['is_mark_frame'], True)
|
||||
|
||||
# 验证文件已上传
|
||||
plate_order.refresh_from_db()
|
||||
self.assertTrue(plate_order.plate_image)
|
||||
self.assertIn('test_plate_image', plate_order.plate_image.name)
|
||||
|
||||
def test_patch_without_file(self):
|
||||
"""测试 PATCH 请求不上传文件(正常场景)"""
|
||||
plate_order = printing_models.PlateOrder.objects.create(
|
||||
customer=self.customer,
|
||||
design_code='DESIGN002',
|
||||
plate_type='圆网',
|
||||
style_name='测试款式2',
|
||||
)
|
||||
|
||||
# 纯 JSON 数据
|
||||
data = {
|
||||
'urgency_level': '特急',
|
||||
'is_mark_frame': False,
|
||||
}
|
||||
|
||||
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'], False)
|
||||
|
||||
def test_patch_only_file(self):
|
||||
"""测试 PATCH 请求仅上传文件"""
|
||||
plate_order = printing_models.PlateOrder.objects.create(
|
||||
customer=self.customer,
|
||||
design_code='DESIGN003',
|
||||
plate_type='平网',
|
||||
style_name='测试款式3',
|
||||
urgency_level='正常',
|
||||
)
|
||||
|
||||
# 创建测试文件
|
||||
file_content = b'another fake image'
|
||||
image_file = SimpleUploadedFile(
|
||||
"plate_design.png",
|
||||
file_content,
|
||||
content_type="image/png"
|
||||
)
|
||||
|
||||
data = {
|
||||
'plate_image': image_file,
|
||||
}
|
||||
|
||||
response = self.client.patch(
|
||||
f'/api/v1/plate-orders/{plate_order.id}/',
|
||||
data,
|
||||
format='multipart'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
|
||||
# 验证其他字段未被改变
|
||||
plate_order.refresh_from_db()
|
||||
self.assertEqual(plate_order.urgency_level, '正常')
|
||||
self.assertEqual(plate_order.design_code, 'DESIGN003')
|
||||
self.assertTrue(plate_order.plate_image)
|
||||
|
||||
def test_create_with_file(self):
|
||||
"""测试 POST 创建时上传文件"""
|
||||
file_content = b'initial image'
|
||||
image_file = SimpleUploadedFile(
|
||||
"initial_plate.jpg",
|
||||
file_content,
|
||||
content_type="image/jpeg"
|
||||
)
|
||||
|
||||
data = {
|
||||
'customer': self.customer.id,
|
||||
'design_code': 'DESIGN_NEW',
|
||||
'plate_type': '圆网',
|
||||
'style_name': '新款式',
|
||||
'plate_image': image_file,
|
||||
}
|
||||
|
||||
response = self.client.post(
|
||||
'/api/v1/plate-orders/',
|
||||
data,
|
||||
format='multipart'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||
self.assertIn('plate_image', response.data)
|
||||
|
||||
# 验证数据库
|
||||
plate_order = printing_models.PlateOrder.objects.get(design_code='DESIGN_NEW')
|
||||
self.assertTrue(plate_order.plate_image)
|
||||
|
||||
@@ -7,6 +7,7 @@ from rest_framework.response import Response
|
||||
from rest_framework.permissions import BasePermission
|
||||
from rest_framework.pagination import LimitOffsetPagination
|
||||
from rest_framework.permissions import DjangoModelPermissions
|
||||
from rest_framework.parsers import MultiPartParser, FormParser, JSONParser
|
||||
from django_filters.rest_framework import DjangoFilterBackend
|
||||
from django_filters import rest_framework as django_filters
|
||||
from printing import models
|
||||
@@ -582,6 +583,7 @@ class PlateOrderViewSet(viewsets.ModelViewSet):
|
||||
"""
|
||||
queryset = models.PlateOrder.objects.all()
|
||||
permission_classes = [DjangoModelPermissions]
|
||||
parser_classes = [MultiPartParser, FormParser, JSONParser] # 支持文件上传
|
||||
pagination_class = LimitOffsetPagination
|
||||
filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
|
||||
filterset_class = PlateOrderFilterSet
|
||||
|
||||
Reference in New Issue
Block a user