140 lines
5.2 KiB
TypeScript
140 lines
5.2 KiB
TypeScript
import { test, expect } from "@playwright/test";
|
|
|
|
// CTA / Features 템플릿이 현재 로케일에 따라 올바른 기본 텍스트로 생성되는지 검증한다.
|
|
|
|
// 모든 테스트에서 /api/auth/me 를 목 처리해 로그인 상태를 강제하고,
|
|
// autosave 및 이전 localStorage 상태가 섞이지 않도록 진입 시점을 초기화한다.
|
|
test.beforeEach(async ({ page }) => {
|
|
await page.addInitScript(() => {
|
|
try {
|
|
window.localStorage.clear();
|
|
} catch {
|
|
// localStorage 접근 실패는 테스트 진행에 치명적이지 않으므로 조용히 무시한다.
|
|
}
|
|
|
|
(window as any).__PB_DISABLE_AUTOSAVE = true;
|
|
});
|
|
|
|
await page.route("**/api/auth/me", async (route) => {
|
|
await route.fulfill({
|
|
status: 200,
|
|
contentType: "application/json",
|
|
body: JSON.stringify({ id: "user-e2e", email: "e2e@example.com", tokenVersion: 1 }),
|
|
});
|
|
});
|
|
});
|
|
|
|
function getLocaleToggle(page: import("@playwright/test").Page) {
|
|
return page.getByRole("button", { name: "Toggle locale" });
|
|
}
|
|
|
|
async function assertLocale(page: import("@playwright/test").Page, expected: "EN" | "KO") {
|
|
const toggle = getLocaleToggle(page);
|
|
await expect(toggle).toBeVisible();
|
|
await expect(toggle).toHaveText(expected);
|
|
}
|
|
|
|
async function setLocale(page: import("@playwright/test").Page, target: "EN" | "KO") {
|
|
const toggle = getLocaleToggle(page);
|
|
await expect(toggle).toBeVisible();
|
|
|
|
const current = (await toggle.textContent())?.trim();
|
|
if (current === target) return;
|
|
|
|
await toggle.click();
|
|
await expect(toggle).toHaveText(target);
|
|
}
|
|
|
|
// EN 로케일 기준 CTA 템플릿
|
|
test("CTA 템플릿은 EN 로케일에서 영어 기본 텍스트로 생성되어야 한다", async ({ page }) => {
|
|
await page.goto("/editor");
|
|
|
|
await setLocale(page, "EN");
|
|
|
|
await page.getByRole("button", { name: "CTA template" }).click();
|
|
|
|
const canvas = page.getByTestId("editor-canvas");
|
|
|
|
// 디버그: 현재 캔버스 텍스트 블록들의 내용을 로그로 출력한다(플레이키 이슈 분석용).
|
|
const debugTexts = await canvas.getByTestId("editor-block").allInnerTexts();
|
|
// eslint-disable-next-line no-console
|
|
console.log("[CTA EN debug] block texts:", debugTexts);
|
|
|
|
// 실제 검증은 프리뷰 페이지에서 EN 기본 텍스트가 렌더되는지 기준으로 수행한다.
|
|
await Promise.all([
|
|
page.waitForURL(/\/preview/),
|
|
page.getByRole("link", { name: "Open preview" }).click(),
|
|
]);
|
|
|
|
await expect(page.getByRole("heading", { name: "Page Preview" })).toBeVisible();
|
|
|
|
// EN 기본 CTA 본문/버튼 텍스트가 프리뷰에 보여야 한다.
|
|
await expect(page.getByText("Write a compelling CTA message here.")).toBeVisible();
|
|
await expect(page.getByText("Call to action")).toBeVisible();
|
|
|
|
// KO 기본 CTA 텍스트/버튼은 프리뷰에 나타나지 않아야 한다.
|
|
await expect(
|
|
page.getByText("지금 바로 행동을 유도하는 CTA 텍스트를 입력하세요.", { exact: false }),
|
|
).toHaveCount(0);
|
|
await expect(page.getByText("CTA 버튼")).toHaveCount(0);
|
|
});
|
|
|
|
// KO 로케일 기준 CTA 템플릿
|
|
test("CTA 템플릿은 KO 로케일에서 한국어 기본 텍스트로 생성되어야 한다", async ({ page }) => {
|
|
await page.goto("/editor");
|
|
|
|
await setLocale(page, "KO");
|
|
|
|
await page.getByRole("button", { name: "CTA 템플릿" }).click();
|
|
|
|
const canvas = page.getByTestId("editor-canvas");
|
|
|
|
await expect(
|
|
canvas.getByText("지금 바로 행동을 유도하는 CTA 텍스트를 입력하세요.", { exact: false }),
|
|
).toBeVisible();
|
|
await expect(canvas.getByRole("button", { name: "CTA 버튼" })).toBeVisible();
|
|
|
|
await expect(canvas.getByText("Write a compelling CTA message here.")).toHaveCount(0);
|
|
});
|
|
|
|
// EN 로케일 기준 Features 템플릿
|
|
test("Features 템플릿은 EN 로케일에서 영어 기본 텍스트로 생성되어야 한다", async ({ page }) => {
|
|
await page.goto("/editor");
|
|
|
|
await setLocale(page, "EN");
|
|
|
|
await page.getByRole("button", { name: "Features template" }).click();
|
|
|
|
const canvas = page.getByTestId("editor-canvas");
|
|
|
|
// 디버그: 현재 캔버스 텍스트 블록들의 내용을 로그로 출력한다.
|
|
const debugTexts = await canvas.getByTestId("editor-block").allInnerTexts();
|
|
// eslint-disable-next-line no-console
|
|
console.log("[Features EN debug] block texts:", debugTexts);
|
|
|
|
await expect(canvas.getByText("Feature 1", { exact: false }).first()).toBeVisible();
|
|
await expect(canvas.getByText("A short description of this feature.").first()).toBeVisible();
|
|
|
|
await expect(
|
|
canvas.getByText("해당 기능을 간단히 설명하는 텍스트입니다.", { exact: false }),
|
|
).toHaveCount(0);
|
|
});
|
|
|
|
// KO 로케일 기준 Features 템플릿
|
|
test("Features 템플릿은 KO 로케일에서 한국어 기본 텍스트로 생성되어야 한다", async ({ page }) => {
|
|
await page.goto("/editor");
|
|
|
|
await setLocale(page, "KO");
|
|
|
|
await page.getByRole("button", { name: "기능 템플릿" }).click();
|
|
|
|
const canvas = page.getByTestId("editor-canvas");
|
|
|
|
await expect(canvas.getByText("Feature 1 제목", { exact: false })).toBeVisible();
|
|
await expect(
|
|
canvas.getByText("해당 기능을 간단히 설명하는 텍스트입니다.", { exact: false }).first(),
|
|
).toBeVisible();
|
|
|
|
await expect(canvas.getByText("A short description of this feature.")).toHaveCount(0);
|
|
});
|