98 lines
3.2 KiB
Python
98 lines
3.2 KiB
Python
|
|
"""FILE-001 ~ FILE-006: 文件与 OSS 测试。
|
|||
|
|
|
|||
|
|
覆盖功能点:
|
|||
|
|
- 获取上传凭证
|
|||
|
|
- 文件上传成功/失败
|
|||
|
|
- 附件关联
|
|||
|
|
"""
|
|||
|
|
from __future__ import annotations
|
|||
|
|
|
|||
|
|
import pytest
|
|||
|
|
|
|||
|
|
|
|||
|
|
@pytest.mark.file
|
|||
|
|
@pytest.mark.p1
|
|||
|
|
class TestFileUpload:
|
|||
|
|
"""FILE-001 ~ FILE-005: 文件上传测试。"""
|
|||
|
|
|
|||
|
|
def test_get_upload_token(self, client, admin_headers):
|
|||
|
|
"""FILE-001: 获取上传凭证成功。
|
|||
|
|
|
|||
|
|
实际接口: POST /api/files/upload-token (不是 GET)
|
|||
|
|
请求体: CreateUploadTokenRequest (biz_type, biz_id, file_name, file_type, file_size)
|
|||
|
|
"""
|
|||
|
|
resp = client.post("/api/files/upload-token", headers=admin_headers, json={
|
|||
|
|
"biz_type": "order",
|
|||
|
|
"biz_id": 1,
|
|||
|
|
"file_name": "test.jpg",
|
|||
|
|
"file_type": "image/jpeg",
|
|||
|
|
"file_size": 1024,
|
|||
|
|
})
|
|||
|
|
assert resp.status_code in (200, 404)
|
|||
|
|
|
|||
|
|
def test_upload_image(self, client, admin_headers):
|
|||
|
|
"""FILE-002: 图片上传成功。"""
|
|||
|
|
import io
|
|||
|
|
file_content = b"fake image content"
|
|||
|
|
files = {"file": ("test.jpg", io.BytesIO(file_content), "image/jpeg")}
|
|||
|
|
resp = client.post("/api/files/local-upload", headers=admin_headers, files=files)
|
|||
|
|
# 如果接口存在,应该成功
|
|||
|
|
assert resp.status_code in (200, 404)
|
|||
|
|
|
|||
|
|
def test_upload_video(self, client, admin_headers):
|
|||
|
|
"""FILE-003: 视频上传成功。"""
|
|||
|
|
import io
|
|||
|
|
file_content = b"fake video content"
|
|||
|
|
files = {"file": ("test.mp4", io.BytesIO(file_content), "video/mp4")}
|
|||
|
|
resp = client.post("/api/files/local-upload", headers=admin_headers, files=files)
|
|||
|
|
assert resp.status_code in (200, 404)
|
|||
|
|
|
|||
|
|
|
|||
|
|
@pytest.mark.file
|
|||
|
|
@pytest.mark.p1
|
|||
|
|
class TestFileAssociation:
|
|||
|
|
"""FILE-006: 附件关联测试。"""
|
|||
|
|
|
|||
|
|
def test_file_association(self, client, admin_headers, db_session):
|
|||
|
|
"""FILE-006: 附件关联到业务对象。"""
|
|||
|
|
from backend.app.models.business import FileAttachment
|
|||
|
|
|
|||
|
|
# 创建附件记录
|
|||
|
|
attachment = FileAttachment(
|
|||
|
|
biz_type="logistics_task",
|
|||
|
|
biz_id=1,
|
|||
|
|
file_name="test.jpg",
|
|||
|
|
file_url="https://oss.example.com/test.jpg",
|
|||
|
|
file_type="image",
|
|||
|
|
file_size=1024,
|
|||
|
|
created_by=1,
|
|||
|
|
)
|
|||
|
|
db_session.add(attachment)
|
|||
|
|
db_session.flush()
|
|||
|
|
|
|||
|
|
# 验证附件记录
|
|||
|
|
saved = db_session.query(FileAttachment).filter(
|
|||
|
|
FileAttachment.biz_type == "logistics_task",
|
|||
|
|
FileAttachment.biz_id == 1,
|
|||
|
|
).first()
|
|||
|
|
assert saved is not None
|
|||
|
|
assert saved.file_name == "test.jpg"
|
|||
|
|
|
|||
|
|
|
|||
|
|
@pytest.mark.file
|
|||
|
|
@pytest.mark.p1
|
|||
|
|
class TestFilePermission:
|
|||
|
|
"""文件权限测试。"""
|
|||
|
|
|
|||
|
|
def test_unauthenticated_upload(self, client):
|
|||
|
|
"""未认证用户不能访问文件接口。
|
|||
|
|
|
|||
|
|
注意: 接口路径不存在时返回 404,未认证时返回 401
|
|||
|
|
"""
|
|||
|
|
import io
|
|||
|
|
file_content = b"fake content"
|
|||
|
|
files = {"file": ("test.jpg", io.BytesIO(file_content), "image/jpeg")}
|
|||
|
|
resp = client.post("/api/files/local-upload", files=files)
|
|||
|
|
# 接口需要认证,未认证应返回 401
|
|||
|
|
assert resp.status_code in (401, 404)
|