import { expect, test } from './fixtures'; function frontBaseUrl(): string { const raw = process.env.HUIKE_FRONT_BASE_URL?.trim() || 'https://music-room.moicen.com'; return raw.replace(/\/$/, ''); } /** * 不依赖浏览器:验证网关返回 H5 入口文档(部署/ DNS / TLS / Nginx 全链路底线)。 */ const testOrgId = process.env.PROD_ORG_ID?.trim() || '57753e11dff343b1ab95623933e8960b'; test.describe('网关与 H5 文档(request)', () => { test('GET / 返回 HTML', async ({ request }) => { const res = await request.get(`${frontBaseUrl()}/`); expect(res.ok(), `HTTP ${res.status()} ${res.statusText()}`).toBeTruthy(); const ct = res.headers()['content-type'] ?? ''; expect(ct).toMatch(/text\/html/i); }); }); test.describe('课包商店 API(反代验收)', () => { const kcBase = process.env.KC_BASE_URL?.trim() || 'https://admin.moicen.com'; test('public-packages API 返回 JSON(非 HTML)', async ({ request }) => { const url = `${kcBase}/api/v1/clazz/course-package/public-packages?org_id=${testOrgId}&page=1&page_size=20`; const res = await request.get(url); expect(res.ok(), `HTTP ${res.status()} ${res.statusText()}`).toBeTruthy(); const ct = res.headers()['content-type'] ?? ''; expect(ct).toMatch(/application\/json/i); const body = await res.json(); expect(body).toHaveProperty('r'); expect(body.r).toBe(true); expect(body).toHaveProperty('d'); expect(Array.isArray(body.d?.[0])).toBe(true); }); test('public-packages API 含课包卡片字段', async ({ request }) => { const url = `${kcBase}/api/v1/clazz/course-package/public-packages?org_id=${testOrgId}&page=1&page_size=20`; const res = await request.get(url); expect(res.ok()).toBeTruthy(); const body = await res.json(); const packages = body.d?.[0] as Array>; // Production may have no published packages — that's valid expect(packages.length).toBeGreaterThanOrEqual(0); for (const pkg of packages) { expect(pkg).toHaveProperty('package_name'); expect(pkg).toHaveProperty('total_lessons'); expect(pkg).toHaveProperty('package_status'); // Pricing fields should exist in data but not displayed in frontend expect(pkg).toHaveProperty('original_price'); expect(pkg).toHaveProperty('selling_price'); } }); });