개선관리 요구사항과 Google 로그인을 완료

This commit is contained in:
Yun Chan 2026-08-28 16:07:09 +09:00
parent cc0a15b7c6
commit 2a39636163
112 changed files with 10166 additions and 527 deletions

View file

@ -545,6 +545,42 @@ test.describe("회기 대화 — 텍스트 턴과 SSE 스트림", () => {
expect(stream.calls).toBe(2);
});
// usecase: HTTP 200 스트림이 오류 이벤트 없이 끊겨도 성공으로 오인하지 않고 같은 발화로 회복한다
test("done 없이 스트림이 끝나면 실패로 표시하고 같은 발화 재시도를 보장한다", async ({
page,
}) => {
await routeSessionScreen(page);
const partialText = "연결이 끊기기 전 일부 응답";
const stream = await installStream(page, async (index, route) => {
if (index === 0) {
await route.fulfill({
status: 200,
contentType: "text/event-stream",
body: ["event: token", `data: ${partialText}`, ""].join("\n"),
});
return;
}
await fulfillTurn(route, REPLY_TOKENS, doneEvent(1));
});
await startFreshSession(page);
const composer = composerOf(page);
await composer.fill(LEARNER_TEXT);
await sendButtonOf(page).click();
const alert = page.getByRole("alert").filter({ hasText: "응답 연결이 중간에 끊겼습니다" });
await expect(alert).toBeVisible();
await expect(alert).toContainText("입력 내용은 복원했습니다");
await expect(page.locator(".sx-utt")).toHaveCount(0);
await expect(page.getByText(partialText)).toHaveCount(0);
await expect(composer).toHaveValue(LEARNER_TEXT);
await sendButtonOf(page).click();
await expect(clientUtterance(page).filter({ hasText: REPLY_FULL })).toBeVisible();
await expect(alert).toHaveCount(0);
expect(stream.calls).toBe(2);
});
// usecase: 내담자가 응답을 내지 못한 턴은 빈 말풍선 없이 정직하게 끝나고 다음 발화를 이어갈 수 있다
test("빈 내담자 응답 턴은 가짜 말풍선 없이 종료되고 대화를 이어갈 수 있다", async ({
page,