You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

39 lines
1.9 KiB
TypeScript

// frontend/playwright/auth.spec.ts — 로그인 플로우 + 보호 라우트 리다이렉트
// 실행: NEXT_PUBLIC_AUTH_ENABLED=true 프론트 + AUTH_ENABLED=true 백엔드(:31800, 시드 자격).
// (데모 CI 와 분리된 auth-multiuser 잡 — playwright/auth.config.ts 사용)
import { expect, test } from "@playwright/test";
test("미인증 → 보호 라우트 접근 시 /login 리다이렉트", async ({ page }) => {
await page.goto("/tasks");
await expect(page).toHaveURL(/\/login\?next=%2Ftasks/);
});
test("로그인 → 대시보드, Topbar 아바타에 '지'", async ({ page }) => {
await page.goto("/login");
await page.getByPlaceholder("이메일").fill("jiwoo@lumi.co");
await page.getByPlaceholder("비밀번호").fill("demo-1234");
await page.getByRole("button", { name: "로그인" }).click();
await expect(page).toHaveURL(/\/dashboard$/);
await expect(page.locator(".t-ava")).toContainText("지");
});
test("잘못된 비밀번호 → 동일 한국어 메시지(계정 열거 방어)", async ({ page }) => {
await page.goto("/login");
await page.getByPlaceholder("이메일").fill("jiwoo@lumi.co");
await page.getByPlaceholder("비밀번호").fill("nope");
await page.getByRole("button", { name: "로그인" }).click();
await expect(page.locator(".login-error")).toContainText("이메일 또는 비밀번호가 올바르지 않아요");
await expect(page).toHaveURL(/\/login/); // 페이지 유지
});
test("쿠키 삭제(세션 만료) → 다음 보호 요청 /login", async ({ page, context }) => {
await page.goto("/login");
await page.getByPlaceholder("이메일").fill("jiwoo@lumi.co");
await page.getByPlaceholder("비밀번호").fill("demo-1234");
await page.getByRole("button", { name: "로그인" }).click();
await expect(page).toHaveURL(/\/dashboard$/);
await context.clearCookies();
await page.goto("/inbox");
await expect(page).toHaveURL(/\/login/);
});