# 账号管理 — 测试用例

> **依据：** 《账号管理功能需求.md》v1.1、《账号管理技术方案.md》v1.1  
> **关联：** 《店铺管理测试用例.md》（双入口）、《管理员列表测试用例.md》（删除互锁）  
> **范围：** 平台端 `/agri/accountManage`；`AccountManageSupport` / `AccountProfileService` / `AccountManageService`  
> **排除：** 新增开户、前端 UI（本期不改前端）  
> **环境：** RuoYi v3.9.2-springboot2；MySQL 5.7.39

---

## 用例编号说明

| 前缀 | 类型 | 工具 |
|------|------|------|
| AM-UT-xxx | 单元测试 | JUnit 5 + Mockito |
| AM-API-xxx | 接口测试 | MockMvc / Apifox |
| AM-UI-xxx | 界面测试 | Playwright（非本期） |

---

## 一、单元测试

### AM-UT-001 列表含全部 sys_user

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-001 |
| **测试模块** | 账号管理 |
| **测试项** | selectList 范围 |
| **测试类型** | 单元测试 / 集成 |
| **测试目的** | 验证 AM1：以 sys_user 为主表 |
| **前置条件** | 库中存在平台管理员、会员、商户管理员 |
| **测试步骤** | 调用 `AccountManageServiceImpl.selectAccountList` |
| **预期结果** | 三类账号均出现在列表 |

### AM-UT-002 非商户管理员 shopCount 为空

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-002 |
| **测试模块** | 账号管理 |
| **测试项** | shopCount 展示 |
| **测试类型** | 单元测试 |
| **测试类** | `AccountManageServiceImplTest#selectAccountList_nonMerchantShopCountNull` |
| **测试目的** | 验证 AM2 |
| **预期结果** | 无商户管理员绑定的用户 `shopCount=null` |

### AM-UT-003 商户管理员 shopCount 统计

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-003 |
| **测试模块** | 账号管理 |
| **测试项** | shopCount 聚合 |
| **测试类型** | 单元测试 |
| **测试类** | `AccountManageServiceImplTest#selectAccountList_masksMobileAndKeepsShopCount` |
| **测试目的** | 验证仅统计 `biz_shop.del_flag=0` |
| **预期结果** | 商户管理员 `shopCount=有效店铺数` |

### AM-UT-004 检索仅账号名称

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-004 |
| **测试模块** | 账号管理 |
| **测试项** | 列表检索 |
| **测试类型** | 单元测试 / SQL |
| **测试目的** | 验证 AM3 |
| **测试步骤** | `AccountManageQuery.accountName` 匹配 `nick_name` |
| **预期结果** | **不** 按 `user_name` / `phonenumber` 检索 |

### AM-UT-005 列表 accountName 优先昵称

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-005 |
| **测试模块** | 账号管理 |
| **测试项** | ListVO 组装 |
| **测试类** | `AccountManageSupportTest#resolveAccountName_prefersNickName` |
| **预期结果** | 有 nick_name 时展示昵称，否则回退 user_name |

### AM-UT-006 列表手机号脱敏

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-006 |
| **测试模块** | 账号管理 |
| **测试项** | mobile 脱敏 |
| **测试类** | `AccountManageServiceImplTest#selectAccountList_masksMobileAndKeepsShopCount` |
| **预期结果** | 列表 mobile 含掩码（如 138****8000） |

### AM-UT-007 手机号解析规则

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-007 |
| **测试模块** | 账号管理 |
| **测试项** | resolveMobile |
| **测试类** | `AccountManageSupportTest` |
| **预期结果** | 商户管理员取 user_name；其他优先 phonenumber |

### AM-UT-008 改资料 accountName 为空失败

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-008 |
| **测试类** | `AccountManageSupportTest#validateProfileUpdate_rejectsEmptyAccountName` |
| **预期结果** | 抛异常；msg 含「账号名称」 |

### AM-UT-009 商户管理员改手机号需 confirm

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-009 |
| **测试类** | `AccountProfileServiceImplTest#updateProfile_merchantAdminMobileChangeNeedsConfirm` |
| **预期结果** | `needConfirm=true`；未写库 |

### AM-UT-010 非商户管理员改手机号无需 confirm

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-010 |
| **测试类** | `AccountProfileServiceImplTest#updateProfile_nonMerchantMobileChangeDirectSuccess` |
| **预期结果** | 直接成功；更新 phonenumber |

### AM-UT-011 改手机号重复失败

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-011 |
| **测试类** | `AccountProfileServiceImplTest#updateProfile_mobileDuplicateFails` |
| **预期结果** | msg 含「已被使用」 |

### AM-UT-012 改密两次不一致失败

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-012 |
| **测试类** | `AccountManageSupportTest#validatePasswordUpdate_rejectsMismatch` |
| **预期结果** | msg 含「不一致」 |

### AM-UT-013 改密成功 BCrypt 入库

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-013 |
| **测试类** | `AccountProfileServiceImplTest#updatePassword_encryptsPassword` |
| **预期结果** | password 为 BCrypt 哈希 |

### AM-UT-014 删除商户管理员仅删绑定

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-014 |
| **测试类** | `AccountManageServiceImplTest#deleteAccounts_merchantAdmin_logicDeleteBinding` |
| **预期结果** | `logicDeleteByUserId`；**不** 调 `deleteUserById` |

### AM-UT-015 删除普通账号删 sys_user

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-015 |
| **测试类** | `AccountManageServiceImplTest#deleteAccounts_nonMerchant_deletesSysUser` |
| **预期结果** | `sysUserMapper.deleteUserById` |

### AM-UT-016 删除 shopCount>0 失败

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-016 |
| **测试类** | `AccountManageSupportTest#assertDeletable_rejectsWhenMerchantHasShops` |
| **预期结果** | msg 含「仍有店铺」 |

### AM-UT-017 删除当前登录账号失败

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-017 |
| **测试类** | `AccountManageSupportTest#assertDeletable_rejectsSelf` |
| **预期结果** | msg 含「当前登录」 |

### AM-UT-018 详情不存在失败

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-018 |
| **测试类** | `AccountManageServiceImplTest#selectAccountDetail_notFound` |
| **预期结果** | msg 含「账号不存在」 |

### AM-UT-019 双入口共用 AccountProfileService

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-UT-019 |
| **测试模块** | 店铺管理协作 |
| **测试类** | `ShopServiceImplTest`（改经营账号） |
| **预期结果** | 经 `ShopService.updateMerchantAccount` 与经 `AccountManageService.updateProfile` **同一** `IAccountProfileService` |

---

## 二、接口测试

### AM-API-001 列表分页

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-API-001 |
| **测试类** | `AccountManageControllerTest#list_returns200` |
| **测试步骤** | `GET /agri/accountManage/list?pageNum=1&pageSize=10` |
| **前置条件** | Token 含 `agri:accountManage:list` |
| **预期结果** | `code=200`；rows 含 accountName、mobile（脱敏）、email、shopCount |

### AM-API-002 列表 accountName 检索

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-API-002 |
| **测试步骤** | `GET /agri/accountManage/list?accountName=张老` |
| **预期结果** | 命中 nick_name 模糊匹配；**不** 按手机号检索 |

### AM-API-003 详情回显完整手机号

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-API-003 |
| **测试类** | `AccountManageControllerTest#getInfo_returns200WithFullMobile` |
| **测试步骤** | `GET /agri/accountManage/{userId}` |
| **前置条件** | `agri:accountManage:query` |
| **预期结果** | `data.mobile` 为完整 11 位 |

### AM-API-004 修改资料 needConfirm

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-API-004 |
| **测试类** | `AccountManageControllerTest#edit_needConfirm_returns200WithData` |
| **测试步骤** | `PUT /agri/accountManage` body：userId、accountName、mobile（变更）、confirm=false |
| **预期结果** | `data.needConfirm=true` |

### AM-API-005 修改密码成功

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-API-005 |
| **测试类** | `AccountManageControllerTest#resetPwd_returns200` |
| **测试步骤** | `PUT /agri/accountManage/resetPwd` |
| **前置条件** | `agri:accountManage:resetPwd` |
| **预期结果** | `code=200` |

### AM-API-006 批量删除成功

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-API-006 |
| **测试类** | `AccountManageControllerTest#remove_returns200` |
| **测试步骤** | `DELETE /agri/accountManage/10,11` |
| **前置条件** | `agri:accountManage:remove` |
| **预期结果** | `code=200` |

### AM-API-007 无 list 权限拒绝

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-API-007 |
| **测试类型** | 集成 / Apifox |
| **前置条件** | Token **无** `agri:accountManage:list` |
| **预期结果** | HTTP 403 或业务无权限 |

### AM-API-008 不提供 POST 开户

| 要素 | 内容 |
|------|------|
| **用例编号** | AM-API-008 |
| **测试步骤** | `POST /agri/accountManage` |
| **预期结果** | 404 或方法不允许 |

---

## 三、协作测试

### AM-COL-001 店铺改账号与账号管理一致

| 要素 | 内容 |
|------|------|
| **关联** | SHP-API 店铺账号管理 |
| **测试步骤** | 经 `PUT /agri/shop/merchant/{merchantId}/account` 改 adminName/loginName |
| **预期结果** | 账号管理详情与店铺侧展示一致 |

### AM-COL-002 管理员列表删除互锁

| 要素 | 内容 |
|------|------|
| **关联** | PAD-UT 管理员删除 |
| **前置条件** | 用户仍有有效 `biz_merchant_account` 绑定 |
| **测试步骤** | `PlatformAdminSupport.assertDeletable` |
| **预期结果** | 阻断删除；须先在账号管理解除绑定或 shopCount=0 后删绑定 |

---

## 四、测试执行

```bash
# 账号管理单元 + 接口测试
mvn test -Dtest=AccountManageSupportTest,AccountProfileServiceImplTest,AccountManageServiceImplTest,AccountManageControllerTest

# 含店铺双入口
mvn test -Dtest=AccountManageSupportTest,AccountProfileServiceImplTest,AccountManageServiceImplTest,AccountManageControllerTest,ShopServiceImplTest
```

---

## 五、测试数据说明

| 角色 | 特征 | shopCount |
|------|------|-----------|
| 平台管理员 | sys_user，无 merchant 绑定 | null |
| C 端会员 | sys_user + member，phonenumber 有值 | null |
| 商户管理员 | biz_merchant_account.shop_id IS NULL | 0～N |
| 内置管理员 | userId=1 | null；不可删 |

---

## 六、修订记录

| 版本 | 说明 |
|------|------|
| v1.0 | 仅商户管理员；路径 `/agri/merchantAccount`（已废弃） |
| **v1.1** | 全平台 sys_user；路径 `/agri/accountManage`；用例编号 AM-*；与代码测试类对齐 |

---

*文档版本：v1.1 · 关联《账号管理功能需求.md》v1.1、《账号管理技术方案.md》v1.1*
