213 lines
7.1 KiB
Python
213 lines
7.1 KiB
Python
|
|
"""
|
|||
|
|
测试 MinIO 客户端的异步方法变更
|
|||
|
|
文件: src/storage/minio/client.py
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import asyncio
|
|||
|
|
import os
|
|||
|
|
import sys
|
|||
|
|
from pathlib import Path
|
|||
|
|
|
|||
|
|
project_root = Path(__file__).parent.parent
|
|||
|
|
sys.path.insert(0, str(project_root))
|
|||
|
|
|
|||
|
|
import pytest
|
|||
|
|
from src.storage.minio.client import MinIOClient, aupload_file_to_minio, get_minio_client
|
|||
|
|
|
|||
|
|
|
|||
|
|
class TestMinIOClientChanges:
|
|||
|
|
"""测试 MinIO 客户端的新增异步方法"""
|
|||
|
|
|
|||
|
|
@pytest.fixture
|
|||
|
|
def minio_client(self):
|
|||
|
|
"""创建 MinIO 客户端实例"""
|
|||
|
|
client = get_minio_client()
|
|||
|
|
return client
|
|||
|
|
|
|||
|
|
@pytest.mark.asyncio
|
|||
|
|
async def test_aupload_file(self, minio_client):
|
|||
|
|
"""测试新增的 aupload_file 异步方法"""
|
|||
|
|
bucket_name = "test-async-upload"
|
|||
|
|
object_name = "test_async_upload.txt"
|
|||
|
|
test_data = b"Async upload test content"
|
|||
|
|
|
|||
|
|
# 确保 bucket 存在
|
|||
|
|
minio_client.ensure_bucket_exists(bucket_name)
|
|||
|
|
|
|||
|
|
# 测试异步上传
|
|||
|
|
result = await minio_client.aupload_file(
|
|||
|
|
bucket_name=bucket_name,
|
|||
|
|
object_name=object_name,
|
|||
|
|
data=test_data,
|
|||
|
|
content_type="text/plain",
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
assert result is not None
|
|||
|
|
assert result.bucket_name == bucket_name
|
|||
|
|
assert result.object_name == object_name
|
|||
|
|
print(f"✓ aupload_file 测试通过: {result.url}")
|
|||
|
|
|
|||
|
|
# 验证文件存在
|
|||
|
|
exists = minio_client.file_exists(bucket_name, object_name)
|
|||
|
|
assert exists is True
|
|||
|
|
|
|||
|
|
# 清理
|
|||
|
|
minio_client.delete_file(bucket_name, object_name)
|
|||
|
|
|
|||
|
|
@pytest.mark.asyncio
|
|||
|
|
async def test_adownload_response(self, minio_client):
|
|||
|
|
"""测试新增的 adownload_response 异步方法"""
|
|||
|
|
bucket_name = "test-async-download-resp"
|
|||
|
|
object_name = "test_download_response.txt"
|
|||
|
|
test_data = b"Download response test content"
|
|||
|
|
|
|||
|
|
# 准备测试文件
|
|||
|
|
minio_client.ensure_bucket_exists(bucket_name)
|
|||
|
|
minio_client.upload_file(bucket_name, object_name, test_data)
|
|||
|
|
|
|||
|
|
# 测试异步下载响应
|
|||
|
|
response = await minio_client.adownload_response(bucket_name, object_name)
|
|||
|
|
|
|||
|
|
assert response is not None
|
|||
|
|
downloaded_data = response.read()
|
|||
|
|
response.close()
|
|||
|
|
response.release_conn()
|
|||
|
|
|
|||
|
|
assert downloaded_data == test_data
|
|||
|
|
print(f"✓ adownload_response 测试通过,数据大小: {len(downloaded_data)} 字节")
|
|||
|
|
|
|||
|
|
# 清理
|
|||
|
|
minio_client.delete_file(bucket_name, object_name)
|
|||
|
|
|
|||
|
|
@pytest.mark.asyncio
|
|||
|
|
async def test_adownload_file(self, minio_client):
|
|||
|
|
"""测试新增的 adownload_file 异步方法"""
|
|||
|
|
bucket_name = "test-async-download"
|
|||
|
|
object_name = "test_async_download.txt"
|
|||
|
|
test_data = b"Async download test content"
|
|||
|
|
|
|||
|
|
# 准备测试文件
|
|||
|
|
minio_client.ensure_bucket_exists(bucket_name)
|
|||
|
|
minio_client.upload_file(bucket_name, object_name, test_data)
|
|||
|
|
|
|||
|
|
# 测试异步下载
|
|||
|
|
downloaded_data = await minio_client.adownload_file(bucket_name, object_name)
|
|||
|
|
|
|||
|
|
assert downloaded_data == test_data
|
|||
|
|
print(f"✓ adownload_file 测试通过,数据匹配")
|
|||
|
|
|
|||
|
|
# 清理
|
|||
|
|
minio_client.delete_file(bucket_name, object_name)
|
|||
|
|
|
|||
|
|
@pytest.mark.asyncio
|
|||
|
|
async def test_adelete_file(self, minio_client):
|
|||
|
|
"""测试新增的 adelete_file 异步方法"""
|
|||
|
|
bucket_name = "test-async-delete"
|
|||
|
|
object_name = "test_async_delete.txt"
|
|||
|
|
test_data = b"Async delete test content"
|
|||
|
|
|
|||
|
|
# 准备测试文件
|
|||
|
|
minio_client.ensure_bucket_exists(bucket_name)
|
|||
|
|
minio_client.upload_file(bucket_name, object_name, test_data)
|
|||
|
|
|
|||
|
|
# 验证文件存在
|
|||
|
|
assert minio_client.file_exists(bucket_name, object_name)
|
|||
|
|
|
|||
|
|
# 测试异步删除
|
|||
|
|
result = await minio_client.adelete_file(bucket_name, object_name)
|
|||
|
|
|
|||
|
|
assert result is True
|
|||
|
|
assert not minio_client.file_exists(bucket_name, object_name)
|
|||
|
|
print(f"✓ adelete_file 测试通过")
|
|||
|
|
|
|||
|
|
def test_get_presigned_url(self, minio_client):
|
|||
|
|
"""测试新增的 get_presigned_url 方法"""
|
|||
|
|
bucket_name = "test-presigned-url"
|
|||
|
|
object_name = "test_presigned.txt"
|
|||
|
|
test_data = b"Presigned URL test content"
|
|||
|
|
|
|||
|
|
# 准备测试文件
|
|||
|
|
minio_client.ensure_bucket_exists(bucket_name)
|
|||
|
|
minio_client.upload_file(bucket_name, object_name, test_data)
|
|||
|
|
|
|||
|
|
# 测试获取预签名 URL(默认 7 天)
|
|||
|
|
presigned_url = minio_client.get_presigned_url(bucket_name, object_name)
|
|||
|
|
|
|||
|
|
assert presigned_url is not None
|
|||
|
|
assert bucket_name in presigned_url
|
|||
|
|
assert object_name in presigned_url
|
|||
|
|
assert "X-Amz-Expires" in presigned_url
|
|||
|
|
print(f"✓ get_presigned_url 测试通过")
|
|||
|
|
print(f" URL: {presigned_url[:100]}...")
|
|||
|
|
|
|||
|
|
# 测试自定义过期时间
|
|||
|
|
presigned_url_custom = minio_client.get_presigned_url(bucket_name, object_name, days=1)
|
|||
|
|
assert presigned_url_custom is not None
|
|||
|
|
print(f"✓ get_presigned_url (自定义天数) 测试通过")
|
|||
|
|
|
|||
|
|
# 清理
|
|||
|
|
minio_client.delete_file(bucket_name, object_name)
|
|||
|
|
|
|||
|
|
@pytest.mark.asyncio
|
|||
|
|
async def test_aupload_file_to_minio_function(self):
|
|||
|
|
"""测试新增的 aupload_file_to_minio 工具函数"""
|
|||
|
|
bucket_name = "test-upload-util"
|
|||
|
|
file_name = "test_util_upload.pdf"
|
|||
|
|
test_data = b"PDF test content"
|
|||
|
|
file_extension = ".pdf"
|
|||
|
|
|
|||
|
|
# 测试工具函数
|
|||
|
|
url = await aupload_file_to_minio(
|
|||
|
|
bucket_name=bucket_name,
|
|||
|
|
file_name=file_name,
|
|||
|
|
data=test_data,
|
|||
|
|
file_extension=file_extension,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
assert url is not None
|
|||
|
|
assert bucket_name in url
|
|||
|
|
assert file_name in url
|
|||
|
|
print(f"✓ aupload_file_to_minio 工具函数测试通过")
|
|||
|
|
print(f" 返回的预签名 URL: {url[:100]}...")
|
|||
|
|
|
|||
|
|
# 清理
|
|||
|
|
client = get_minio_client()
|
|||
|
|
client.delete_file(bucket_name, file_name)
|
|||
|
|
|
|||
|
|
@pytest.mark.asyncio
|
|||
|
|
async def test_concurrent_async_operations(self, minio_client):
|
|||
|
|
"""测试并发异步操作"""
|
|||
|
|
bucket_name = "test-concurrent"
|
|||
|
|
minio_client.ensure_bucket_exists(bucket_name)
|
|||
|
|
|
|||
|
|
# 准备多个测试任务
|
|||
|
|
async def upload_and_download(index):
|
|||
|
|
object_name = f"concurrent_test_{index}.txt"
|
|||
|
|
test_data = f"Concurrent test {index}".encode()
|
|||
|
|
|
|||
|
|
# 异步上传
|
|||
|
|
await minio_client.aupload_file(bucket_name, object_name, test_data)
|
|||
|
|
|
|||
|
|
# 异步下载
|
|||
|
|
downloaded = await minio_client.adownload_file(bucket_name, object_name)
|
|||
|
|
assert downloaded == test_data
|
|||
|
|
|
|||
|
|
# 异步删除
|
|||
|
|
await minio_client.adelete_file(bucket_name, object_name)
|
|||
|
|
|
|||
|
|
return f"Task {index} completed"
|
|||
|
|
|
|||
|
|
# 并发执行多个任务
|
|||
|
|
tasks = [upload_and_download(i) for i in range(5)]
|
|||
|
|
results = await asyncio.gather(*tasks)
|
|||
|
|
|
|||
|
|
assert len(results) == 5
|
|||
|
|
print(f"✓ 并发异步操作测试通过,完成 {len(results)} 个任务")
|
|||
|
|
for result in results:
|
|||
|
|
print(f" - {result}")
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
exit_code = pytest.main([__file__, "-v", "-s", "--tb=short", "--color=yes"])
|
|||
|
|
sys.exit(exit_code)
|