Files
insistence 13143f41b2 feat: 同步ruoyi最新代码 (#117)
* 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测试失败的问题
2026-07-31 19:22:06 +08:00

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()