mirror of
https://github.com/insistence/RuoYi-Vue3-FastAPI.git
synced 2026-09-21 04:46:28 +00:00
* perf: 优化代码 * perf: 优化字典类型属性提醒说明 * perf: 优化顶部导航更多菜单路由截取 * perf: 优化RightToolbar搜索栏切换动画 * perf: 优化操作日志详细页面 * feat: 新增锁定屏幕功能 * feat: 字典类型列表新增抽屉效果详细信息 * perf: 优化页签功能&支持全屏按钮操作 * perf: 优化tag全屏为页签内区域 * perf: 菜单搜索支持文本高亮&数量提示 * feat: 添加持久化标签页开关功能 * perf: 优化页签显示 * perf: 优化菜单主题风格 * perf: 黑暗模式下全屏不需要设置背景 * perf: 暗黑浅色主题优化 * perf: 优化快速点击页签刷新出现404问题 * feat: 支持表格列显隐状态记忆 * feat: 代码生成支持表单布局选项 * feat: 新增树分割组件TreePanel * feat: 新增Excel导入组件ExcelImportDialog * perf: 优化样式 * feat: 用户列表新增抽屉效果详细信息 * perf: 代码生成修改拖拽时显示手指样式 * perf: 优化登录页暗黑模式下样式 * feat: 新增标签页样式chrome风格 * perf: 优化白名单支持对通配符路径匹配 * feat: 新增菜单路由地址和名称的校验规则 * feat: 首页新增通知公告消息提醒 * perf&feat: 优化定时任务详情页展示&补充执行时间字段 * feat: 部门管理支持批量保存排序 * feat: 菜单管理支持批量保存排序 * perf: 优化点击任务名称查看详细 * feat: 菜单管理列表新增类型显示 * feat: 新增代码生成详情页功能 * perf: 优化样式 * feat: 通知公告新增详细显示 * feat: 通知公告新增阅读用户列表 * perf: 更换router4过期方法next * perf: 优化暗黑模式下主题样式 * perf: 优化暗黑模式详情样式 * feat: 用户密码支持自定义配置规则 * fix: 修复E2E测试失败的问题
91 lines
3.2 KiB
Python
91 lines
3.2 KiB
Python
from types import SimpleNamespace
|
|
from unittest.mock import AsyncMock, patch
|
|
|
|
import pytest
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker, create_async_engine
|
|
|
|
from config.database import Base
|
|
from exceptions.exception import ServiceException
|
|
from module_admin.dao.dept_dao import DeptDao
|
|
from module_admin.entity.do.dept_do import SysDept
|
|
from module_admin.entity.vo.dept_vo import DeptSortModel
|
|
from module_admin.service.dept_service import DeptService
|
|
|
|
|
|
async def _create_dept_table() -> tuple[AsyncEngine, async_sessionmaker[AsyncSession]]:
|
|
engine = create_async_engine('sqlite+aiosqlite:///:memory:')
|
|
session_maker = async_sessionmaker(bind=engine, expire_on_commit=False)
|
|
async with engine.begin() as connection:
|
|
await connection.run_sync(Base.metadata.create_all, tables=[SysDept.__table__])
|
|
return engine, session_maker
|
|
|
|
|
|
def test_parse_dept_sort_items_preserves_corresponding_order_values() -> None:
|
|
result = DeptService.parse_dept_sort_items(DeptSortModel(deptIds='101, 102', orderNums='3, 1'))
|
|
|
|
assert result == [
|
|
{'dept_id': 101, 'order_num': 3},
|
|
{'dept_id': 102, 'order_num': 1},
|
|
]
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
('dept_ids', 'order_nums'),
|
|
[
|
|
('101,102', '1'),
|
|
('101,101', '1,2'),
|
|
('101,invalid', '1,2'),
|
|
('101,102', '1,-1'),
|
|
('', ''),
|
|
],
|
|
)
|
|
def test_parse_dept_sort_items_rejects_invalid_parameters(dept_ids: str, order_nums: str) -> None:
|
|
with pytest.raises(ServiceException) as exc_info:
|
|
DeptService.parse_dept_sort_items(DeptSortModel(deptIds=dept_ids, orderNums=order_nums))
|
|
|
|
assert exc_info.value.message == '部门排序参数不正确'
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_update_dept_sort_updates_all_rows_in_one_transaction() -> None:
|
|
engine, session_maker = await _create_dept_table()
|
|
try:
|
|
async with session_maker() as session:
|
|
session.add_all(
|
|
[
|
|
SysDept(dept_id=101, dept_name='研发部门', order_num=1),
|
|
SysDept(dept_id=102, dept_name='测试部门', order_num=2),
|
|
]
|
|
)
|
|
await session.commit()
|
|
|
|
result = await DeptService.update_dept_sort_services(
|
|
session,
|
|
DeptSortModel(deptIds='101,102', orderNums='5,4'),
|
|
)
|
|
rows = (await session.execute(select(SysDept.dept_id, SysDept.order_num).order_by(SysDept.dept_id))).all()
|
|
|
|
assert result.is_success is True
|
|
assert rows == [(101, 5), (102, 4)]
|
|
finally:
|
|
await engine.dispose()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_update_dept_sort_rolls_back_and_wraps_database_error() -> None:
|
|
query_db = SimpleNamespace(commit=AsyncMock(), rollback=AsyncMock())
|
|
|
|
with (
|
|
patch.object(DeptDao, 'update_dept_sort_dao', AsyncMock(side_effect=RuntimeError('database error'))),
|
|
pytest.raises(ServiceException) as exc_info,
|
|
):
|
|
await DeptService.update_dept_sort_services(
|
|
query_db,
|
|
DeptSortModel(deptIds='101', orderNums='2'),
|
|
)
|
|
|
|
assert exc_info.value.message == '保存排序异常,请联系管理员'
|
|
query_db.commit.assert_not_awaited()
|
|
query_db.rollback.assert_awaited_once()
|