You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
OneAuth/scripts/tests/README.md

165 lines
5.9 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 测试脚本说明
本目录包含 VBase 的集成测试脚本,使用 bash + curl 测试 API 功能。
## ⚠️ 重要注意事项 (必读)
1. **环境重置与管理员权限**
- 系统设计为:**数据库重置后第一个注册的用户自动获得 Admin (超级管理员) 权限**。
- 后续注册的用户默认为普通 User 权限。
- 很多权限测试(如 `02_resource_perm.sh`)依赖于这个机制。如果数据库未清理,新注册的用户可能只是普通用户,导致 Admin 权限测试失败。
- **强烈建议使用 `clean_run.sh` 脚本运行测试**。该脚本会自动清理数据库 (`/tmp/vb.sqlite`) 并重启服务,确保环境一致性。
2. **BASE_URL 配置**
- 测试脚本依赖 `BASE_URL` 环境变量连接服务。
- 如果你的系统环境变量中设置了其他的 `BASE_URL`(例如生产环境地址),直接运行脚本可能会导致连接错误或误操作。
- `clean_run.sh` 会强制设置 `BASE_URL=http://localhost:4000`,确保测试在本地隔离环境中运行。
## 目录结构
```text
scripts/tests/
├── README.md # 本说明文件
├── lib.sh # 公共函数库
├── clean_run.sh # [推荐] 一键清理环境、重启服务并运行所有测试
├── run_all.sh # 运行所有测试脚本 (不负责清理环境)
├── 00_none_auth.sh # 1. 未登录访问测试
├── 01_setup_users.sh # 2. 用户初始化与基础认证
├── 02_resource_perm.sh # 3. 资源权限交叉测试
├── 03_org_permission.sh # 4. 组织权限测试
└── 04_org_load_middleware.sh # 5. LoadOrg 中间件测试
```
## 推荐运行方式
### 方式一:一键清理并运行 (强烈推荐)
最稳健的测试方式,自动处理数据库清理、服务重启和环境变量配置:
```bash
# 在项目根目录下或 scripts/tests 目录下运行
bash scripts/tests/clean_run.sh
```
### 方式二:手动运行
如果你需要手动运行单个脚本进行调试,请确保:
1. 服务已启动 (`go run cli/main.go ...`)。
2. `BASE_URL` 指向正确的本地服务。
3. 如果测试依赖 Admin 权限,请确保你使用的 Token 属于 Admin 用户。
```bash
# 1. 设置环境变量
export BASE_URL=http://localhost:4000
export TEST_TIMESTAMP=$(date +%s) # 生成统一时间戳,避免数据冲突
# 2. 运行特定测试
bash scripts/tests/02_resource_perm.sh
```
## 测试脚本详情
### 00_none_auth.sh
**测试内容**:未登录状态下访问受保护接口
- 验证 API 是否正确拦截未携带 Token 的请求
- 覆盖 Users, Orgs, Roles, Settings 等核心模块
### 01_setup_users.sh
**测试内容**:用户初始化与基础功能验证
- 注册三个核心账户Admin, User1, User2
- 验证注册与登录流程
- 验证基础功能修改个人信息、修改密码、Token 刷新、用户登出
### 02_resource_perm.sh
**测试内容**:跨用户资源访问权限验证
- 场景 1: Admin 修改任意用户信息 (允许)
- 场景 2: User1 修改自己信息 (允许)
- 场景 3: User1 修改 User2 信息 (禁止 403)
- 场景 4: User1 修改 Admin 信息 (禁止 403)
- 场景 5: User2 修改 User1 信息 (禁止 403)
### 03_org_permission.sh
**测试内容**:组织权限控制
- admin 创建组织
- user 不能修改他人创建的组织
- admin 邀请 user 加入组织
- 普通成员不能修改组织信息
- 只有 admin/owner 可以修改组织
### 04_org_load_middleware.sh
**测试内容**LoadOrg 中间件验证
- 验证 `X-Org-ID` 头部的处理
- 验证用户是否为组织成员的检查逻辑
- 验证非成员访问组织资源被拒绝 (403)
- 验证成员访问组织资源被允许 (200)
## 测试环境变量参考
| 变量 | 默认值 | 说明 |
| :--- | :--- | :--- |
| `BASE_URL` | `http://localhost:4000` | 测试服务的 API 地址 |
| `TEST_TIMESTAMP` | `date +%s` | 测试运行的时间戳,用于生成唯一的用户名/邮箱 |
## 常见问题与踩坑记录 (Troubleshooting)
### 1. 权限测试失败Admin 用户无法修改他人信息
**现象**
运行 `02_resource_perm.sh` 时,提示 `Admin 修改 User1 失败` 或返回 403。
**原因**
VBase 的逻辑是**系统初始化的第一个用户自动获得 Admin 权限**。如果你在测试前没有清理数据库,数据库中可能已经存在其他用户,导致你测试脚本中注册的 "Admin" 用户实际上只获得了普通 User 权限。
**解决**
使用 `clean_run.sh` 运行测试,或者手动删除数据库文件 `/tmp/vb.sqlite` 后重启服务。
### 2. 连接被拒绝 (Connection refused) 或 404
**现象**
测试脚本提示无法连接到服务器,或者返回非预期的 404。
**原因**
- 服务未启动。
- `BASE_URL` 环境变量配置错误(例如系统环境中设置了生产环境地址)。
**解决**
- 确保服务正在运行且监听端口与 `BASE_URL` 一致(默认 4000
- 强制指定 `BASE_URL``export BASE_URL=http://localhost:4000`。
### 3. 端口被占用 (Address already in use)
**现象**
运行 `go run cli/main.go ...` 时提示端口 4000 被占用。
**原因**
之前的测试服务没有正常关闭,或者有其他服务占用了该端口。
**解决**
查找并关闭占用端口的进程:
```bash
lsof -i :4000
kill -9 <PID>
```
`clean_run.sh` 脚本已内置了此清理逻辑。
### 4. 数据不一致 / 用户不存在
**现象**
手动运行多个脚本时,提示用户不存在或登录失败。
**原因**
测试脚本使用 `TEST_TIMESTAMP` 生成唯一的用户名(如 `user1_1712345678`)。如果你分别运行两个脚本且没有固定 `TEST_TIMESTAMP`,第二个脚本会生成新的时间戳,导致无法找到第一个脚本创建的用户。
**解决**
在手动运行一系列脚本前,先导出时间戳:
```bash
export TEST_TIMESTAMP=$(date +%s)
bash 01_setup_users.sh
bash 02_resource_perm.sh
```