51 lines
1.9 KiB
JavaScript
51 lines
1.9 KiB
JavaScript
import { expect, test } from "../support/browser/strict-browser-test.js";
|
|
|
|
/** @param {import("@playwright/test").Page} page */
|
|
async function openReferenceForm(page) {
|
|
await page.goto("/examples/reference-resources/new");
|
|
await page.getByRole("button", { name: "로그인 시작" }).click();
|
|
await expect(
|
|
page.getByRole("heading", { name: "Reference resource 만들기" }),
|
|
).toBeVisible();
|
|
}
|
|
|
|
test("validates a reference form and focuses the first invalid field", async ({
|
|
page,
|
|
}) => {
|
|
await openReferenceForm(page);
|
|
await page.getByRole("button", { name: "저장" }).click();
|
|
|
|
const firstField = page.getByRole("textbox", { name: /새 항목 이름/ });
|
|
await expect(firstField).toBeFocused();
|
|
await expect(firstField).toHaveAttribute("aria-invalid", "true");
|
|
await expect(page.getByRole("alert")).toContainText("입력 내용을 확인해 주세요.");
|
|
});
|
|
|
|
test("guards dirty cancellation and restores focus when writing continues", async ({
|
|
page,
|
|
}) => {
|
|
await openReferenceForm(page);
|
|
await page
|
|
.getByRole("textbox", { name: /새 항목 이름/ })
|
|
.fill("Unsaved reference");
|
|
const cancel = page.getByRole("button", { name: "취소" });
|
|
await cancel.click();
|
|
|
|
await expect(
|
|
page.getByRole("dialog", { name: "저장하지 않은 변경이 있습니다." }),
|
|
).toBeVisible();
|
|
await page.getByRole("button", { name: "계속 작성" }).click();
|
|
await expect(cancel).toBeFocused();
|
|
await expect(page).toHaveURL(/\/examples\/reference-resources\/new$/);
|
|
});
|
|
|
|
test("keeps the form template within a 320px viewport", async ({ page }) => {
|
|
await page.setViewportSize({ width: 320, height: 720 });
|
|
await openReferenceForm(page);
|
|
const viewport = await page.evaluate(() => ({
|
|
clientWidth: document.documentElement.clientWidth,
|
|
scrollWidth: document.documentElement.scrollWidth,
|
|
}));
|
|
expect(viewport.scrollWidth).toBeLessThanOrEqual(viewport.clientWidth);
|
|
});
|