const { launchMiniProgram, closeMiniProgram, sleep } = require('../helpers/automator'); const LoginPage = require('../pages/LoginPage'); const HomePage = require('../pages/HomePage'); const CourseListPage = require('../pages/CourseListPage'); const CourseDetailPage = require('../pages/CourseDetailPage'); let miniProgram; let loginPage; let homePage; let courseListPage; let courseDetailPage; describe('P2 - 教练课程控制测试(开课/结课)', () => { beforeAll(async () => { miniProgram = await launchMiniProgram(); loginPage = new LoginPage(miniProgram); homePage = new HomePage(miniProgram); courseListPage = new CourseListPage(miniProgram); courseDetailPage = new CourseDetailPage(miniProgram); // 先完成登录 await loginPage.login('coach_test1', 'Test@123'); await loginPage.waitForLoginSuccess(20000); await homePage.waitForLoad(); }, 120000); afterAll(async () => { await closeMiniProgram(); }, 30000); test('导航到课程列表并筛选待开课课程', async () => { await homePage.navigateToCourseList(); await courseListPage.waitForLoad(); await courseListPage.filterByStatus('pending'); await sleep(1000); }, 30000); test('进入待开课课程详情 → 验证开课按钮存在', async () => { const count = await courseListPage.getCourseCount(); if (count === 0) { console.warn('[WARN] 没有待开课课程,跳过开课/结课测试'); return; } // 点击第一个待开课课程 await courseListPage.clickCourse(0); await courseDetailPage.waitForLoad(); const actionBtn = await courseDetailPage.getActionButtonStatus(); expect(actionBtn).not.toBeNull(); if (actionBtn.type === 'start') { // 如果按钮存在且为开课按钮 expect(actionBtn.text).toMatch(/开课/i); } // 注:如果 disabled,说明未到开课时间,跳过实操 }, 30000); test('点击开课按钮(如可用)→ 验证状态变化', async () => { const actionBtn = await courseDetailPage.getActionButtonStatus(); if (!actionBtn || actionBtn.type !== 'start') { console.warn('[WARN] 没有可用的开课按钮,跳过开课操作测试'); return; } if (actionBtn.disabled) { console.warn('[WARN] 开课按钮被禁用(尚未到开课时间),跳过开课操作'); return; } // 执行开课 await courseDetailPage.startCourse(); await sleep(2000); // 刷新页面查看状态是否变化 const page = await miniProgram.currentPage(); const statusEl = await page.$('.cover-status text'); if (statusEl) { const statusText = (await statusEl.text()).trim(); expect(statusText).toMatch(/进行中|教练迟到/); } }, 60000); test('进入进行中课程 → 验证结课按钮存在', async () => { // 回到课程列表页 await miniProgram.navigateBack(); await sleep(1500); const page = await miniProgram.currentPage(); // 如果在课程列表页 if (page.path.includes('pages/course-list')) { await courseListPage.filterByStatus('in_progress'); await sleep(1500); const count = await courseListPage.getCourseCount(); if (count === 0) { console.warn('[WARN] 没有进行中的课程,跳过结课测试'); return; } await courseListPage.clickCourse(0); await courseDetailPage.waitForLoad(); const actionBtn = await courseDetailPage.getActionButtonStatus(); expect(actionBtn).not.toBeNull(); if (actionBtn) { // 可以是 end 或 disabled(不满足结课条件) expect(['end', 'disabled']).toContain(actionBtn.type); } } }, 40000); test('生成签到二维码(模拟)→ 返回 courseId', async () => { const page = await miniProgram.currentPage(); if (!page.path.includes('pages/course-detail')) { console.warn('[WARN] 不在课程详情页,跳过二维码测试'); return; } const qrData = await courseDetailPage.generateQRCode(); expect(qrData).toBeDefined(); // 验证返回的数据结构 expect(qrData).toHaveProperty('courseId'); expect(qrData).toHaveProperty('timestamp'); }, 15000); });