test: add E2E tests for student teacher switching

Verify profile shows current teacher, teacher switching flow,
and my teachers list displays correctly.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-04-30 23:50:46 +08:00
parent 4d594c97ab
commit c23ef9c10a
+181
View File
@@ -0,0 +1,181 @@
import { expect, test } from './fixtures';
const moicenUnionid = process.env.MOICEN_E2E_UNIONID?.trim();
async function handleOrgSelect(page: any): Promise<boolean> {
// Returns true if org was selected, false if skipped
if (!page.url().includes('/org/select')) return true;
await page.waitForTimeout(2000);
if (
await page
.getByText('暂无可用机构')
.isVisible()
.catch(() => false)
) {
test.skip(true, '账号无可用机构,跳过');
return false;
}
if (
await page
.getByText('请返回微信小程序完成登录')
.isVisible()
.catch(() => false)
) {
test.skip(true, '当前 unionid 会话未处于可用登录态,跳过');
return false;
}
const orgCells = page.locator('#app .van-cell-group .van-cell');
const n = await orgCells.count();
expect(n, '机构选择页应有可选机构').toBeGreaterThan(0);
await orgCells.first().click();
// Org switch triggers window.location.assign('/'), wait for the new page
await page.waitForLoadState('domcontentloaded', { timeout: 90_000 });
await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 });
return true;
}
test.describe('学生老师切换', () => {
test.skip(!moicenUnionid, '需要 MOICEN_E2E_UNIONIDSecret 或 .env.e2e');
test('profile 页显示当前老师且可切换', async ({ page }) => {
test.setTimeout(180_000);
// 1. Login
const q = new URLSearchParams({
unionid: moicenUnionid!,
status: '2',
});
await page.goto(`/?${q.toString()}`, {
waitUntil: 'domcontentloaded',
timeout: 60_000,
});
await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 });
// Handle role selection if needed
if (
await page
.getByText('请选择您的登录身份')
.isVisible()
.catch(() => false)
) {
await page.locator('.van-grid-item').first().click();
await page.waitForTimeout(1000);
}
// 2. Navigate to student profile (triggers org resolution if needed)
await page.goto('/student/profile', {
waitUntil: 'domcontentloaded',
timeout: 60_000,
});
await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 });
// Handle org selection if needed
const orgOk = await handleOrgSelect(page);
if (!orgOk) return;
// After org switch, navigate to profile again
if (!page.url().includes('/student/profile')) {
await page.goto('/student/profile', {
waitUntil: 'domcontentloaded',
timeout: 60_000,
});
await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 });
}
// 3. Check profile page shows teacher section
const teacherSection = page.locator('.current-teacher');
await expect(teacherSection).toBeVisible({ timeout: 30_000 });
const teacherText = await teacherSection.locator('span').textContent();
expect(teacherText).toContain('当前老师');
// 4. Check "切换老师" button exists and works
const switchBtn = teacherSection.locator('.van-button');
await expect(switchBtn).toBeVisible({ timeout: 10_000 });
// Click switch teacher
await switchBtn.click();
await page.waitForTimeout(2000);
// Verify teacher list is shown
const teacherCells = page.locator('.van-cell');
const teacherCount = await teacherCells.count();
expect(teacherCount).toBeGreaterThan(0);
// 5. Select a different teacher and verify change
if (teacherCount > 1) {
await teacherCells.nth(1).click();
await page.waitForTimeout(1500);
// Should be back on profile page
const updatedTeacherSection = page.locator('.current-teacher');
await expect(updatedTeacherSection).toBeVisible({ timeout: 15_000 });
const newTeacherText = await updatedTeacherSection
.locator('span')
.textContent();
expect(newTeacherText).not.toContain('未选择老师');
}
});
test('「我的老师」列表显示本机构老师', async ({ page }) => {
test.setTimeout(180_000);
// Login
const q = new URLSearchParams({
unionid: moicenUnionid!,
status: '2',
});
await page.goto(`/?${q.toString()}`, {
waitUntil: 'domcontentloaded',
timeout: 60_000,
});
await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 });
if (
await page
.getByText('请选择您的登录身份')
.isVisible()
.catch(() => false)
) {
await page.locator('.van-grid-item').first().click();
await page.waitForTimeout(1000);
}
// Navigate through org select to ensure org context
await page.goto('/org/select', {
waitUntil: 'domcontentloaded',
timeout: 60_000,
});
await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 });
const orgOk = await handleOrgSelect(page);
if (!orgOk) return;
// Navigate to my teachers page
await page.goto('/student/teachers', {
waitUntil: 'domcontentloaded',
timeout: 60_000,
});
await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 });
if (
await page
.getByText('请返回微信小程序完成登录')
.isVisible()
.catch(() => false)
) {
test.skip(true, '会话已过期,跳过');
return;
}
// Teacher list should not be empty
const teacherCells = page.locator('.van-cell');
const teacherCount = await teacherCells.count();
expect(teacherCount).toBeGreaterThan(0);
});
});