添加审核 优化
Deploy dev / deploy (push) Successful in 1m2s

This commit is contained in:
Azmat@qq.com
2026-09-24 18:25:15 +08:00
parent 5dbb240b59
commit a84431c9c5
10 changed files with 334 additions and 48 deletions
+74 -4
View File
@@ -20,6 +20,74 @@ def _mk_team(username, team_name):
return user, team
class AssetUploadReviewGateTests(TestCase):
"""通用本地上传必须审核通过,才暴露可引用的资产数据。"""
def setUp(self):
self.user, self.team = _mk_team("upload-review-user", "UploadReview")
self.client = APIClient()
self.client.force_authenticate(self.user)
self.stored = SimpleNamespace(
object_key="teams/upload-review/uploads/photo.png",
bucket="test",
content_type="image/png",
size_bytes=12,
)
def _post(self):
return self.client.post(
"/api/assets/upload/",
{
"file": SimpleUploadedFile("photo.png", b"fake-image", content_type="image/png"),
"asset_type": Asset.Type.IMAGE,
"category": Asset.Category.UPLOAD,
},
format="multipart",
)
def test_returns_asset_and_links_only_after_review_is_active(self):
def approve(asset, **_kwargs):
asset.review_status = "active"
asset.review_remote_id = "remote-approved"
asset.save(update_fields=["review_status", "review_remote_id"])
return "active"
with patch("apps.assets.views.TosStorage") as tos, patch(
"apps.assets.views.assets_client.is_enabled", return_value=True
), patch("apps.assets.views.wait_upload_review", side_effect=approve) as wait:
tos.return_value.upload_fileobj.return_value = self.stored
response = self._post()
self.assertEqual(response.status_code, 201)
self.assertEqual(response.json()["review_status"], "active")
self.assertIn("files", response.json())
wait.assert_called_once()
def test_processing_review_does_not_return_asset_link(self):
with patch("apps.assets.views.TosStorage") as tos, patch(
"apps.assets.views.assets_client.is_enabled", return_value=True
), patch("apps.assets.views.wait_upload_review", return_value="processing"):
tos.return_value.upload_fileobj.return_value = self.stored
response = self._post()
self.assertEqual(response.status_code, 408)
self.assertEqual(response.json()["review_status"], "processing")
self.assertNotIn("files", response.json())
self.assertNotIn("url", response.json())
def test_unavailable_review_service_does_not_return_asset_link(self):
with patch("apps.assets.views.TosStorage") as tos, patch(
"apps.assets.views.assets_client.is_enabled", return_value=False
), patch("apps.assets.views.wait_upload_review") as wait:
tos.return_value.upload_fileobj.return_value = self.stored
response = self._post()
self.assertEqual(response.status_code, 503)
self.assertEqual(response.json()["review_status"], "unavailable")
self.assertNotIn("files", response.json())
wait.assert_not_called()
class ModelLibraryApiTests(TestCase):
"""模特库:本团队模特 ∪ 官方模板;官方跨团队可见;软删;官方不可删;团队隔离。"""
@@ -421,7 +489,7 @@ class FreeAssetQuickUploadTests(TestCase):
storage.public_url.return_value = "http://tos/a.png"
res = self.client.post("/api/assets/free-assets/quick-upload/", {"file": self._image()}, format="multipart")
self.assertEqual(res.status_code, 201)
self.assertEqual(res.status_code, 202)
group = FreeAssetGroup.objects.get(team=self.team)
self.assertEqual(group.name, "默认素材")
self.assertEqual(group.remote_group_id, "Group-1")
@@ -429,6 +497,8 @@ class FreeAssetQuickUploadTests(TestCase):
asset = group.assets.get()
self.assertEqual(asset.asset_type, FreeAsset.Type.IMAGE)
self.assertEqual(asset.status, FreeAsset.Status.PROCESSING)
self.assertEqual(res.json()["asset"]["url"], "")
self.assertEqual(res.json()["asset"]["thumb_url"], "")
create_group.assert_called_once()
create_asset.assert_called_once_with("Group-1", "http://tos/a.png", name="a.png", asset_type=FreeAsset.Type.IMAGE)
self.assertEqual(res.json()["group"]["id"], str(group.id))
@@ -445,8 +515,8 @@ class FreeAssetQuickUploadTests(TestCase):
first = self.client.post("/api/assets/free-assets/quick-upload/", {"file": self._image("a.png")}, format="multipart")
second = self.client.post("/api/assets/free-assets/quick-upload/", {"file": self._image("b.png")}, format="multipart")
self.assertEqual(first.status_code, 201)
self.assertEqual(second.status_code, 201)
self.assertEqual(first.status_code, 202)
self.assertEqual(second.status_code, 202)
self.assertEqual(FreeAssetGroup.objects.filter(team=self.team).count(), 1)
self.assertEqual(FreeAsset.objects.filter(group__team=self.team).count(), 2)
create_group.assert_called_once()
@@ -475,7 +545,7 @@ class FreeAssetQuickUploadTests(TestCase):
res = self.client.post("/api/assets/free-assets/quick-upload/", {"file": self._image("new.png")}, format="multipart")
self.assertEqual(res.status_code, 201)
self.assertEqual(res.status_code, 202)
self.assertFalse(FreeAsset.objects.filter(group=old_group).exists())
new_group = FreeAssetGroup.objects.exclude(id=old_group.id).get(team=self.team)
self.assertEqual(new_group.remote_group_id, "Group-2")