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