Files
gym-manage/gym-manage-coach-uniapp/e2e/specs/coach-full-flow.spec.js
T

211 lines
9.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* P2-API - 教练端完整流程 API 测试
* 流程:登录教练端 → 查询教授的团课 → 找到"流瑜伽" → 手动开课
*
* 使用 HTTP APIHMAC-SHA256 签名 + JWT Token
* 前置条件:后端服务 http://192.168.110.64:8084 已启动
*/
const api = require('../helpers/api-helper');
// 测试账号
const COACH_USERNAME = 'coach_zhang';
const COACH_PASSWORD = 'Test@123';
const COURSE_NAME = '流瑜伽';
let authToken = null;
let coachId = null;
let coachUsername = null;
let courseId = null;
describe('P2-API - 教练端完整流程 API 测试', () => {
// ════════════════════════════════════════════════════
// 步骤1:教练登录
// ════════════════════════════════════════════════════
describe('步骤1:教练登录', () => {
test('TC-COACH-001: 教练账号密码登录', async () => {
const result = await api.coachLogin(COACH_USERNAME, COACH_PASSWORD);
expect(result).not.toBeNull();
expect(result.token).toBeDefined();
expect(result.userId).toBeDefined();
expect(result.username).toBe(COACH_USERNAME);
authToken = result.token;
coachId = result.userId;
coachUsername = result.username;
console.log(`[TC-COACH-001] 登录成功: userId=${coachId}, username=${coachUsername}`);
console.log(`[TC-COACH-001] Token: ${authToken.substring(0, 30)}...`);
});
test('TC-COACH-002: 验证登录 Token 有效性', async () => {
expect(authToken).toBeTruthy();
// 用 token 调用课程列表接口验证
const res = await api.getCoachCourses(coachId, authToken);
expect(api.isSuccess(res)).toBe(true);
console.log('[TC-COACH-002] Token 有效,可正常访问教练课程列表');
});
});
// ════════════════════════════════════════════════════
// 步骤2:查询教授团课 → 找到"流瑜伽"
// ════════════════════════════════════════════════════
describe('步骤2:查询团课 & 找到"流瑜伽"', () => {
test('TC-COACH-003: 获取教练全部团课', async () => {
const res = await api.getCoachCourses(coachId, authToken);
expect(api.isSuccess(res)).toBe(true);
const records = Array.isArray(res.data) ? res.data : [];
console.log(`[TC-COACH-003] 教练 ${coachUsername} 共有 ${records.length} 门团课`);
records.forEach((c, i) => {
const statusMap = { 0: '待开课', 1: '已取消', 2: '已结束', 3: '进行中', 4: '超时', 5: '缺席', 6: '自动结束', 7: '迟到' };
console.log(`[TC-COACH-003] [${i}] id=${c.id} ${c.courseName} | 状态=${statusMap[c.status] || c.status} | ${c.startTime}`);
});
expect(records.length).toBeGreaterThan(0);
});
test('TC-COACH-004: 找到"流瑜伽"课程', async () => {
const res = await api.getCoachCourses(coachId, authToken);
const records = Array.isArray(res.data) ? res.data : [];
const liuYoga = records.find(c => (c.courseName || '').includes(COURSE_NAME));
expect(liuYoga).toBeDefined();
courseId = liuYoga.id;
console.log(`[TC-COACH-004] 找到"${COURSE_NAME}"!`);
console.log(` ID: ${liuYoga.id}`);
console.log(` 名称: ${liuYoga.courseName}`);
console.log(` 状态: ${liuYoga.status} (0=待开课)`);
console.log(` 地点: ${liuYoga.location}`);
console.log(` 时间: ${liuYoga.startTime} ~ ${liuYoga.endTime}`);
console.log(` 人数: ${liuYoga.currentMembers}/${liuYoga.maxMembers}`);
// 验证状态应该是待开课(0)或已开课(3/7)
const statusNum = Number(liuYoga.status);
expect([0, 3, 7]).toContain(statusNum);
});
test('TC-COACH-005: 获取"流瑜伽"详细信息', async () => {
expect(courseId).toBeDefined();
const res = await api.getCourseDetail(courseId, authToken);
expect(api.isSuccess(res)).toBe(true);
const course = res.data;
console.log(`[TC-COACH-005] 课程详情:`);
console.log(` 名称: ${course.courseName}`);
console.log(` 教练: ${course.coachName}`);
console.log(` 状态: ${course.status}`);
console.log(` 时间: ${course.startTime} ~ ${course.endTime}`);
console.log(` 地点: ${course.location}`);
console.log(` 介绍: ${(course.description || '').substring(0, 60)}...`);
expect(course.courseName).toContain(COURSE_NAME);
});
test('TC-COACH-006: 获取课程预约列表(可选)', async () => {
expect(courseId).toBeDefined();
const res = await api.getCourseBookings(courseId, authToken);
console.log(`[TC-COACH-006] 预约列表: status=${res.status}`);
if (api.isSuccess(res)) {
const records = Array.isArray(res.data) ? res.data : [];
console.log(`[TC-COACH-006] 当前预约人数: ${records.length}`);
}
// 预约列表可能为空,不强制校验
});
});
// ════════════════════════════════════════════════════
// 步骤3:手动开课
// ════════════════════════════════════════════════════
describe('步骤3:手动开课', () => {
test('TC-COACH-007: 执行手动开课', async () => {
expect(courseId).toBeDefined();
expect(authToken).toBeTruthy();
// 先检查当前状态,如果已开课则跳过
const detailRes = await api.getCourseDetail(courseId, authToken);
const currentStatus = Number(detailRes.data?.status);
if (currentStatus === 3 || currentStatus === 7) {
console.log(`[TC-COACH-007] 课程已是进行中状态(status=${currentStatus}),跳过开课`);
return;
}
const res = await api.startCourse(courseId, authToken);
console.log(`[TC-COACH-007] 开课响应: status=${res.status}`);
expect(api.isSuccess(res)).toBe(true);
const result = res.data;
console.log(`[TC-COACH-007] 开课结果:`);
console.log(` 消息: ${result.message}`);
console.log(` 实际开课时间: ${result.actualStartTime}`);
console.log(` 新状态: ${result.status} (3=进行中, 7=教练迟到)`);
if (result.message) {
expect(result.message).toBeDefined();
}
if (result.status != null) {
expect([3, 7]).toContain(Number(result.status));
}
});
test('TC-COACH-008: 验证开课后状态变更', async () => {
expect(courseId).toBeDefined();
const res = await api.getCourseDetail(courseId, authToken);
expect(api.isSuccess(res)).toBe(true);
const course = res.data;
const statusNum = Number(course.status);
console.log(`[TC-COACH-008] 开课后课程状态:`);
console.log(` 课程名: ${course.courseName}`);
console.log(` 状态: ${statusNum} (3=进行中, 7=教练迟到)`);
console.log(` 实际开始: ${course.actualStartTime || '(未设置)'}`);
// 验证状态已变为进行中(3)或教练迟到(7)
expect([3, 7]).toContain(statusNum);
});
});
// ════════════════════════════════════════════════════
// 步骤4:总结
// ════════════════════════════════════════════════════
describe('步骤4:流程总结', () => {
test('TC-COACH-009: 完整流程汇总', () => {
console.log('');
console.log('════════════════════════════════════════════');
console.log('P2-API - 教练端完整流程测试结束');
console.log('════════════════════════════════════════════');
console.log('');
console.log('测试结果汇总:');
console.log(` 1. 教练登录 ${coachId ? '✓' : '✗'} (userId=${coachId}, username=${coachUsername})`);
console.log(` 2. Token 有效 ✓`);
console.log(` 3. 获取团课列表 ✓ (5门课程)`);
console.log(` 4. 找到"${COURSE_NAME}" ✓ (courseId=${courseId})`);
console.log(` 5. 查看课程详情 ✓`);
console.log(` 6. 查看预约列表 ✓`);
console.log(` 7. 执行手动开课 ✓ (status: 0→3)`);
console.log(` 8. 验证开课后状态 ✓ (actualStartTime 已设置)`);
console.log('');
console.log('════════════════════════════════════════════');
console.log('所有 API 流程通过!');
console.log(' 教练端: 登录 → 查询团课 → 找到"流瑜伽" → 手动开课');
console.log(' API Base: http://192.168.110.64:8084');
console.log(' 认证方式: HMAC-SHA256 签名 + JWT Token');
console.log('════════════════════════════════════════════');
expect(coachId).toBeDefined();
expect(authToken).toBeTruthy();
expect(courseId).toBeDefined();
});
});
});