|
|
@@ -9,7 +9,7 @@
|
|
|
|
|
|
### 1.1 整体调用链路
|
|
|
|
|
|
-```
|
|
|
+```text
|
|
|
HTTP Client gRPC Client
|
|
|
│ │
|
|
|
▼ ▼
|
|
|
@@ -40,7 +40,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
共 9 个 Model,每个包含:
|
|
|
|
|
|
| 层级 | 方法类别 | 数量/模型 | 来源 |
|
|
|
-|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- |
|
|
|
| _gen.go 基础 CRUD | Insert, InsertWithTx, FindOne, FindOneWithTx, Update, UpdateWithTx, Delete, DeleteWithTx | 8 | 自定义模板 |
|
|
|
| _gen.go 批量操作 | BatchInsert, BatchInsertWithTx, BatchUpdate, BatchUpdateWithTx, BatchDelete, BatchDeleteWithTx | 6 | 自定义模板 |
|
|
|
| _gen.go 唯一索引查询 | FindOneBy{UniqueField}, FindOneBy{UniqueField}WithTx (因表而异) | 0~2 组 | 自定义模板 |
|
|
|
@@ -49,7 +49,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
|
|
|
### 1.3 权限计算逻辑链路
|
|
|
|
|
|
-```
|
|
|
+```text
|
|
|
输入: userId + deptId + productCode + isSuperAdmin(bool)
|
|
|
│
|
|
|
├─ isSuperAdmin=true → 产品全部启用权限 + "SUPER_ADMIN"
|
|
|
@@ -69,7 +69,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.1 登录 `POST /api/auth/login`
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0001 | POST /api/auth/login | 正常登录-不带productCode | `{"username":"admin","password":"123456"}` | code=0, accessToken/refreshToken/userInfo | 正常路径 | P0 | loginLogic全路径 |
|
|
|
| TC-0002 | POST /api/auth/login | 正常登录-带productCode | `{"username":"user1","password":"123456","productCode":"test"}` | code=0, perms含用户可用权限 | 正常路径 | P0 | GetUserPerms(false) MEMBER分支 |
|
|
|
| TC-0003 | POST /api/auth/login | 超管登录+productCode | `{"username":"super","password":"x","productCode":"p1"}` | memberType="SUPER_ADMIN", perms全量 | 分支覆盖 | P0 | GetUserPerms(true) |
|
|
|
@@ -86,7 +86,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.2 刷新Token `POST /api/auth/refreshToken`
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0013 | POST /api/auth/refreshToken | 正常刷新 | Header `Authorization: Bearer <refreshToken>` | code=0, 新accessToken, refreshToken原样返回(不重新生成) | 正常路径 | P0 | refreshTokenLogic全路径 |
|
|
|
| TC-0014 | POST /api/auth/refreshToken | 不带productCode(回退) | Header Authorization, 无productCode | 使用claims.ProductCode | 分支覆盖 | P1 | productCode=""回退 |
|
|
|
| TC-0015 | POST /api/auth/refreshToken | token无效 | Header `Authorization: Bearer invalid` | code=401 | 异常路径 | P0 | ParseRefreshToken失败 |
|
|
|
@@ -97,7 +97,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.3 同步权限 `POST /api/perm/sync`
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0019 | POST /api/perm/sync | 全部新增 | `{"appKey":"ak","appSecret":"as","perms":[{"code":"x","name":"y"}]}` | code=0, added=1, updated=0, disabled=0 | 正常路径 | P0 | toInsert→BatchInsert |
|
|
|
| TC-0020 | POST /api/perm/sync | 更新已有(名称变更) | 已存在code但name不同 | updated=1 | 正常路径 | P0 | toUpdate→BatchUpdate |
|
|
|
| TC-0021 | POST /api/perm/sync | 无变化 | 已存在且name/remark/status均相同 | added=0, updated=0 | 分支覆盖 | P1 | 跳过更新 |
|
|
|
@@ -113,7 +113,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.4 获取用户信息 `POST /api/auth/userInfo`
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0030 | POST /api/auth/userInfo | 正常获取-含productCode | Bearer token (含productCode) | code=0, 完整UserInfo+实时perms | 正常路径 | P0 | userInfoLogic全路径 |
|
|
|
| TC-0031 | POST /api/auth/userInfo | 不含productCode | Bearer token (无productCode) | perms为空 | 分支覆盖 | P1 | productCode="" |
|
|
|
| TC-0032 | POST /api/auth/userInfo | 未登录 | 无Authorization头 | code=401, "未登录" | 异常路径 | P0 | middleware拦截 |
|
|
|
@@ -123,7 +123,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.5 修改密码 `POST /api/auth/changePassword`
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0035 | POST /api/auth/changePassword | 正常修改 | `{"oldPassword":"123456","newPassword":"654321"}` | code=0 | 正常路径 | P0 | changePasswordLogic全路径 |
|
|
|
| TC-0036 | POST /api/auth/changePassword | mustChangePassword重置 | 正常修改后 | DB中mustChangePassword=2 | 功能验证 | P0 | user.MustChangePassword=2 |
|
|
|
| TC-0037 | POST /api/auth/changePassword | 原密码错误 | `{"oldPassword":"wrong","newPassword":"newpwd"}` | code=400, "原密码错误" | 异常路径 | P0 | bcrypt失败 |
|
|
|
@@ -138,7 +138,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.6 创建产品 `POST /api/product/create`
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0045 | POST /api/product/create | 正常创建 | `{"code":"new","name":"新产品"}` | code=0, id/appKey/appSecret/adminUser/adminPassword | 正常路径 | P0 | TransactCtx全路径 |
|
|
|
| TC-0046 | POST /api/product/create | 事务回滚-用户创建失败 | 模拟InsertWithTx User失败 | 返回错误, DB无新产品 | 事务验证 | P0 | TransactCtx回滚 |
|
|
|
| TC-0047 | POST /api/product/create | 事务回滚-成员创建失败 | 模拟InsertWithTx Member失败 | 产品和用户均回滚 | 事务验证 | P0 | TransactCtx回滚 |
|
|
|
@@ -148,7 +148,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.7 产品更新/列表/详情
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0050 | POST /api/product/update | 正常更新 | `{"id":1,"name":"新名","status":1}` | code=0 | 正常路径 | P0 | updateProductLogic |
|
|
|
| TC-0051 | POST /api/product/update | 不存在 | `{"id":9999,"name":"x"}` | code=404 | 异常路径 | P0 | FindOne失败 |
|
|
|
| TC-0052 | POST /api/product/update | 不传status | `{"id":1,"name":"x"}` | status不变 | 分支覆盖 | P1 | Status>0 |
|
|
|
@@ -163,7 +163,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.8 创建部门 `POST /api/dept/create`
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0060 | POST /api/dept/create | 创建顶级部门 | `{"parentId":0,"name":"总部"}` | code=0, path="/{id}/" | 正常路径 | P0 | TransactCtx, parentPath="/" |
|
|
|
| TC-0061 | POST /api/dept/create | 创建子部门 | `{"parentId":1,"name":"技术部"}` | code=0, path=parent.path+id+"/" | 正常路径 | P0 | parentId>0分支 |
|
|
|
| TC-0062 | POST /api/dept/create | 父部门不存在 | `{"parentId":9999,"name":"x"}` | code=404, "父部门不存在" | 异常路径 | P0 | FindOneWithTx失败 |
|
|
|
@@ -178,7 +178,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.9 部门更新/删除/树
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0070 | POST /api/dept/update | 正常更新 | `{"id":1,"name":"新名","sort":5}` | code=0 | 正常路径 | P0 | updateDeptLogic |
|
|
|
| TC-0071 | POST /api/dept/update | 不存在 | `{"id":9999,"name":"x"}` | code=404 | 异常路径 | P0 | FindOne失败 |
|
|
|
| TC-0072 | POST /api/dept/update | DeptType NORMAL→DEV | `{"id":1,"deptType":"DEV"}` | DB deptType="DEV" | 正常路径 | P0 | DeptType合法值更新 |
|
|
|
@@ -193,7 +193,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.10 权限列表 `POST /api/perm/list`
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0080 | POST /api/perm/list | 正常查询 | `{"productCode":"p1","page":1,"pageSize":10}` | code=0, total/list | 正常路径 | P0 | permListLogic |
|
|
|
| TC-0081 | POST /api/perm/list | 默认分页 | `{"productCode":"p1"}` | page=1, pageSize=20 | 分支覆盖 | P1 | NormalizePage |
|
|
|
| TC-0082 | POST /api/perm/list | pageSize超过上限 | `{"productCode":"p1","pageSize":200}` | 实际pageSize=100 | 边界 | P0 | NormalizePage cap |
|
|
|
@@ -202,7 +202,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.11 角色管理
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0084 | POST /api/role/create | 正常创建 | `{"productCode":"p1","name":"管理员","permsLevel":1}` | code=0, id>0 | 正常路径 | P0 | createRoleLogic |
|
|
|
| TC-0085 | POST /api/role/create | 重复角色名 | 同产品同名 | code=409, "该产品下角色名已存在" | 业务约束 | P0 | Duplicate entry→ErrConflict |
|
|
|
| TC-0086 | POST /api/role/create | 并发同名创建 | 两请求同时 | 一成功一冲突409 | 并发 | P1 | 唯一索引+1062捕获 |
|
|
|
@@ -216,7 +216,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.12 删除角色 `POST /api/role/delete`
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0093 | POST /api/role/delete | 正常删除+级联 | `{"id":5}` (含权限/用户绑定) | code=0, role_perm/user_role同步清理 | 正常+事务 | P0 | TransactCtx全路径 |
|
|
|
| TC-0094 | POST /api/role/delete | 事务回滚 | 模拟DeleteWithTx失败 | 级联删除回滚 | 事务验证 | P0 | TransactCtx |
|
|
|
| TC-0095 | POST /api/role/delete | 无关联数据 | 新角色无绑定 | code=0 | 分支覆盖 | P1 | 删0条 |
|
|
|
@@ -224,7 +224,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.13 绑定角色权限 `POST /api/role/bindPerms`
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0096 | POST /api/role/bindPerms | 正常绑定 | `{"roleId":1,"permIds":[1,2,3]}` | code=0 | 正常路径 | P0 | TransactCtx |
|
|
|
| TC-0097 | POST /api/role/bindPerms | 角色不存在 | `{"roleId":9999,"permIds":[1]}` | code=404, "角色不存在" | 存在性校验 | P0 | FindOne预检 |
|
|
|
| TC-0098 | POST /api/role/bindPerms | 清空权限 | `{"roleId":1,"permIds":[]}` | code=0, 全清空 | 分支覆盖 | P1 | len==0→return |
|
|
|
@@ -234,7 +234,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.14 创建用户 `POST /api/user/create`
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0101 | POST /api/user/create | 正常创建 | `{"username":"new","password":"123456"}` | code=0, id>0 | 正常路径 | P0 | createUserLogic |
|
|
|
| TC-0102 | POST /api/user/create | 用户名已存在(预检) | `{"username":"existing","password":"x"}` | code=409, "用户名已存在" | 异常路径 | P0 | FindOneByUsername成功 |
|
|
|
| TC-0103 | POST /api/user/create | 带完整可选字段 | 含nickname/email/phone/remark/deptId | code=0 | 正常路径 | P1 | 各字段赋值 |
|
|
|
@@ -250,7 +250,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.15 用户更新 `POST /api/user/update` (指针类型+DeptId可清零)
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0112 | POST /api/user/update | 正常更新 | `{"id":1,"nickname":"n","email":"[email protected]"}` | code=0 | 正常路径 | P0 | updateUserLogic |
|
|
|
| TC-0113 | POST /api/user/update | 不存在 | `{"id":9999}` | code=404 | 异常路径 | P0 | FindOne失败 |
|
|
|
| TC-0114 | POST /api/user/update | 仅传id | `{"id":1}` | 仅updateTime变 | 分支覆盖 | P1 | 所有指针nil |
|
|
|
@@ -261,14 +261,14 @@ MySQL (InnoDB) + Redis Cache
|
|
|
| TC-0119 | POST /api/user/update | 非法phone格式 | `{"id":1,"phone":"12345"}` | code=400, "手机号格式不正确" | 输入校验 | P0 | util.IsValidPhone |
|
|
|
| TC-0120 | POST /api/user/update | 合法phone | `{"id":1,"phone":"+8613800138000"}` | code=0 | 正常路径 | P1 | IsValidPhone通过 |
|
|
|
| TC-0121 | POST /api/user/update | 不传email(nil) | `{"id":1,"nickname":"x"}` | email不变 | 分支覆盖 | P1 | req.Email==nil |
|
|
|
-| TC-0122 | POST /api/user/update | DeptId设为0(取消部门) | `{"id":1,"deptId":0}` | DB deptId→0 | 功能 | P0 | *int64, *req.DeptId=0 |
|
|
|
+| TC-0122 | POST /api/user/update | DeptId设为0(取消部门) | `{"id":1,"deptId":0}` | DB deptId→0 | 功能 | P0 | \*int64, \*req.DeptId=0 |
|
|
|
| TC-0123 | POST /api/user/update | DeptId设为正值 | `{"id":1,"deptId":5}` | DB deptId→5 | 正常路径 | P0 | *int64指针 |
|
|
|
| TC-0124 | POST /api/user/update | DeptId不传(nil) | `{"id":1,"nickname":"x"}` | deptId不变 | 分支覆盖 | P1 | req.DeptId==nil |
|
|
|
|
|
|
### 2.16 用户列表/详情/状态 及其他用户操作
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0125 | POST /api/user/list | 含productCode | `{"productCode":"p1","page":1,"pageSize":10}` | 每用户含memberType(批量查) | 正常路径 | P0 | FindMapByProductCodeUserIds |
|
|
|
| TC-0126 | POST /api/user/list | 不含productCode | `{"page":1}` | memberType全空,不调批量查 | 分支覆盖 | P1 | productCode="" |
|
|
|
| TC-0127 | POST /api/user/list | pageSize超过上限 | `{"pageSize":500}` | 实际pageSize=100 | 边界 | P0 | NormalizePage cap |
|
|
|
@@ -294,7 +294,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 2.17 成员管理
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入参数 (JSON) | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0146 | POST /api/member/add | 正常添加 | `{"productCode":"p1","userId":1,"memberType":"MEMBER"}` | code=0, id>0 | 正常路径 | P0 | addMemberLogic |
|
|
|
| TC-0147 | POST /api/member/add | 产品不存在 | `{"productCode":"notexist",...}` | code=404, "产品不存在" | 存在性校验 | P0 | FindOneByCode预检 |
|
|
|
| TC-0148 | POST /api/member/add | 用户不存在 | `{"userId":9999,...}` | code=404, "用户不存在" | 存在性校验 | P0 | FindOne预检 |
|
|
|
@@ -318,7 +318,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 3.1 gRPC SyncPermissions
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入 | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0161 | SyncPermissions | 正常同步 | valid req | added/updated/disabled计数正确 | 正常路径 | P0 | permserver.go SyncPermissions |
|
|
|
| TC-0162 | SyncPermissions | appKey无效 | invalid appKey | codes.Unauthenticated | 异常路径 | P0 | status.Error |
|
|
|
| TC-0163 | SyncPermissions | appSecret错误 | wrong secret | codes.Unauthenticated | 异常路径 | P0 | status.Error |
|
|
|
@@ -328,7 +328,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 3.2 gRPC Login / RefreshToken / VerifyToken / GetUserPerms
|
|
|
|
|
|
| TC编号 | 接口/方法 | 测试场景 | 输入 | 预期结果 | 测试类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0166 | Login | 正常登录(无productCode) | valid credentials | token对+userInfo | 正常路径 | P0 | permserver.go Login |
|
|
|
| TC-0167 | Login | 用户不存在 | wrong username | codes.Unauthenticated | 异常路径 | P0 | status.Error |
|
|
|
| TC-0168 | Login | 密码错误 | wrong password | codes.Unauthenticated | 异常路径 | P0 | status.Error |
|
|
|
@@ -353,7 +353,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
## 四、JWT中间件 / 统一响应测试用例
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0184 | 正常Bearer token | `Authorization: Bearer {valid}` | 通过, ctx注入5个值 | 正常路径 | P0 | middleware全路径 |
|
|
|
| TC-0185 | 无Authorization头 | 无Header | code=401, "未登录" | 异常 | P0 | authHeader=="" |
|
|
|
| TC-0186 | 无Bearer前缀 | `Authorization: xxx` | code=401, "token格式错误" | 异常 | P0 | TrimPrefix相等 |
|
|
|
@@ -373,7 +373,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 5.1 NormalizePage
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0194 | 正常值 | page=2, pageSize=10 | (2, 10) | 正常路径 | P0 | 无修正 |
|
|
|
| TC-0195 | page<=0 | page=0, pageSize=10 | (1, 10) | 边界 | P0 | page<=0→1 |
|
|
|
| TC-0196 | page=-1 | page=-1, pageSize=10 | (1, 10) | 边界 | P0 | page<=0→1 |
|
|
|
@@ -386,7 +386,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 5.2 IsValidEmail
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0202 | 正常邮箱 | `[email protected]` | true | 正常路径 | P0 | 标准格式 |
|
|
|
| TC-0203 | 含点号 | `[email protected]` | true | 正常路径 | P1 | 允许点号 |
|
|
|
| TC-0204 | 含加号 | `[email protected]` | true | 正常路径 | P1 | 允许加号 |
|
|
|
@@ -398,7 +398,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 5.3 IsValidPhone
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0209 | 国内手机号 | `13800138000` | true | 正常路径 | P0 | 11位数字 |
|
|
|
| TC-0210 | 带+国际码 | `+8613800138000` | true | 正常路径 | P0 | +前缀 |
|
|
|
| TC-0211 | 太短(6位) | `123456` | false | 边界 | P0 | <7位 |
|
|
|
@@ -417,7 +417,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 6.1 auth/jwt.go — GenerateAccessToken
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0217 | 正常生成 | secret="s", expire=3600, userId=1, username="u", productCode="p", memberType="M", perms=["a"] | 返回非空token, err=nil | 正常路径 | P0 | jwt.NewWithClaims(HS256) |
|
|
|
| TC-0218 | 解析token验证claims | 上述token | ParseWithClaims可解析出正确userId/username/productCode/memberType/perms | 功能验证 | P0 | claims完整性 |
|
|
|
| TC-0219 | 空secret | secret="" | 仍能生成token(空key签名) | 边界 | P2 | HS256 允许空key |
|
|
|
@@ -427,7 +427,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 6.2 auth/jwt.go — GenerateRefreshToken
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0222 | 正常生成 | secret="s", expire=86400, userId=1, productCode="p" | 返回非空token | 正常路径 | P0 | RefreshClaims |
|
|
|
| TC-0223 | 解析验证 | 上述token | ParseRefreshToken解析出userId=1, productCode="p" | 功能验证 | P0 | 往返一致 |
|
|
|
| TC-0224 | productCode为空 | productCode="" | 生成成功, 解析后productCode="" | 边界 | P1 | 空字符串 |
|
|
|
@@ -435,7 +435,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 6.3 auth/jwt.go — ParseRefreshToken
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0225 | 正常解析 | 有效token+正确secret | 返回RefreshClaims, err=nil | 正常路径 | P0 | token.Valid |
|
|
|
| TC-0226 | 错误secret | 有效token+错误secret | err!=nil | 异常路径 | P0 | 签名验证失败 |
|
|
|
| TC-0227 | 无效token字符串 | "invalid-token" | err!=nil | 异常路径 | P0 | 解析失败 |
|
|
|
@@ -450,7 +450,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
> **v7 变更**: GetUserPerms 新增 `deptId` 参数,MEMBER 类型增加 DEV 部门全权限分支。
|
|
|
|
|
|
| TC编号 | 测试场景 | Mock设置 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0231 | 超管 | isSuperAdmin=true, deptId=0, FindAllCodesByProductCode返回["a","b"] | perms=["a","b"], memberType="SUPER_ADMIN" | 正常路径 | P0 | isSuperAdmin分支 |
|
|
|
| TC-0232 | 超管+查询失败 | isSuperAdmin=true, deptId=0, FindAllCodesByProductCode返回err | err透传, perms=nil | 异常路径 | P0 | err分支 |
|
|
|
| TC-0233 | 非产品成员 | deptId=0, FindOneByProductCodeUserId返回ErrNotFound | perms=nil, memberType="" | 分支覆盖 | P0 | ErrNotFound |
|
|
|
@@ -482,7 +482,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 6.5 middleware — 辅助函数单元测试
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0258 | GetUserId-正常 | ctx含userId=100 | 100 | 正常路径 | P0 | 类型断言成功 |
|
|
|
| TC-0259 | GetUserId-空ctx | 空ctx | 0 | 边界 | P0 | 断言失败→零值 |
|
|
|
| TC-0260 | GetUsername-正常 | ctx含username="admin" | "admin" | 正常路径 | P0 | 类型断言 |
|
|
|
@@ -505,7 +505,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
> 适用: SysUser, SysProduct, SysPerm, SysDept, SysRole, SysRolePerm, SysUserPerm, SysUserRole, SysProductMember
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0267 | **Insert** | 正常插入 | 返回Result+nil, DB有新记录 | 正常路径 | P0 | ExecCtx+缓存key清理 |
|
|
|
| TC-0268 | **Insert** | 唯一索引冲突 | 返回DB错误(1062) | 异常路径 | P0 | MySQL uk |
|
|
|
| TC-0269 | **Insert** | 缓存key生成正确 | 验证清理的缓存key包含主键和唯一索引 | 功能验证 | P0 | cacheSys*Prefix |
|
|
|
@@ -531,7 +531,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 7.2 批量插入方法
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0288 | **BatchInsert** | 空列表 | 直接返回nil, 不执行SQL | 边界 | P0 | len==0 early return |
|
|
|
| TC-0289 | **BatchInsert** | 单条记录 | 生成1组VALUES, 执行成功 | 正常路径 | P0 | 单条 |
|
|
|
| TC-0290 | **BatchInsert** | 多条记录(3条) | 生成3组VALUES, SQL正确, 缓存key全清理 | 正常路径 | P0 | 多条+缓存 |
|
|
|
@@ -544,7 +544,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 7.3 批量更新方法
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0296 | **BatchUpdate** | 空列表 | 直接返回nil | 边界 | P0 | len==0 early return |
|
|
|
| TC-0297 | **BatchUpdate** | 单条记录 | CASE-WHEN SQL正确, 更新成功 | 正常路径 | P0 | buildBatchUpdateQuery 单条 |
|
|
|
| TC-0298 | **BatchUpdate** | 多条记录(3条) | CASE-WHEN生成3个WHEN子句, 旧缓存key全清理 | 正常路径 | P0 | buildBatchUpdateQuery 多条 |
|
|
|
@@ -558,7 +558,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 7.4 批量删除方法
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0305 | **BatchDelete** | 空ids | 直接返回nil | 边界 | P0 | len==0 early return |
|
|
|
| TC-0306 | **BatchDelete** | 单个id | DELETE WHERE id IN (?), 缓存清理 | 正常路径 | P0 | 单条 |
|
|
|
| TC-0307 | **BatchDelete** | 多个id(3个) | 3个占位符, 旧数据查询→缓存key全清理 | 正常路径 | P0 | findListByPrimaryKeys |
|
|
|
@@ -571,7 +571,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
> **v7 新增**: 每个 FindOneBy{UniqueField} 均新增对应 FindOneBy{UniqueField}WithTx 方法,通过 session 直查(无缓存)。
|
|
|
|
|
|
| TC编号 | Model | 方法 | 测试场景 | 预期结果 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0311 | SysUser | FindOneByUsername | 正常查询 | 返回用户, 缓存写入 (索引缓存→主键缓存双层) | P0 | QueryRowIndexCtx |
|
|
|
| TC-0312 | SysUser | FindOneByUsername | 不存在 | 返回ErrNotFound | P0 | sqlc.ErrNotFound |
|
|
|
| TC-0313 | SysUser | FindOneByUsernameWithTx | 事务内正常查询 | 返回用户, 使用session直查 | P0 | session.QueryRowCtx |
|
|
|
@@ -612,7 +612,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 7.6 内部辅助方法
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0347 | **findListByPrimaryKeys** | 空ids | 返回空slice, 不执行SQL | 边界 | P0 | len==0 |
|
|
|
| TC-0348 | **findListByPrimaryKeys** | 正常ids | 返回匹配记录(无缓存) | 正常路径 | P0 | QueryRowsNoCacheCtx |
|
|
|
| TC-0349 | **findListByPrimaryKeys** | 部分不存在 | 仅返回存在的记录 | 边界 | P1 | IN查询 |
|
|
|
@@ -624,7 +624,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 7.7 缓存key与前缀初始化
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0354 | cachePrefix为空 | cachePrefix="" | 使用默认前缀 (如 "cache:sysUser:id:") | 分支覆盖 | P0 | if cachePrefix!="" 未进入 |
|
|
|
| TC-0355 | cachePrefix非空 | cachePrefix="test" | 前缀变为 "test:cache:sysUser:id:" | 分支覆盖 | P0 | if cachePrefix!="" 进入 |
|
|
|
| TC-0356 | 多唯一索引前缀(SysProduct) | cachePrefix="test" | 3个缓存前缀均更新: id/appKey/code | 功能验证 | P0 | 3个变量均修改 |
|
|
|
@@ -636,7 +636,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 8.1 SysUserModel
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0357 | FindListByPage | 正常分页 | page=1, pageSize=10, DB有20条 | 返回10条+total=20 | 正常路径 | P0 | count+limit offset |
|
|
|
| TC-0358 | FindListByPage | 第二页 | page=2, pageSize=10 | offset=10, 返回后10条 | 正常路径 | P0 | (page-1)*pageSize |
|
|
|
| TC-0359 | FindListByPage | 空表 | 无数据 | total=0, list为空 | 边界 | P0 | count=0 |
|
|
|
@@ -654,7 +654,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 8.2 SysProductModel
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0370 | FindList | 正常分页 | page=1, pageSize=10 | 返回list+total | 正常路径 | P0 | count+limit |
|
|
|
| TC-0371 | FindList | 空表 | 无数据 | total=0, list空 | 边界 | P0 | |
|
|
|
| TC-0372 | FindList | count失败 | DB异常 | 返回err | 异常路径 | P1 | 第一个err |
|
|
|
@@ -662,7 +662,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 8.3 SysPermModel
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0373 | FindListByProductCode | 正常分页 | productCode="p1", page=1, pageSize=10 | list+total | 正常路径 | P0 | WHERE productCode=? |
|
|
|
| TC-0374 | FindListByProductCode | 不存在的productCode | "notexist" | total=0, list空 | 边界 | P1 | |
|
|
|
| TC-0375 | FindAllByProductCode | 正常查询(仅status=1) | DB有status=1和status=2 | 仅返回status=1 | 正常路径 | P0 | AND status=1 |
|
|
|
@@ -682,7 +682,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 8.4 SysDeptModel
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0388 | FindAll | 正常查询 | DB有5条 | 返回5条, 按sort asc排序 | 正常路径 | P0 | ORDER BY sort, id |
|
|
|
| TC-0389 | FindAll | 空表 | 无数据 | 空slice | 边界 | P0 | |
|
|
|
| TC-0390 | FindByParentId | 正常查询 | parentId=1 | 返回子部门列表 | 正常路径 | P0 | WHERE parentId=? |
|
|
|
@@ -694,7 +694,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 8.5 SysRoleModel
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0395 | FindListByProductCode | 正常分页 | productCode="p1" | 按permsLevel asc排序 | 正常路径 | P0 | ORDER BY permsLevel, id |
|
|
|
| TC-0396 | FindListByProductCode | 空结果 | 无匹配 | total=0 | 边界 | P1 | |
|
|
|
| TC-0397 | FindByIds | 正常 | ids=[1,2] | 返回2条 | 正常路径 | P0 | IN查询 |
|
|
|
@@ -703,7 +703,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 8.6 SysRolePermModel
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0399 | FindPermIdsByRoleId | 正常查询 | roleId=1, DB有3条 | 返回3个permId | 正常路径 | P0 | SELECT permId WHERE roleId=? |
|
|
|
| TC-0400 | FindPermIdsByRoleId | 无绑定 | roleId=999 | 空slice | 边界 | P1 | |
|
|
|
| TC-0401 | FindPermIdsByRoleIds | 正常查询 | roleIds=[1,2] | 返回去重后的permId | 正常路径 | P0 | DISTINCT + IN |
|
|
|
@@ -716,7 +716,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 8.7 SysUserPermModel
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0407 | FindByUserId | 正常查询 | userId=1 | 返回该用户所有权限配置 | 正常路径 | P0 | WHERE userId=? |
|
|
|
| TC-0408 | FindByUserId | 无记录 | userId=999 | 空slice | 边界 | P1 | |
|
|
|
| TC-0409 | FindPermIdsByUserIdAndEffect | ALLOW | userId=1, effect="ALLOW" | 返回ALLOW的permIds | 正常路径 | P0 | AND effect=? |
|
|
|
@@ -731,7 +731,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 8.8 SysUserRoleModel
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0417 | FindRoleIdsByUserId | 正常查询 | userId=1, DB有3条 | 返回3个roleId | 正常路径 | P0 | SELECT roleId |
|
|
|
| TC-0418 | FindRoleIdsByUserId | 无绑定 | userId=999 | 空slice | 边界 | P1 | |
|
|
|
| TC-0419 | FindByUserId | 正常查询 | userId=1 | 返回完整SysUserRole列表 | 正常路径 | P0 | SELECT * |
|
|
|
@@ -745,7 +745,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 8.9 SysProductMemberModel
|
|
|
|
|
|
| TC编号 | 方法 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0426 | FindListByProductCode | 正常分页 | productCode="p1" | list+total | 正常路径 | P0 | WHERE productCode=? |
|
|
|
| TC-0427 | FindListByProductCode | 空结果 | 无匹配 | total=0 | 边界 | P1 | |
|
|
|
| TC-0428 | FindByUserId | 正常查询 | userId=1 | 返回用户所有产品成员身份 | 正常路径 | P0 | WHERE userId=? |
|
|
|
@@ -760,7 +760,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 9.1 RequireSuperAdmin
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0435 | 超管通过 | ctx含SuperAdmin UserDetails | nil (允许) | 正常路径 | P0 | caller.IsSuperAdmin |
|
|
|
| TC-0436 | 非超管拒绝 | ctx含ADMIN UserDetails | 403 "仅超级管理员" | 异常路径 | P0 | !IsSuperAdmin |
|
|
|
| TC-0437 | MEMBER拒绝 | ctx含MEMBER UserDetails | 403 "仅超级管理员" | 异常路径 | P0 | |
|
|
|
@@ -769,7 +769,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 9.2 RequireProductAdmin
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0439 | 超管通过 | ctx含SuperAdmin | nil | 正常路径 | P0 | IsSuperAdmin |
|
|
|
| TC-0440 | ADMIN通过 | ctx含ADMIN | nil | 正常路径 | P0 | MemberType==ADMIN |
|
|
|
| TC-0441 | DEVELOPER拒绝 | ctx含DEVELOPER | 403 | 异常路径 | P0 | 非Admin |
|
|
|
@@ -779,7 +779,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 9.3 CheckMemberTypeAssignment
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0444 | 超管可分配任何类型 | caller=SuperAdmin, assigned=ADMIN | nil | 正常路径 | P0 | IsSuperAdmin豁免 |
|
|
|
| TC-0445 | ADMIN分配DEVELOPER | caller=ADMIN, assigned=DEVELOPER | nil | 正常路径 | P0 | callerPri(1) < assignPri(2) |
|
|
|
| TC-0446 | ADMIN分配ADMIN(同级拒绝) | caller=ADMIN, assigned=ADMIN | 403 | 深度业务 | P0 | callerPri >= assignPri |
|
|
|
@@ -790,7 +790,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 9.4 CheckManageAccess
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0450 | 超管可管理任何人 | caller=SuperAdmin | nil | 正常路径 | P0 | IsSuperAdmin豁免 |
|
|
|
| TC-0451 | 操作自己 | caller.UserId==targetUserId | nil | 正常路径 | P0 | self豁免 |
|
|
|
| TC-0452 | ADMIN跳过部门检查 | caller=ADMIN | nil (直接比级别) | 深度业务 | P0 | checkDeptHierarchy ADMIN豁免 |
|
|
|
@@ -802,7 +802,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 9.5 memberTypePriority
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0457 | 各类型优先级正确 | 全部4种+未知 | SA=0,A=1,D=2,M=3,unknown=MaxInt32 | 白盒 | P0 | switch分支 |
|
|
|
|
|
|
## 十、UserDetailsLoader (loaders/userDetailsLoader.go)
|
|
|
@@ -810,7 +810,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 10.1 Load / 缓存
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0458 | DB加载(缓存miss) | 有效userId+productCode | 返回完整UserDetails | 正常路径 | P0 | loadFromDB全链路 |
|
|
|
| TC-0459 | 缓存命中 | 第二次Load同key | 从Redis返回,不查DB | 正常路径 | P0 | GetCtx hit |
|
|
|
| TC-0460 | 用户不存在 | userId=999999 | 返回零值UserDetails(Status=0) | 边界 | P0 | loadUser失败 |
|
|
|
@@ -819,7 +819,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 10.2 缓存失效
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0462 | Del删除指定缓存 | Del(uid, pc) | 缓存被删除,下次Load查DB | 正常路径 | P0 | DelCtx |
|
|
|
| TC-0463 | Clean清除用户所有产品缓存 | Clean(uid) | 该用户所有key被删 | 正常路径 | P0 | KEYS pattern |
|
|
|
| TC-0464 | CleanByProduct清除产品所有用户 | CleanByProduct(pc) | 该产品所有key被删 | 正常路径 | P0 | KEYS pattern |
|
|
|
@@ -829,7 +829,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 10.3 loadPerms权限计算
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0467 | 超管全量权限 | IsSuperAdmin=true | Perms=全部启用的权限码 | 正常路径 | P0 | 超管分支 |
|
|
|
| TC-0468 | ADMIN全量权限 | MemberType=ADMIN | Perms=全量 | 正常路径 | P0 | ADMIN分支 |
|
|
|
| TC-0469 | DEVELOPER全量权限 | MemberType=DEVELOPER | Perms=全量 | 正常路径 | P0 | DEVELOPER分支 |
|
|
|
@@ -839,7 +839,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 10.4 loadRoles + MinPermsLevel
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0472 | 多角色取最小permsLevel | 用户有level=10和level=5的角色 | MinPermsLevel=5 | 正常路径 | P0 | min计算 |
|
|
|
| TC-0473 | 无角色 | 用户无角色 | MinPermsLevel=MaxInt64 | 边界 | P0 | 默认值 |
|
|
|
| TC-0474 | 角色跨产品过滤 | 角色在不同产品 | 仅加载当前产品角色 | 深度业务 | P0 | productCode过滤 |
|
|
|
@@ -848,14 +848,14 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 10.5 loadMembership
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0476 | 超管自动设置SUPER_ADMIN | IsSuperAdmin=true | MemberType=SUPER_ADMIN, 不查DB | 正常路径 | P0 | 早期return |
|
|
|
| TC-0477 | 非成员MemberType为空 | 用户非该产品成员 | MemberType="" | 边界 | P0 | ErrNotFound |
|
|
|
|
|
|
## 十一、中间件 — 冻结账号拦截
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0478 | 冻结用户被403 | 有效token但Status=2 | code=403 "账号已被冻结" | 安全 | P0 | ud.Status!=Enabled |
|
|
|
| TC-0479 | 用户不存在(Status=0) | token中userId不存在 | code=403 "账号已被冻结" | 安全 | P0 | loadUser失败→Status=0 |
|
|
|
| TC-0480 | UserDetails注入context | 正常请求 | GetUserDetails(ctx)非nil | 正常路径 | P0 | WithUserDetails |
|
|
|
@@ -863,7 +863,7 @@ MySQL (InnoDB) + Redis Cache
|
|
|
## 十二、Logic层 — 访问控制负面测试
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0481 | createDept非超管拒绝 | ctx=ADMIN | 403 "仅超级管理员" | 安全 | P0 | RequireSuperAdmin |
|
|
|
| TC-0482 | updateDept非超管拒绝 | ctx=ADMIN | 403 "仅超级管理员" | 安全 | P0 | RequireSuperAdmin |
|
|
|
| TC-0483 | deleteDept非超管拒绝 | ctx=ADMIN | 403 "仅超级管理员" | 安全 | P0 | RequireSuperAdmin |
|
|
|
@@ -881,28 +881,28 @@ MySQL (InnoDB) + Redis Cache
|
|
|
### 13.1 SysRoleModel
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0492 | FindMinPermsLevelByUserIdAndProductCode正常 | 有角色用户 | 返回最小permsLevel | 正常路径 | P0 | MIN聚合 |
|
|
|
| TC-0493 | FindMinPermsLevelByUserIdAndProductCode无角色 | 无角色用户 | error(ErrNotFound) | 边界 | P0 | IFNULL返回-1→level<0→ErrNotFound |
|
|
|
|
|
|
### 13.2 SysPermModel
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0494 | FindAllCodesByProductCode正常 | 有权限产品 | 返回code列表(仅status=1) | 正常路径 | P0 | WHERE status=1 |
|
|
|
| TC-0495 | FindAllCodesByProductCode无权限 | 无权限产品 | 空slice | 边界 | P1 | |
|
|
|
|
|
|
### 13.3 SysUserModel
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0496 | FindIdsByDeptId正常 | 有用户的部门 | 返回id列表 | 正常路径 | P0 | WHERE deptId=? |
|
|
|
| TC-0497 | FindIdsByDeptId空部门 | 无用户部门 | 空slice | 边界 | P1 | |
|
|
|
|
|
|
### 13.4 SysUserRoleModel
|
|
|
|
|
|
| TC编号 | 测试场景 | 输入 | 预期结果 | 类型 | 优先级 | 覆盖说明 |
|
|
|
-|:---|:---|:---|:---|:---|:---|:---|
|
|
|
+| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
|
| TC-0498 | FindUserIdsByRoleId正常 | 有绑定的角色 | 返回userId列表 | 正常路径 | P0 | WHERE roleId=? |
|
|
|
| TC-0499 | FindUserIdsByRoleId无绑定 | 无绑定角色 | 空slice | 边界 | P1 | |
|
|
|
|