From f52a9a4ef0ef574aff88acf28b49d58f5c733cfb Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 30 九月 2026 12:18:25 +0800
Subject: [PATCH] 修改权限控制
---
ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TGroupCompanyServiceImplTest.java | 132 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 132 insertions(+), 0 deletions(-)
diff --git a/ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TGroupCompanyServiceImplTest.java b/ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TGroupCompanyServiceImplTest.java
index 508a71c..44165c6 100644
--- a/ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TGroupCompanyServiceImplTest.java
+++ b/ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TGroupCompanyServiceImplTest.java
@@ -13,6 +13,7 @@
import com.ruoyi.other.api.model.TCompanyRechargeRecord;
import com.ruoyi.other.mapper.TCompanyRechargeRecordMapper;
import com.ruoyi.other.mapper.TFleetMapper;
+import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysRoleClient;
import com.ruoyi.system.api.feignClient.SysUserClient;
import org.apache.ibatis.builder.MapperBuilderAssistant;
@@ -38,6 +39,9 @@
* 公司详情(车队数量、本月充值金额)统计逻辑单测,不依赖 Spring 容器与数据库。
*/
class TGroupCompanyServiceImplTest {
+
+ /** 编辑公司用例共享的远程账号客户端 mock,供 verify 使用 */
+ private SysUserClient editUserClient;
@BeforeAll
static void initTableInfo() {
@@ -335,6 +339,134 @@
return service;
}
+ /**
+ * 编辑公司修改登录账号:按旧账号定位用户后把 userName 更新为新账号,
+ * 不误走补建分支(避免双账号残留)
+ */
+ @Test
+ void editCompanyUpdatesUserNameWhenAccountChanged() {
+ TGroupCompany old = persistedCompany("company01");
+ TGroupCompany edit = editCompanyBody();
+ edit.setAccount("company02");
+
+ TGroupCompanyServiceImpl service = buildEditCompanyService(old, "company01", owner(100L), "company02", null);
+
+ assertEquals(200, code(service.editCompany(edit)));
+
+ ArgumentCaptor<SysUser> captor = ArgumentCaptor.forClass(SysUser.class);
+ Mockito.verify(editUserClient).updateSysUser(captor.capture());
+ assertEquals("company02", captor.getValue().getUserName());
+ Mockito.verify(editUserClient, Mockito.never()).addSysUser(Mockito.any());
+ assertEquals("company02", edit.getAccount());
+ }
+
+ /**
+ * 编辑公司修改登录密码:调用 resetPassword 且仅携带 userId 与密码(前端已 HMAC-MD5)
+ */
+ @Test
+ void editCompanyResetsPasswordWhenProvided() {
+ TGroupCompany old = persistedCompany("company01");
+ TGroupCompany edit = editCompanyBody();
+ edit.setAccount("company01");
+ edit.setPassword("hmac-value");
+
+ TGroupCompanyServiceImpl service = buildEditCompanyService(old, "company01", owner(100L), null, null);
+
+ assertEquals(200, code(service.editCompany(edit)));
+
+ ArgumentCaptor<SysUser> pwdCaptor = ArgumentCaptor.forClass(SysUser.class);
+ Mockito.verify(editUserClient).resetPassword(pwdCaptor.capture());
+ assertEquals(Long.valueOf(100L), pwdCaptor.getValue().getUserId());
+ assertEquals("hmac-value", pwdCaptor.getValue().getPassword());
+
+ // 资料更新调用不携带密码,避免哈希/脱敏值写回
+ ArgumentCaptor<SysUser> userCaptor = ArgumentCaptor.forClass(SysUser.class);
+ Mockito.verify(editUserClient).updateSysUser(userCaptor.capture());
+ assertNull(userCaptor.getValue().getPassword());
+ }
+
+ /**
+ * 新账号已被其他用户占用:返回错误且不更新任何数据
+ */
+ @Test
+ void editCompanyRejectsAccountOccupiedByOtherUser() {
+ TGroupCompany old = persistedCompany("company01");
+ TGroupCompany edit = editCompanyBody();
+ edit.setAccount("company02");
+
+ TGroupCompanyServiceImpl service = buildEditCompanyService(old, "company01", owner(100L),
+ "company02", owner(999L));
+
+ assertEquals(500, code(service.editCompany(edit)));
+
+ Mockito.verify(editUserClient, Mockito.never()).updateSysUser(Mockito.any());
+ Mockito.verify(editUserClient, Mockito.never()).resetPassword(Mockito.any());
+ Mockito.verify(service, Mockito.never()).updateById(Mockito.any());
+ }
+
+ /**
+ * 编辑时密码留空:不调用 resetPassword,密码保持不变
+ */
+ @Test
+ void editCompanyKeepsPasswordWhenAbsent() {
+ TGroupCompany old = persistedCompany("company01");
+ TGroupCompany edit = editCompanyBody();
+ edit.setAccount("company01");
+
+ TGroupCompanyServiceImpl service = buildEditCompanyService(old, "company01", owner(100L), null, null);
+
+ assertEquals(200, code(service.editCompany(edit)));
+
+ Mockito.verify(editUserClient, Mockito.never()).resetPassword(Mockito.any());
+ Mockito.verify(editUserClient).updateSysUser(Mockito.any(SysUser.class));
+ }
+
+ private TGroupCompany persistedCompany(String account) {
+ TGroupCompany company = new TGroupCompany();
+ company.setId(1);
+ company.setAccount(account);
+ company.setName("旧公司名");
+ return company;
+ }
+
+ private TGroupCompany editCompanyBody() {
+ TGroupCompany company = new TGroupCompany();
+ company.setId(1);
+ company.setName("新公司名");
+ company.setContactPhone("13800000000");
+ return company;
+ }
+
+ private SysUser owner(Long userId) {
+ SysUser user = new SysUser();
+ user.setUserId(userId);
+ user.setPassword("hashed");
+ return user;
+ }
+
+ /**
+ * 构建编辑公司场景的 spy:getById 返回库里旧记录,updateById 打桩;
+ * queryUserByUserName 按账号返回不同用户(newAccountUser 非 null 时用于模拟新账号占用)
+ */
+ private TGroupCompanyServiceImpl buildEditCompanyService(TGroupCompany old, String oldAccount, SysUser oldAccountUser,
+ String newAccount, SysUser newAccountUser) {
+ SysUserClient sysUserClient = Mockito.mock(SysUserClient.class);
+ Mockito.when(sysUserClient.queryUserByUserName(oldAccount)).thenReturn(R.ok(oldAccountUser));
+ if (newAccount != null) {
+ Mockito.when(sysUserClient.queryUserByUserName(newAccount)).thenReturn(R.ok(newAccountUser));
+ }
+ Mockito.when(sysUserClient.updateSysUser(Mockito.any())).thenReturn(R.ok(true));
+ Mockito.when(sysUserClient.resetPassword(Mockito.any())).thenReturn(R.ok());
+ this.editUserClient = sysUserClient;
+
+ TGroupCompanyServiceImpl service = Mockito.spy(new TGroupCompanyServiceImpl());
+ Mockito.doReturn(old).when(service).getById(Mockito.any());
+ Mockito.doReturn(true).when(service).updateById(Mockito.any());
+ Mockito.doReturn(0L).when(service).count(Mockito.any());
+ ReflectionTestUtils.setField(service, "sysUserClient", sysUserClient);
+ return service;
+ }
+
private int code(AjaxResult result) {
return ((Number) result.get("code")).intValue();
}
--
Gitblit v1.7.1