# 测试脚本说明

本目录包含 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. 资源权限交叉测试
```

## 推荐运行方式

### 方式一：一键清理并运行 (强烈推荐)

最稳健的测试方式，自动处理数据库清理、服务重启和环境变量配置：

```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, 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)

## 测试环境变量参考

| 变量 | 默认值 | 说明 |
| :--- | :--- | :--- |
| `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
```
