Files
gym-manage/gym-manage-uniapp/e2e/journeys/booking-journey.spec.js
T

159 lines
5.4 KiB
JavaScript

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✅ 预约+扫码签到流程完成');
});
});