- Implement PhysicalFile model to manage physical file references and reference counting. - Create Policy model with associated options and group links for storage policies. - Introduce Redeem and Report models for handling redeem codes and reports. - Add Settings model for site configuration and user settings management. - Develop Share model for sharing objects with unique codes and associated metadata. - Implement SourceLink model for managing download links associated with objects. - Create StoragePack model for managing user storage packages. - Add Tag model for user-defined tags with manual and automatic types. - Implement Task model for managing background tasks with status tracking. - Develop User model with comprehensive user management features including authentication. - Introduce UserAuthn model for managing WebAuthn credentials. - Create WebDAV model for managing WebDAV accounts associated with users.
290 lines
7.4 KiB
Python
290 lines
7.4 KiB
Python
"""
|
|
目录操作端点集成测试
|
|
"""
|
|
import pytest
|
|
from httpx import AsyncClient
|
|
from uuid import UUID
|
|
|
|
|
|
# ==================== 认证测试 ====================
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_requires_auth(async_client: AsyncClient):
|
|
"""测试获取目录需要认证"""
|
|
response = await async_client.get("/api/directory/")
|
|
assert response.status_code == 401
|
|
|
|
|
|
# ==================== 获取目录测试 ====================
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_get_root(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str]
|
|
):
|
|
"""测试获取用户根目录"""
|
|
response = await async_client.get(
|
|
"/api/directory/",
|
|
headers=auth_headers
|
|
)
|
|
assert response.status_code == 200
|
|
|
|
data = response.json()
|
|
assert "id" in data
|
|
assert "parent" in data
|
|
assert "objects" in data
|
|
assert "policy" in data
|
|
assert data["parent"] is None # 根目录的 parent 为 None
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_get_nested(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str],
|
|
test_directory_structure: dict[str, UUID]
|
|
):
|
|
"""测试获取嵌套目录"""
|
|
response = await async_client.get(
|
|
"/api/directory/docs",
|
|
headers=auth_headers
|
|
)
|
|
assert response.status_code == 200
|
|
|
|
data = response.json()
|
|
assert "id" in data
|
|
assert "objects" in data
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_get_contains_children(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str],
|
|
test_directory_structure: dict[str, UUID]
|
|
):
|
|
"""测试目录包含子对象"""
|
|
response = await async_client.get(
|
|
"/api/directory/docs",
|
|
headers=auth_headers
|
|
)
|
|
assert response.status_code == 200
|
|
|
|
data = response.json()
|
|
objects = data["objects"]
|
|
assert isinstance(objects, list)
|
|
# docs 目录下应该有 images 文件夹和 readme.md 文件
|
|
assert len(objects) >= 1
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_not_found(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str]
|
|
):
|
|
"""测试目录不存在返回 404"""
|
|
response = await async_client.get(
|
|
"/api/directory/nonexistent",
|
|
headers=auth_headers
|
|
)
|
|
assert response.status_code == 404
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_root_returns_200(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str]
|
|
):
|
|
"""测试根目录端点返回 200"""
|
|
response = await async_client.get(
|
|
"/api/directory/",
|
|
headers=auth_headers
|
|
)
|
|
assert response.status_code == 200
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_response_includes_policy(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str]
|
|
):
|
|
"""测试目录响应包含存储策略"""
|
|
response = await async_client.get(
|
|
"/api/directory/",
|
|
headers=auth_headers
|
|
)
|
|
assert response.status_code == 200
|
|
|
|
data = response.json()
|
|
assert "policy" in data
|
|
policy = data["policy"]
|
|
assert "id" in policy
|
|
assert "name" in policy
|
|
assert "type" in policy
|
|
|
|
|
|
# ==================== 创建目录测试 ====================
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_create_requires_auth(async_client: AsyncClient):
|
|
"""测试创建目录需要认证"""
|
|
response = await async_client.put(
|
|
"/api/directory/",
|
|
json={
|
|
"parent_id": "00000000-0000-0000-0000-000000000000",
|
|
"name": "newfolder"
|
|
}
|
|
)
|
|
assert response.status_code == 401
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_create_success(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str],
|
|
test_directory_structure: dict[str, UUID]
|
|
):
|
|
"""测试成功创建目录"""
|
|
parent_id = test_directory_structure["root_id"]
|
|
|
|
response = await async_client.put(
|
|
"/api/directory/",
|
|
headers=auth_headers,
|
|
json={
|
|
"parent_id": str(parent_id),
|
|
"name": "newfolder"
|
|
}
|
|
)
|
|
assert response.status_code == 200
|
|
|
|
data = response.json()
|
|
assert "data" in data
|
|
folder_data = data["data"]
|
|
assert "id" in folder_data
|
|
assert "name" in folder_data
|
|
assert folder_data["name"] == "newfolder"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_create_duplicate_name(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str],
|
|
test_directory_structure: dict[str, UUID]
|
|
):
|
|
"""测试重名目录返回 409"""
|
|
parent_id = test_directory_structure["root_id"]
|
|
|
|
response = await async_client.put(
|
|
"/api/directory/",
|
|
headers=auth_headers,
|
|
json={
|
|
"parent_id": str(parent_id),
|
|
"name": "docs" # 已存在的目录名
|
|
}
|
|
)
|
|
assert response.status_code == 409
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_create_invalid_parent(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str]
|
|
):
|
|
"""测试无效父目录返回 404"""
|
|
invalid_uuid = "00000000-0000-0000-0000-000000000001"
|
|
|
|
response = await async_client.put(
|
|
"/api/directory/",
|
|
headers=auth_headers,
|
|
json={
|
|
"parent_id": invalid_uuid,
|
|
"name": "newfolder"
|
|
}
|
|
)
|
|
assert response.status_code == 404
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_create_empty_name(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str],
|
|
test_directory_structure: dict[str, UUID]
|
|
):
|
|
"""测试空目录名返回 400"""
|
|
parent_id = test_directory_structure["root_id"]
|
|
|
|
response = await async_client.put(
|
|
"/api/directory/",
|
|
headers=auth_headers,
|
|
json={
|
|
"parent_id": str(parent_id),
|
|
"name": ""
|
|
}
|
|
)
|
|
assert response.status_code == 400
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_create_name_with_slash(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str],
|
|
test_directory_structure: dict[str, UUID]
|
|
):
|
|
"""测试目录名包含斜杠返回 400"""
|
|
parent_id = test_directory_structure["root_id"]
|
|
|
|
response = await async_client.put(
|
|
"/api/directory/",
|
|
headers=auth_headers,
|
|
json={
|
|
"parent_id": str(parent_id),
|
|
"name": "invalid/name"
|
|
}
|
|
)
|
|
assert response.status_code == 400
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_create_parent_is_file(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str],
|
|
test_directory_structure: dict[str, UUID]
|
|
):
|
|
"""测试父路径是文件返回 400"""
|
|
file_id = test_directory_structure["file_id"]
|
|
|
|
response = await async_client.put(
|
|
"/api/directory/",
|
|
headers=auth_headers,
|
|
json={
|
|
"parent_id": str(file_id),
|
|
"name": "newfolder"
|
|
}
|
|
)
|
|
assert response.status_code == 400
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_directory_create_other_user_parent(
|
|
async_client: AsyncClient,
|
|
auth_headers: dict[str, str],
|
|
admin_headers: dict[str, str]
|
|
):
|
|
"""测试在他人目录下创建目录返回 404"""
|
|
# 先用管理员账号获取管理员的根目录ID
|
|
admin_response = await async_client.get(
|
|
"/api/directory/",
|
|
headers=admin_headers
|
|
)
|
|
assert admin_response.status_code == 200
|
|
admin_root_id = admin_response.json()["id"]
|
|
|
|
# 普通用户尝试在管理员目录下创建文件夹
|
|
response = await async_client.put(
|
|
"/api/directory/",
|
|
headers=auth_headers,
|
|
json={
|
|
"parent_id": admin_root_id,
|
|
"name": "hackfolder"
|
|
}
|
|
)
|
|
assert response.status_code == 404
|