From 9649f5ffaf83cac752030f51cdb0fa96701a30d4 Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Sun, 9 Aug 2026 23:56:39 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A3=BC=EA=B8=B0=20=ED=9A=8C=EA=B8=B0=20?= =?UTF-8?q?=EC=98=81=EC=86=8D=EC=84=B1=20=EB=8C=80=EA=B8=B0=20=EA=B3=A0?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../e2e/periodic-learner-real-closed-loop.spec.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/web/e2e/periodic-learner-real-closed-loop.spec.ts b/apps/web/e2e/periodic-learner-real-closed-loop.spec.ts index 9b640eb..ce0e3f7 100644 --- a/apps/web/e2e/periodic-learner-real-closed-loop.spec.ts +++ b/apps/web/e2e/periodic-learner-real-closed-loop.spec.ts @@ -49,6 +49,7 @@ interface ReturnedPracticeFixture { interface SessionDetail { session_id: string; persona_code: string; + turns?: unknown[]; } interface AuthMe { @@ -276,10 +277,21 @@ test.describe("periodic same-learner real closed loop", () => { const stream = await streamResponse; await expectOk(stream); expect(stream.headers()["content-type"] ?? "").toContain("text/event-stream"); + expect(await stream.finished()).toBeNull(); await expect(page.locator(".sx-utt").filter({ hasText: learnerText })).toBeVisible(); await expect(page.locator(".sx-utt.is-client").last()).toBeVisible({ timeout: 6 * 60_000, }); + await expect + .poll( + async () => { + const detail = await page.request.get(`/api/sessions/${practiceSessionId}`); + if (!detail.ok()) return 0; + return ((await detail.json()) as SessionDetail).turns?.length ?? 0; + }, + { timeout: 60_000, intervals: [500, 1_000, 2_000] }, + ) + .toBeGreaterThanOrEqual(2); await page.getByRole("button", { name: "회기 종료" }).click(); await page.getByRole("button", { name: "종료하고 리뷰 보기" }).click();