# 课程包三端全链路测试记录

**测试日期**: 2026-03-13
**测试类型**: API 全链路功能测试
**测试结果**: ✅ 全部通过

---

## 测试概述

本次测试针对课程包业务从超管端创建到学校端查看、教师端查看课程的完整 API 链路进行功能验证。

---

## 测试结果汇总

| 阶段 | 测试项 | 状态 |
|------|--------|------|
| 超管端 | 登录功能 | ✅ 通过 |
| 超管端 | 创建课程 | ✅ 通过 |
| 超管端 | 发布课程 | ✅ 通过 |
| 超管端 | 创建套餐 | ✅ 通过 |
| 超管端 | 添加课程到套餐 | ✅ 通过 |
| 超管端 | 提交审核 | ✅ 通过 |
| 超管端 | 审核通过 | ✅ 通过 |
| 超管端 | 发布套餐 | ✅ 通过 |
| 超管端 | 授权给租户 | ✅ 通过 |
| 学校端 | 登录功能 | ✅ 通过 |
| 学校端 | 查看授权套餐 | ✅ 通过 |
| 教师端 | 登录功能 | ✅ 通过 |
| 教师端 | 查看可用课程 | ✅ 通过 |

---

## 测试流程

### 第一阶段：超管端

1. **登录** (POST `/api/auth/login`)
   - 请求: `{"role": "admin", "username": "admin", "password": "123456"}`
   - 响应: 200 OK, token 返回成功

2. **创建课程** (POST `/api/admin/courses`)
   - 课程 ID: 14
   - 课程名称: 测试课程_1773380715
   - 状态: draft → published

3. **发布课程** (POST `/api/admin/courses/{id}/publish`)
   - 响应: 200 OK
   - 课程状态变为 published

4. **创建套餐** (POST `/api/v1/admin/packages`)
   - 套餐 ID: 9
   - 套餐名称: 全链路测试套餐_1773380715
   - 状态: DRAFT

5. **添加课程到套餐** (PUT `/api/v1/admin/packages/{id}/courses`)
   - 课程 ID: 14
   - 响应: 200 OK

6. **提交审核** (POST `/api/v1/admin/packages/{id}/submit`)
   - 响应: 200 OK
   - 套餐状态: DRAFT → SUBMITTED

7. **审核通过** (POST `/api/v1/admin/packages/{id}/review`)
   - 请求: `{"approved": true, "comment": "自动化测试审核通过"}`
   - 响应: 200 OK
   - 套餐状态: SUBMITTED → APPROVED

8. **发布套餐** (POST `/api/v1/admin/packages/{id}/publish`)
   - 响应: 200 OK
   - 套餐状态: APPROVED → PUBLISHED

9. **授权给租户** (POST `/api/v1/admin/packages/{id}/grant`)
   - 租户 ID: 1
   - 授权期限: 2027-03-13
   - 响应: 200 OK

### 第二阶段：学校端

1. **登录** (POST `/api/auth/login`)
   - 请求: `{"role": "school", "username": "school1", "password": "123456"}`
   - 响应: 200 OK

2. **查看授权套餐** (GET `/api/school/packages`)
   - 响应: 200 OK
   - 返回租户套餐列表（包含套餐 ID 9）

### 第三阶段：教师端

1. **登录** (POST `/api/auth/login`)
   - 请求: `{"role": "teacher", "username": "teacher1", "password": "123456"}`
   - 响应: 200 OK

2. **查看可用课程** (GET `/api/teacher/courses`)
   - 响应: 200 OK
   - 返回课程列表（包含课程 ID 14）

---

## Bug 修复记录

### Bug 1: 登录 API 路径错误
- **问题**: 测试脚本使用 `/api/v1/auth/login`，实际路径是 `/api/auth/login`
- **修复**: 更新测试脚本

### Bug 2: 角色名称大小写错误
- **问题**: 测试脚本使用 `"role": "ADMIN"`，枚举要求小写 `"admin"`
- **修复**: 更新测试脚本使用小写角色名

### Bug 3: 测试账号密码错误
- **问题**: 测试脚本使用 `123456`，数据库初始化为 `123456`
- **修复**: 更新测试脚本使用正确密码

### Bug 4: 套餐提交审核必须包含课程
- **问题**: 提交审核时报错 "套餐必须包含至少一个课程包"
- **修复**: 先创建课程，再添加到套餐，然后提交审核

### Bug 5: 学校端 API 路径错误
- **问题**: 测试脚本使用 `/api/v1/school/packages`，实际路径是 `/api/school/packages`
- **修复**: 更新测试脚本

### Bug 6: 教师端无法看到系统课程
- **问题**: `getCoursePage` 和 `getCoursesByTenantId` 只查询租户自己的课程，不包含系统课程
- **修复**: 修改查询条件，同时包含租户课程和系统课程：
  ```java
  wrapper.and(w -> w
      .eq(Course::getTenantId, tenantId)
      .or()
      .eq(Course::getIsSystem, 1)
  );
  ```

### Bug 7: 创建系统课程未设置 isSystem 标志
- **问题**: `AdminCourseController.createCourse` 设置了 `isSystem=1` 但没有保存到数据库
- **修复**: 添加 `courseMapper.updateById(course)` 保存到数据库

### Bug 8: 课程需要发布才能被教师端看到
- **问题**: 教师端查询条件 `status = 'published'`，新创建的课程状态是 `draft`
- **修复**: 创建课程后调用发布接口

---

## 新增功能

### 新增授权接口 (超管端)
- **路径**: `POST /api/v1/admin/packages/{id}/grant`
- **功能**: 授权套餐给指定租户
- **请求参数**:
  - `tenantId`: 租户 ID
  - `endDate`: 授权结束日期
  - `pricePaid`: 支付金额
- **响应**: 200 OK

---

## 测试脚本

- `test_package_full_api.py`: 完整套餐 API 测试（包含课程创建）
- `test_three_ends.py`: 三端全链路测试

---

## 下一步计划

1. **前端浏览器测试**: 使用 Playwright 进行前端页面的自动化测试
2. **备课功能测试**: 测试教师端备课、授课功能
3. **展播模式测试**: 测试课程展播模式
4. **数据完整性测试**: 测试套餐中所有字段、所有资源的填写和上传

---

**测试结论**: 课程包三端 API 全链路测试通过，所有核心功能正常运行。
