Files

85 lines
3.0 KiB
TypeScript
Raw Permalink Normal View History

import { expect, test } from './fixtures';
import {
decodeJwtPayload,
establishSession,
extractOrgIdFromTokenPayload,
resolveOrgContextForCoursePage,
waitForCourseRealmVisible,
} from './helpers/music-room-session';
const moicenUnionid = process.env.MOICEN_E2E_UNIONID?.trim();
/** 可选:仓库 Variables `MOICEN_HEALTHCHECK_URL`(如 `https://api.example/health`),未配置则 skip */
const moicenHealthcheckUrl = process.env.MOICEN_HEALTHCHECK_URL?.trim();
test.describe('核心全链路(访客)', () => {
/**
* `main.ts`:未带 Registered 链时访问非 `/`、`/guest/*` 会 replace 到 `/`,最终应呈现访客占位。
*/
test('未登录深链 /course 最终回到访客首页', async ({ page }) => {
await page.goto('/course', {
waitUntil: 'domcontentloaded',
timeout: 60_000,
});
await expect(page.locator('#app')).toBeVisible({ timeout: 60_000 });
await page.waitForURL((u) => new URL(u).pathname === '/', {
timeout: 60_000,
});
// Guest home now shows the course package store instead of login prompt
await expect(page.locator('.course-package-store')).toBeVisible({ timeout: 60_000 });
});
});
test.describe('核心全链路(已登录 → 教学资源)', () => {
test.describe.configure({ timeout: 180_000 });
test.skip(!moicenUnionid, '需要 MOICEN_E2E_UNIONIDSecret 或 .env.e2e');
test('黄金路径:会话建立 → 深链进入课程体系壳层 → JWT 与 CurrentOrgId 闭环', async ({
page,
}) => {
await establishSession(page, moicenUnionid!);
if (
await page.getByText('请返回微信小程序完成登录').isVisible().catch(() => false)
) {
test.skip(true, '当前 unionid 会话未处于可用登录态');
}
await resolveOrgContextForCoursePage(page);
const storage = await page.evaluate(() => ({
currentOrgId: window.localStorage.getItem('CurrentOrgId'),
authorization: window.localStorage.getItem('Authorization'),
}));
expect(storage.authorization, '登录深链后应有 Authorization').toBeTruthy();
const payload = decodeJwtPayload(storage.authorization!);
expect(payload).not.toBeNull();
const jwtOrgId = extractOrgIdFromTokenPayload(payload);
expect(jwtOrgId).toBeTruthy();
if (storage.currentOrgId) {
expect(storage.currentOrgId).toBe(jwtOrgId);
}
await page.goto('/course', {
waitUntil: 'domcontentloaded',
timeout: 90_000,
});
await expect(page.locator('#app')).toBeVisible({ timeout: 90_000 });
await waitForCourseRealmVisible(page);
await expect(page.getByText('请求失败,点击重新加载')).toHaveCount(0, {
timeout: 45_000,
});
});
});
test('可选:MOICEN_HEALTHCHECK_URL 可达', async ({ request }) => {
test.skip(!moicenHealthcheckUrl, '未配置 MOICEN_HEALTHCHECK_URL(仓库 Variables');
const res = await request.get(moicenHealthcheckUrl!);
expect(
res.ok(),
`HTTP ${res.status()} ${res.statusText()} ${moicenHealthcheckUrl}`
).toBeTruthy();
});