@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user