diff --git a/CLAUDE.md b/CLAUDE.md index d17f2b1..0111774 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -42,19 +42,23 @@ npx playwright test --ui ### 等待 CI 完成 -使用 `gh run watch` 在后台检测,不要轮询: +使用 Monitor 工具配合 `gh run watch`,CI 完成后会自动通知: ```bash # 获取最新 CI run ID gh run list --repo alchemy-studio/huike-e2e-moicen --limit 1 --json databaseId --jq '.[0].databaseId' -# 后台 watch(用 & 或 run_in_background),完成后会自动通知 -gh run watch --repo alchemy-studio/huike-e2e-moicen 2>&1 & +# Monitor 会自动通知每次状态刷新和最终完成 +Monitor: + command: gh run watch --repo alchemy-studio/huike-e2e-moicen 2>&1 | grep -E --line-buffered '(✓ master|✘ master|╳ master|X master)|Process completed' + description: Watch CI run completion ``` +注意:**不要用 `Bash run_in_background` + `gh run watch`**,因为 Bash 后台任务不会在完成时通知,你会卡住等不到结果。必须用 **Monitor** 工具,它会在每行 stdout 输出时通知你。 + 也可以用 `gh run watch --job=` 监控特定 job。 -注意:`gh run watch` 依赖当前目录的 git remote 确定仓库,所以要在 `huike-e2e-moicen` 目录下跑,或者用 `--repo` 参数显式指定。 +`gh run watch` 依赖当前目录的 git remote 确定仓库,所以要在 `huike-e2e-moicen` 目录下跑,或者用 `--repo` 参数显式指定。 ### 两个 Workflow diff --git a/tests/course-package.spec.ts b/tests/course-package.spec.ts index 2724e8f..e32a3ec 100644 --- a/tests/course-package.spec.ts +++ b/tests/course-package.spec.ts @@ -708,27 +708,29 @@ test.describe('音乐教室端(huike-front)课包 UI', () => { await page.getByText('保存').click(); // ---- Verify via API that package was created with this group ---- - await page.waitForTimeout(2000); - const myRes = await request.get( - `${kcBase}/api/v1/clazz/course-package/my-packages?page=1&page_size=50`, - { headers }, - ); - expect(myRes.ok()).toBeTruthy(); - const myBody = await myRes.json(); - const myList: any[] = myBody.d?.[0] ?? []; - const newPkg = myList.find((p: any) => p.package_name === pkgName); - expect(newPkg, '创建的课包应出现在我的课包列表中').toBeTruthy(); - createdPkgId = newPkg.id; + // Use poll to retry — save may not be immediately reflected on CI + await expect(async () => { + const myRes = await request.get( + `${kcBase}/api/v1/clazz/course-package/my-packages?page=1&page_size=50`, + { headers }, + ); + expect(myRes.ok()).toBeTruthy(); + const myBody = await myRes.json(); + const myList: any[] = myBody.d?.[0] ?? []; + const newPkg = myList.find((p: any) => p.package_name === pkgName); + expect(newPkg, '创建的课包应出现在我的课包列表中').toBeTruthy(); + createdPkgId = newPkg!.id; - const itemsRes = await request.get( - `${kcBase}/api/v1/clazz/course-package/item/list/${createdPkgId}`, - { headers }, - ); - expect(itemsRes.ok()).toBeTruthy(); - const itemsBody = await itemsRes.json(); - const items: any[] = itemsBody.d ?? []; - const matched = items.some((g: any) => g.course_group_id === groupId); - expect(matched, '保存后课包应包含选中的课节分组').toBe(true); + const itemsRes = await request.get( + `${kcBase}/api/v1/clazz/course-package/item/list/${createdPkgId}`, + { headers }, + ); + expect(itemsRes.ok()).toBeTruthy(); + const itemsBody = await itemsRes.json(); + const items: any[] = itemsBody.d ?? []; + const matched = items.some((g: any) => g.course_group_id === groupId); + expect(matched, '保存后课包应包含选中的课节分组').toBe(true); + }).toPass({ timeout: 15_000 }); } finally { // ---- Cleanup ---- if (createdPkgId) {