import { expect, type Page, type Route, test } from "@playwright/test"; async function mockUserfrontApisForRepro( page: Page, options: { sessionStatus: number } = { sessionStatus: 401 }, ): Promise { await page.route("**/api/v1/**", async (route: Route) => { const requestUrl = new URL(route.request().url()); const path = requestUrl.pathname; if (path.endsWith("/api/v1/user/me")) { await route.fulfill({ status: options.sessionStatus, contentType: "application/json", body: JSON.stringify({ error: "unauthorized" }), }); return; } if (path.endsWith("/api/v1/client-log")) { await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify({ ok: true }), }); return; } // Default mock for other APIs await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify({}), }); }); } test.describe("Issue #345 Reproduction (Log-based Validation)", () => { test("비로그인 상태에서 login_challenge와 함께 signin 진입 시 루프 없이 로그가 정상 출력되어야 한다", async ({ page, }) => { const logs: string[] = []; page.on("console", (msg) => { const text = msg.text(); logs.push(text); console.log(`[Browser] ${text}`); }); const requests: string[] = []; page.on("request", (request) => { if (request.isNavigationRequest()) { requests.push(request.url()); } }); await mockUserfrontApisForRepro(page, { sessionStatus: 401 }); const targetUrl = "/ko/signin?login_challenge=repro_challenge_12345"; await page.goto(targetUrl); // WASM 앱 로딩 및 로직 실행 대기 await page.waitForTimeout(7000); const currentUrl = page.url(); const signinNavigations = requests.filter((url) => url.includes("/signin")); // [검증 1] URL 유지 확인 expect(currentUrl).toContain("login_challenge=repro_challenge_12345"); // [검증 2] 리다이렉트 루프 발생 여부 확인 (최초 진입 1회만 있어야 함) expect(signinNavigations.length).toBeLessThanOrEqual(1); // [검증 3] 핵심 로직 로그 확인 (성공의 결정적 증거) // 이전에는 여기서 Exception이 발생했으나, 이제는 아래 로그가 찍혀야 함 const hasSuccessLog = logs.some((log) => log.includes("[Auth] OIDC auto-accept: No active session (status: 401)"), ); expect(hasSuccessLog).toBe(true); console.log( "✅ 루프가 해결되었으며, 로그 검증을 통해 정상 동작을 확인했습니다.", ); }); });