i18n 적용
CI / test (push) Failing after 11m12s
CI / e2e (push) Has been cancelled
CI / pr_and_merge (push) Has been cancelled

This commit is contained in:
2025-12-10 15:56:51 +09:00
parent 73e9bc6a1c
commit f71207aeb5
127 changed files with 7346 additions and 2079 deletions
+34 -30
View File
@@ -23,7 +23,7 @@ test("/editor 페이지가 존재하고 Page Editor 헤더를 보여줘야 한
test("텍스트 버튼을 누르면 캔버스에 '새 텍스트' 블록이 보여야 한다", async ({ page }) => {
await page.goto("/editor");
await page.getByRole("button", { name: "텍스트" }).first().click();
await page.getByRole("button", { name: "Text" }).first().click();
const canvas = page.getByTestId("editor-canvas");
await expect(canvas.getByText("새 텍스트")).toBeVisible();
@@ -255,22 +255,22 @@ test("에디터 상태를 JSON으로 내보내고 다시 불러오면 동일한
await sizeSelect.selectOption("lg");
// JSON 내보내기/불러오기 모달을 연다.
await page.getByRole("button", { name: "메뉴 ▼" }).click();
await page.getByRole("button", { name: "JSON 내보내기/불러오기" }).click();
await page.getByRole("button", { name: "Menu" }).click();
await page.getByRole("button", { name: "JSON export / import" }).click();
// 현재 상태를 JSON으로 내보낸다.
await page.getByRole("button", { name: "JSON 내보내기" }).click();
const exportArea = page.getByRole("textbox", { name: "에디터 상태 JSON" });
await page.getByRole("button", { name: "Export JSON" }).click();
const exportArea = page.getByRole("textbox", { name: "Editor state JSON" });
const exportedJson = await exportArea.inputValue();
// 캔버스를 초기화한다.
await page.getByRole("button", { name: "캔버스 초기화" }).click();
await page.getByRole("button", { name: "Clear canvas" }).click();
await expect(canvas.getByTestId("editor-block")).toHaveCount(0);
// JSON을 다시 입력하고 불러온다.
const importArea = page.getByRole("textbox", { name: "JSON에서 불러오기" });
const importArea = page.getByRole("textbox", { name: "Import from JSON" });
await importArea.fill(exportedJson);
await page.getByRole("button", { name: "JSON 적용하기" }).click();
await page.getByRole("button", { name: "Apply JSON" }).click();
// 복원된 캔버스에 두 블록이 모두 존재해야 한다.
const restoredBlocks = canvas.getByTestId("editor-block");
@@ -510,9 +510,9 @@ test("에디터 메뉴에서 페이지 파일로 내보내기 (ZIP)를 클릭하
await page.getByRole("button", { name: "텍스트" }).first().click();
// 헤더 메뉴를 연다.
await page.getByRole("button", { name: "메뉴 ▼" }).click();
await page.getByRole("button", { name: "Menu" }).click();
const exportButton = page.getByRole("button", { name: "페이지 파일로 내보내기 (ZIP)" });
const exportButton = page.getByRole("button", { name: "Export as page files (ZIP)" });
await expect(exportButton).toBeVisible();
const [download] = await Promise.all([
@@ -573,10 +573,10 @@ test("Hero 템플릿 버튼을 클릭하면 섹션과 기본 텍스트/버튼
await expect(blocks.first()).toBeVisible();
// Hero 헤드라인 텍스트가 포함된 블록이 보여야 한다.
await expect(canvas.getByText("Hero 제목을 여기에 입력하세요")).toBeVisible();
await expect(canvas.getByText("Your hero headline goes here")).toBeVisible();
// CTA 버튼도 렌더되어 있어야 한다.
const ctaButton = canvas.getByRole("button", { name: "지금 시작하기" });
const ctaButton = canvas.getByRole("button", { name: "Get started now" });
await expect(ctaButton).toBeVisible();
});
@@ -588,9 +588,9 @@ test("Features 템플릿 버튼을 클릭하면 3개의 Feature 항목(제목/
await page.getByRole("button", { name: "기능 템플릿" }).click();
// Feature 제목들이 렌더되어야 한다.
await expect(canvas.getByText("Feature 1 제목")).toBeVisible();
await expect(canvas.getByText("Feature 2 제목")).toBeVisible();
await expect(canvas.getByText("Feature 3 제목")).toBeVisible();
await expect(canvas.getByText("Feature 1")).toBeVisible();
await expect(canvas.getByText("Feature 2")).toBeVisible();
await expect(canvas.getByText("Feature 3")).toBeVisible();
});
test("CTA 템플릿 버튼을 클릭하면 CTA 텍스트와 버튼이 포함된 섹션이 캔버스에 생성되어야 한다", async ({ page }) => {
@@ -600,8 +600,8 @@ test("CTA 템플릿 버튼을 클릭하면 CTA 텍스트와 버튼이 포함된
await page.getByRole("button", { name: "CTA 템플릿" }).click();
await expect(canvas.getByText("지금 바로 행동을 유도하는 CTA 텍스트를 입력하세요.")).toBeVisible();
const ctaButton = canvas.getByRole("button", { name: "CTA 버튼" });
await expect(canvas.getByText("Write a compelling CTA message here.")).toBeVisible();
const ctaButton = canvas.getByRole("button", { name: "Call to action" });
await expect(ctaButton).toBeVisible();
});
@@ -613,10 +613,14 @@ test("FAQ 템플릿 버튼을 클릭하면 질문/답변 텍스트가 세 쌍
await page.getByRole("button", { name: "FAQ 템플릿" }).click();
// 기본 FAQ 질문/답변 텍스트들이 렌더되어야 한다.
await expect(canvas.getByText("서비스 이용료는 얼마인가요?")).toBeVisible();
await expect(canvas.getByText("기본 기능은 무료로 제공되며, 프리미엄 기능은 월 구독료가 발생합니다.")).toBeVisible();
await expect(canvas.getByText("환불 정책은 어떻게 되나요?")).toBeVisible();
await expect(canvas.getByText("팀원 초대 기능이 있나요?")).toBeVisible();
await expect(canvas.getByText("How much does the service cost?")).toBeVisible();
await expect(
canvas.getByText(
"The core features are free, and premium features are available with a monthly subscription.",
),
).toBeVisible();
await expect(canvas.getByText("What is your refund policy?")).toBeVisible();
await expect(canvas.getByText("Can I invite teammates?")).toBeVisible();
});
test("Pricing 템플릿 버튼을 클릭하면 3개의 요금제 카드가 생성되어야 한다", async ({ page }) => {
@@ -627,11 +631,11 @@ test("Pricing 템플릿 버튼을 클릭하면 3개의 요금제 카드가 생
await page.getByRole("button", { name: "상품 템플릿" }).click();
await expect(canvas.getByText("Basic")).toBeVisible();
await expect(canvas.getByText("₩9,900/월")).toBeVisible();
await expect(canvas.getByText("$9/month")).toBeVisible();
await expect(canvas.getByText("Pro")).toBeVisible();
await expect(canvas.getByText("29,900/월")).toBeVisible();
await expect(canvas.getByText("$29/month")).toBeVisible();
await expect(canvas.getByText("Enterprise")).toBeVisible();
await expect(canvas.getByText("문의")).toBeVisible();
await expect(canvas.getByText("Contact us")).toBeVisible();
});
test("Testimonials 템플릿 버튼을 클릭하면 3개의 후기 카드가 생성되어야 한다", async ({ page }) => {
@@ -743,8 +747,8 @@ test("헤더의 실행 취소/다시 실행 버튼으로 블록 추가를 Undo/R
await page.getByRole("button", { name: "텍스트" }).first().click();
await expect(canvas.getByTestId("editor-block")).toHaveCount(1);
const undoButton = page.getByRole("button", { name: "실행 취소" });
const redoButton = page.getByRole("button", { name: "다시 실행" });
const undoButton = page.getByRole("button", { name: "Undo" });
const redoButton = page.getByRole("button", { name: "Redo" });
await undoButton.click();
await expect(canvas.getByTestId("editor-block")).toHaveCount(0);
@@ -909,10 +913,10 @@ test("리스트 아이템을 선택하면 패널에서 아이템 위/아래/들
await firstItem.click({ force: true });
// 리스트 아이템 행에 위치한 조작 버튼들을 사용할 수 있어야 한다.
const moveUpButton = firstItem.getByRole("button", { name: "" });
const moveDownButton = firstItem.getByRole("button", { name: "아래" });
const indentButton = firstItem.getByRole("button", { name: "들여쓰기" });
const outdentButton = firstItem.getByRole("button", { name: "내어쓰기" });
const moveUpButton = firstItem.getByRole("button", { name: "Move item up" });
const moveDownButton = firstItem.getByRole("button", { name: "Move item down" });
const indentButton = firstItem.getByRole("button", { name: "Indent item" });
const outdentButton = firstItem.getByRole("button", { name: "Outdent item" });
await expect(moveUpButton).toBeVisible();
await expect(moveDownButton).toBeVisible();