Files
xiaoxia-saas/tests/unit/test_oss_direct_upload.py
T
CI Bot 25820fc2dc
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 6s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 1m23s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m4s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 33s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 18s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m21s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 51s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 22s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m10s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m57s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m37s
AI Code Review / AI Code Review (pull_request) Successful in 7m16s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 9m23s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 5m21s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 46s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 1311h50m43s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 1311h50m47s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 1311h50m53s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 1311h50m49s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 1311h53m35s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 1311h53m38s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 1311h53m39s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 1311h53m41s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 1311h58m10s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 1311h58m12s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 1311h58m14s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 1312h26m0s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 1312h23m14s
refactor(#776): 统一配置入口,建立packages/config消除重复定义
- 新增 packages/config/ 作为配置统一入口(base/api_settings/worker_settings)
- SharedSettings 基类 + 统一单例管理(_settings_cache),消除3处重复单例实现
- API配置迁移到 packages/config/api_settings.py(APISettings)
- Worker配置迁移到 packages/config/worker_settings.py(WorkerSettings)
- 旧路径全部保留为 re-export 向后兼容层
- alembic/env.py 改用统一配置获取 database_url,不再直接读环境变量
- 测试更新:改用 reload_settings_cache() 替代手动 _settings=None

净减 397 行(4新文件 + 7修改)
2026-07-23 23:22:59 +08:00

58 lines
2.1 KiB
Python
Executable File

import base64
import json
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "apps" / "api"))
from app.core.storage import OSSStorageService
from packages.config import reload_settings_cache
def _reset_settings() -> None:
"""清空所有配置缓存,让测试设置的环境变量生效。"""
reload_settings_cache()
def test_create_direct_upload_post_limits_key_and_size(monkeypatch):
monkeypatch.setenv("OSS_ACCESS_KEY_ID", "test-access")
monkeypatch.setenv("OSS_ACCESS_KEY_SECRET", "test-secret")
monkeypatch.setenv("OSS_BUCKET_NAME", "test-bucket")
monkeypatch.setenv("OSS_ENDPOINT", "oss-cn-hangzhou.aliyuncs.com")
_reset_settings()
service = OSSStorageService()
payload = service.create_direct_upload_post(
storage_key="uploads/abc/sample.MOV",
content_type="video/quicktime",
max_size_bytes=800 * 1024 * 1024,
expires_seconds=900,
)
assert payload["url"] == "https://test-bucket.oss-cn-hangzhou.aliyuncs.com"
assert payload["method"] == "POST"
assert payload["storage_key"] == "uploads/abc/sample.MOV"
fields = payload["fields"]
assert fields["key"] == "uploads/abc/sample.MOV"
assert fields["OSSAccessKeyId"] == "test-access"
assert fields["success_action_status"] == "201"
policy = json.loads(base64.b64decode(fields["policy"]).decode("utf-8"))
assert {"bucket": "test-bucket"} in policy["conditions"]
assert {"key": "uploads/abc/sample.MOV"} in policy["conditions"]
assert ["content-length-range", 1, 800 * 1024 * 1024] in policy["conditions"]
def test_create_direct_upload_post_rejects_non_upload_key(monkeypatch):
monkeypatch.setenv("OSS_ACCESS_KEY_ID", "test-access")
monkeypatch.setenv("OSS_ACCESS_KEY_SECRET", "test-secret")
_reset_settings()
service = OSSStorageService()
try:
service.create_direct_upload_post("generated/bad.mov", "video/quicktime", 100, 900)
except ValueError as error:
assert "uploads" in str(error)
else:
raise AssertionError("expected ValueError")