import { expect, test } from "@playwright/test"; import { apiBaseUrl } from "./api-base-url"; test("completes login, navigation, and logout using only the keyboard", async ({ page }) => { await page.route(`${apiBaseUrl}/admin/member/login`, async (route) => { await route.fulfill({ contentType: "application/json", json: { success: true, message: null, data: { token: "admin-token", role: "ADMIN" }, errorProperty: null }, }); }); await page.route(`${apiBaseUrl}/api/v2/admin/ai-characters?page=0&size=20`, async (route) => { await route.fulfill({ contentType: "application/json", json: { success: true, message: null, data: null, errorProperty: null }, }); }); await page.route(`${apiBaseUrl}/member/logout`, async (route) => { await route.fulfill({ contentType: "application/json", json: { success: true, message: null, data: {}, errorProperty: null }, }); }); await page.goto("/login"); await page.getByLabel("이메일").focus(); await page.keyboard.type("admin@test.com"); await page.getByLabel("비밀번호").focus(); await page.keyboard.type("password"); await page.getByRole("button", { name: "로그인" }).focus(); await page.keyboard.press("Enter"); await expect(page).toHaveURL(/\/ai-characters$/); await expect(page.getByRole("heading", { name: "AI 캐릭터", exact: true })).toBeVisible(); const logoutButton = page.getByRole("button", { name: "로그아웃" }); await logoutButton.focus(); await expect(logoutButton).toBeFocused(); await page.keyboard.press("Enter"); await expect(page).toHaveURL(/\/login$/); await expect(page.getByRole("heading", { name: "관리자 로그인" })).toBeVisible(); });