# Testing (ez-api)

本仓库的单元测试采用 Go 标准组织方式：单元测试与源码同目录（`*_test.go`），默认通过 `go test ./...` 运行。

此外，本仓库仍保留 `./test` 下的 docker-compose 集成测试（带 `integration` tag），用于端到端验证。

## 运行

### 单元测试

```bash
go test ./...
```

### 集成测试（docker compose）

```bash
./test/integration.sh
```

## 说明

- 单元测试不依赖 Docker，不访问公网。
- 对 Redis 相关逻辑优先使用 `miniredis`（纯内存、接近真实命令行为）。
- 对 DB 相关逻辑优先使用 sqlite in-memory（只用于测试），避免引入外部依赖。

## 分阶段计划（长期）

### 阶段 1（已落地）

- provider 归一化：Vertex 默认 `google_location=global` 的回归保护
- SyncService：Redis snapshot 写入与 routing key 生成
- request_id：Gin middleware 透传/生成

### 阶段 2（已落地一部分）

- Master/Key：CreateMaster/ValidateMasterKey/IssueChildKey 的关键分支（含 child key 上限）

待补齐：

- Master/Key：epoch/禁用等更多状态分支
- LogWriter：批处理/刷盘边界（可用 fake clock 或缩短 flush interval）

### 阶段 3（已落地一部分：契约测试）

- 与 DP 的 provider snapshot schema 契约：`github.com/ez-api/foundation/contract/testdata/provider_snapshot.json` + SyncProvider 输出回归
  - golden 来自 `github.com/ez-api/foundation/contract`（go:embed），避免 DP/CP 两边复制文件

待扩展：

- model snapshot 契约（能力字段、max_output_tokens 等）
- token/master snapshot 契约（如果后续引入更多字段）
