125 lines
4.5 KiB
Python
125 lines
4.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import unittest
|
|
from unittest.mock import MagicMock, AsyncMock
|
|
import sys
|
|
import os
|
|
|
|
# 确保 runtime/deepdata-python 目录在 sys.path 中
|
|
TEST_DIR = os.path.dirname(os.path.abspath(__file__))
|
|
APP_DIR = os.path.dirname(TEST_DIR)
|
|
sys.path.insert(0, APP_DIR)
|
|
|
|
from app.module.dataset.service.service import Service
|
|
from app.module.dataset.schema import DatasetResponse, PagedDatasetFileResponse, DatasetFileResponse
|
|
from app.db.models import Dataset, DatasetFiles
|
|
|
|
|
|
class TestDatasetService(unittest.IsolatedAsyncioTestCase):
|
|
|
|
def setUp(self):
|
|
# 创建模拟的 AsyncSession 对象
|
|
self.mock_db = MagicMock()
|
|
self.mock_db.execute = AsyncMock()
|
|
self.mock_db.commit = AsyncMock()
|
|
self.mock_db.rollback = AsyncMock()
|
|
self.mock_db.flush = AsyncMock()
|
|
|
|
# 初始化 Service
|
|
self.service = Service(self.mock_db)
|
|
|
|
async def test_get_dataset_success(self):
|
|
"""测试正常获取数据集详情"""
|
|
# 准备 Mock 数据
|
|
mock_dataset = Dataset(
|
|
id="test-dataset-id",
|
|
name="Test Dataset",
|
|
description="A test description",
|
|
dataset_type="TEXT",
|
|
status="DRAFT",
|
|
file_count=5,
|
|
size_bytes=1024,
|
|
created_by="system"
|
|
)
|
|
|
|
# 模拟 db.execute 返回值
|
|
mock_result = MagicMock()
|
|
mock_result.scalar_one_or_none.return_value = mock_dataset
|
|
self.mock_db.execute.return_value = mock_result
|
|
|
|
# 执行测试
|
|
response = await self.service.get_dataset("test-dataset-id")
|
|
|
|
# 校验结果
|
|
self.assertIsNotNone(response)
|
|
self.assertEqual(response.id, "test-dataset-id")
|
|
self.assertEqual(response.name, "Test Dataset")
|
|
self.assertEqual(response.description, "A test description")
|
|
self.assertEqual(response.datasetType, "TEXT")
|
|
self.assertEqual(response.status, "DRAFT")
|
|
self.assertEqual(response.fileCount, 5)
|
|
self.assertEqual(response.totalSize, 1024)
|
|
|
|
async def test_get_dataset_not_found(self):
|
|
"""测试获取不存在的数据集时返回 None"""
|
|
# 模拟数据库未找到数据
|
|
mock_result = MagicMock()
|
|
mock_result.scalar_one_or_none.return_value = None
|
|
self.mock_db.execute.return_value = mock_result
|
|
|
|
# 执行并验证
|
|
response = await self.service.get_dataset("non-existent-id")
|
|
self.assertIsNone(response)
|
|
|
|
async def test_create_dataset_success(self):
|
|
"""测试创建数据集成功流程"""
|
|
# 1. 模拟名称不存在检查 (select Dataset.name) -> 返回 None
|
|
mock_result_check = MagicMock()
|
|
mock_result_check.scalar_one_or_none.return_value = None
|
|
self.mock_db.execute.return_value = mock_result_check
|
|
|
|
# 2. 调用创建服务
|
|
response = await self.service.create_dataset(
|
|
name="New Dataset",
|
|
dataset_type="IMAGE",
|
|
description="Testing create_dataset API",
|
|
status="PUBLISHED"
|
|
)
|
|
|
|
# 3. 验证结果
|
|
self.assertIsNotNone(response)
|
|
self.assertEqual(response.name, "New Dataset")
|
|
self.assertEqual(response.datasetType, "IMAGE")
|
|
self.assertEqual(response.description, "Testing create_dataset API")
|
|
self.assertEqual(response.status, "PUBLISHED")
|
|
|
|
# 确认 db.add 和 db.commit 被调用
|
|
self.mock_db.add.assert_called_once()
|
|
self.mock_db.commit.assert_called_once()
|
|
|
|
async def test_create_dataset_duplicated_name(self):
|
|
"""测试创建重名的数据集时抛出异常"""
|
|
# 模拟冲突的已有数据集
|
|
existing_dataset = Dataset(
|
|
id="existing-id",
|
|
name="Existing Dataset"
|
|
)
|
|
mock_result = MagicMock()
|
|
mock_result.scalar_one_or_none.return_value = existing_dataset
|
|
self.mock_db.execute.return_value = mock_result
|
|
|
|
# 检查是否正如预期抛出包含关键字 Exception
|
|
with self.assertRaises(Exception) as context:
|
|
await self.service.create_dataset(
|
|
name="Existing Dataset",
|
|
dataset_type="AUDIO"
|
|
)
|
|
self.assertIn("already exists", str(context.exception))
|
|
|
|
# 校验事务有无进行 commit
|
|
self.mock_db.commit.assert_not_called()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|