Files
huike-e2e-moicen/tests/teacher-switching.spec.ts
T
weli d53c21605d fix: explicitly select student role in teacher-switching E2E
User has multiple roles, first grid item may not be STUDENT.
Add loginAsStudent helper to find and click the "学生" role.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-30 23:55:49 +08:00

188 lines
5.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { expect, test } from './fixtures';
const moicenUnionid = process.env.MOICEN_E2E_UNIONID?.trim();
async function loginAsStudent(page: any) {
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 });
// Select STUDENT role explicitly (user has multiple roles)
if (
await page
.getByText('请选择您的登录身份')
.isVisible()
.catch(() => false)
) {
// Find the "学生" grid item and click it
const studentRole = page.locator('.van-grid-item').filter({ hasText: '学生' });
if (await studentRole.isVisible().catch(() => false)) {
await studentRole.click();
await page.waitForTimeout(2000);
} else {
// Fallback: click first
await page.locator('.van-grid-item').first().click();
await page.waitForTimeout(2000);
}
}
}
async function ensureOrgContext(page: any): Promise<boolean> {
// Navigate to a page that triggers org resolution
await page.goto('/student/profile', {
waitUntil: 'domcontentloaded',
timeout: 60_000,
});
await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 });
// If redirected to org select, pick first org
if (page.url().includes('/org/select')) {
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 full page reload, wait for it
await page.waitForLoadState('domcontentloaded', { timeout: 90_000 });
await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 });
// Navigate back to student profile
await page.goto('/student/profile', {
waitUntil: 'domcontentloaded',
timeout: 60_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);
await loginAsStudent(page);
const ok = await ensureOrgContext(page);
if (!ok) return;
// Now we should be on /student/profile with STUDENT role
// 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('当前老师');
// Check "切换老师" button exists
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);
// Select a different teacher
if (teacherCount > 1) {
await teacherCells.nth(1).click();
await page.waitForTimeout(1500);
// Should be back on profile page, verify teacher name is set
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);
await loginAsStudent(page);
// 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 });
if (page.url().includes('/org/select')) {
if (
await page
.getByText('暂无可用机构')
.isVisible()
.catch(() => false)
) {
test.skip(true, '账号无可用机构,跳过');
return;
}
const orgCells = page.locator('.van-cell');
const n = await orgCells.count();
if (n > 0) {
await orgCells.first().click();
await page.waitForLoadState('domcontentloaded', { timeout: 90_000 });
await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 });
}
}
// 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);
});
});