const { launchMiniProgram } = require('../helpers/automator'); const { HomePage } = require('../pages/HomePage'); const { MyCoursesPage } = require('../pages/MyCoursesPage'); const { SearchPage } = require('../pages/SearchPage'); // 测试参数:预约目标课程 const BOOKING_COURSE = { name: '流瑜伽', id: 2 }; const QR_CONTENT = JSON.stringify({ courseId: BOOKING_COURSE.id }); describe('团课预约用户旅程', () => { let miniProgram; let homePage; beforeAll(async () => { try { miniProgram = await launchMiniProgram(); homePage = new HomePage(miniProgram); } catch (error) { console.warn('小程序连接失败:', error.message); } }); afterAll(async () => { if (miniProgram) { try { await miniProgram.restoreWxMethod('scanCode'); } catch (_) {} try { await miniProgram.switchTab('/pages/index/index'); } catch (_) {} } }); test('首页课程元素展示', async () => { if (!miniProgram) { console.log('跳过:小程序环境未就绪'); return; } try { await miniProgram.switchTab('/pages/index/index'); } catch (_) {} await new Promise(resolve => setTimeout(resolve, 1000)); await homePage.waitForReady(); const page = await miniProgram.currentPage(); console.log('当前页:', page.path); const allElements = await page.$$('[class*="course"]'); console.log('首页课程相关元素数量:', allElements.length); expect(page.path).toBeTruthy(); }); test('搜索页搜索功能', async () => { if (!miniProgram) { console.log('跳过:小程序环境未就绪'); return; } try { await miniProgram.switchTab('/pages/index/index'); } catch (_) {} await new Promise(resolve => setTimeout(resolve, 1000)); await miniProgram.switchTab('/pages/search/search'); await new Promise(resolve => setTimeout(resolve, 1000)); const page = await miniProgram.currentPage(); console.log('搜索页路径:', page.path); const searchPage = new SearchPage(miniProgram); await searchPage.search('瑜伽'); await new Promise(resolve => setTimeout(resolve, 1000)); const data = await searchPage.getPageData(); console.log('搜索页数据:', JSON.stringify(data).substring(0, 200)); expect(data).toBeDefined(); expect(data.searchKeyword).toBe('瑜伽'); }); // 【核心】预约团课 + 扫码签到完整流程 test(`预约「${BOOKING_COURSE.name}」并扫码签到`, async () => { if (!miniProgram) { console.log('跳过:小程序环境未就绪'); return; } // ── 步骤 1: 直接进入「我的课程」页(核心测试起点)── console.log(`\n━━━ 步骤 1/3: 进入「我的课程」页`); try { await miniProgram.switchTab('/pages/my-courses/my-courses'); } catch (_) {} await new Promise(resolve => setTimeout(resolve, 2000)); let page = await miniProgram.currentPage(); console.log('当前页面:', page.path); expect(page.path).toContain('my-courses'); // ── 步骤 2: 注入模拟预约数据 ── console.log(`\n━━━ 步骤 2/3: 注入「${BOOKING_COURSE.name}」预约数据`); await miniProgram.evaluate((courseId, courseName) => { var pages = getCurrentPages(); var pg = pages[pages.length - 1]; if (pg && pg.setData) { pg.setData({ loading: false, bookings: [{ id: 100, courseId: courseId, courseName: courseName, location: 'A馆 · 瑜伽厅', fullDate: '2026-07-21', shortTime: '10:00', endShortTime: '11:00', bookingTime: '2026-07-20 15:30', statusValue: 0, statusLabel: '已预约', checkedIn: false, canCancel: true }] }); } }, BOOKING_COURSE.id, BOOKING_COURSE.name); await new Promise(resolve => setTimeout(resolve, 1000)); const myCoursesPage = new MyCoursesPage(miniProgram); const myData = await myCoursesPage.getPageData(); console.log('我的课程数据:', JSON.stringify(myData).substring(0, 300)); expect(myData.bookings).toBeDefined(); expect(myData.bookings.length).toBeGreaterThan(0); // ── 步骤 3: Mock 扫码并签到 ── console.log(`\n━━━ 步骤 3/3: Mock wx.scanCode → 扫码签到`); // Mock wx.scanCode 返回课程的二维码内容(模拟扫描 fl.png) console.log(`Mock scanCode 返回: ${QR_CONTENT}`); await miniProgram.mockWxMethod('scanCode', { result: QR_CONTENT, scanType: 'QR_CODE', charSet: 'UTF-8', errMsg: 'scanCode:ok' }); console.log(`点击「${BOOKING_COURSE.name}」扫码签到按钮`); const signed = await myCoursesPage.scanSignIn(BOOKING_COURSE.name); if (signed) { console.log('扫码签到按钮已点击,等待签到完成...'); await new Promise(resolve => setTimeout(resolve, 2500)); page = await miniProgram.currentPage(); console.log('签到后当前页面:', page.path); } else { console.log(`未找到「${BOOKING_COURSE.name}」的签到按钮`); } // 恢复 mock await miniProgram.restoreWxMethod('scanCode'); console.log('已恢复 wx.scanCode'); // 验证页面未崩溃 const finalPage = await miniProgram.currentPage(); expect(finalPage.path).toBeTruthy(); console.log('\n✅ 预约+扫码签到流程完成'); }); });