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