.
CI / test (push) Successful in 5m35s
CI / e2e (push) Failing after 6m11s
CI / pr_and_merge (push) Has been skipped

This commit is contained in:
2025-12-16 19:29:13 +09:00
parent 3f40021fab
commit ab5067c984
+17 -19
View File
@@ -23,7 +23,7 @@ function parsePx(value: string): number | null {
return Number.isFinite(n) ? n : null; return Number.isFinite(n) ? n : null;
} }
async function ensureAuthenticated(page: any, request: any) { async function ensureAuthenticated(page: any, request: any): Promise<string> {
const now = Date.now(); const now = Date.now();
const email = `style-regression-${now}@example.com`; const email = `style-regression-${now}@example.com`;
const password = "style-regression-password"; const password = "style-regression-password";
@@ -70,22 +70,20 @@ async function ensureAuthenticated(page: any, request: any) {
sameSite: "Lax", sameSite: "Lax",
}, },
]); ]);
return accessToken;
} }
async function patchProjectStatusForCurrentUser( async function patchProjectStatusForCurrentUser(
page: import("@playwright/test").Page,
request: import("@playwright/test").APIRequestContext, request: import("@playwright/test").APIRequestContext,
accessToken: string,
slug: string, slug: string,
status: "DRAFT" | "PUBLISHED" | "ARCHIVED", status: "DRAFT" | "PUBLISHED" | "ARCHIVED",
) { ) {
const cookies = await page.context().cookies();
const pbCookie = cookies.find((c) => c.name === "pb_access");
expect(pbCookie).toBeTruthy();
const res = await request.patch(`/api/projects/${slug}`, { const res = await request.patch(`/api/projects/${slug}`, {
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
Cookie: `pb_access=${pbCookie!.value}`, Cookie: `pb_access=${accessToken}`,
}, },
data: { status }, data: { status },
}); });
@@ -109,7 +107,7 @@ test("텍스트/버튼/리스트/이미지/비디오/폼 입력 필드 스타일
const slug = `style-regression-${now}`; const slug = `style-regression-${now}`;
// 1) 에디터에서 프로젝트 slug 와 기본 블록들을 구성한다. // 1) 에디터에서 프로젝트 slug 와 기본 블록들을 구성한다.
await ensureAuthenticated(page, request); const accessToken = await ensureAuthenticated(page, request);
await page.goto("/editor"); await page.goto("/editor");
const sidebar = page.getByTestId("properties-sidebar"); const sidebar = page.getByTestId("properties-sidebar");
@@ -246,7 +244,7 @@ test("텍스트/버튼/리스트/이미지/비디오/폼 입력 필드 스타일
await page.getByRole("button", { name: "Save (local + server)" }).click(); await page.getByRole("button", { name: "Save (local + server)" }).click();
await expect(page).toHaveURL(/\/_?projects/); await expect(page).toHaveURL(/\/_?projects/);
await patchProjectStatusForCurrentUser(page, request, slug, "PUBLISHED"); await patchProjectStatusForCurrentUser(request, accessToken, slug, "PUBLISHED");
await page.goto(`/p/${slug}`); await page.goto(`/p/${slug}`);
// 4) 동일한 slug 의 퍼블릭 페이지(/p/[slug])로 이동해 같은 요소들의 스타일을 다시 측정한다. // 4) 동일한 slug 의 퍼블릭 페이지(/p/[slug])로 이동해 같은 요소들의 스타일을 다시 측정한다.
@@ -379,7 +377,7 @@ test("버튼 너비/패딩/색상/둥글기 스타일이 프리뷰와 퍼블릭
const now = Date.now(); const now = Date.now();
const slug = `button-layout-style-regression-${now}`; const slug = `button-layout-style-regression-${now}`;
await ensureAuthenticated(page, request); const accessToken = await ensureAuthenticated(page, request);
await page.goto("/editor"); await page.goto("/editor");
const sidebar = page.getByTestId("properties-sidebar"); const sidebar = page.getByTestId("properties-sidebar");
@@ -435,7 +433,7 @@ test("버튼 너비/패딩/색상/둥글기 스타일이 프리뷰와 퍼블릭
await page.getByRole("button", { name: "Save (local + server)" }).click(); await page.getByRole("button", { name: "Save (local + server)" }).click();
await page.waitForURL(/\/projects/); await page.waitForURL(/\/projects/);
await patchProjectStatusForCurrentUser(page, request, slug, "PUBLISHED"); await patchProjectStatusForCurrentUser(request, accessToken, slug, "PUBLISHED");
await page.goto(`/p/${slug}`); await page.goto(`/p/${slug}`);
const publicButton = page.getByRole("link", { name: "Button" }).first(); const publicButton = page.getByRole("link", { name: "Button" }).first();
@@ -491,7 +489,7 @@ test("폼 셀렉트/체크박스/라디오 기본 텍스트 스타일이 프리
const slug = `form-style-regression-${now}`; const slug = `form-style-regression-${now}`;
// 1) 에디터에서 폼 블록들을 추가하고 프로젝트를 저장한다. // 1) 에디터에서 폼 블록들을 추가하고 프로젝트를 저장한다.
await ensureAuthenticated(page, request); const accessToken = await ensureAuthenticated(page, request);
await page.goto("/editor"); await page.goto("/editor");
const sidebar = page.getByTestId("properties-sidebar"); const sidebar = page.getByTestId("properties-sidebar");
@@ -560,7 +558,7 @@ test("폼 셀렉트/체크박스/라디오 기본 텍스트 스타일이 프리
await page.getByRole("button", { name: "Save (local + server)" }).click(); await page.getByRole("button", { name: "Save (local + server)" }).click();
await page.waitForURL(/\/projects/); await page.waitForURL(/\/projects/);
await patchProjectStatusForCurrentUser(page, request, slug, "PUBLISHED"); await patchProjectStatusForCurrentUser(request, accessToken, slug, "PUBLISHED");
await page.goto(`/p/${slug}`); await page.goto(`/p/${slug}`);
// 4) 동일한 slug 의 퍼블릭 페이지(/p/[slug])로 이동해 같은 텍스트들의 스타일을 다시 측정한다. // 4) 동일한 slug 의 퍼블릭 페이지(/p/[slug])로 이동해 같은 텍스트들의 스타일을 다시 측정한다.
@@ -606,7 +604,7 @@ test("폼 셀렉트/체크박스/라디오 레이아웃/패딩/너비/간격 스
const now = Date.now(); const now = Date.now();
const slug = `form-layout-style-regression-${now}`; const slug = `form-layout-style-regression-${now}`;
await ensureAuthenticated(page, request); const accessToken = await ensureAuthenticated(page, request);
await page.goto("/editor"); await page.goto("/editor");
const sidebar = page.getByTestId("properties-sidebar"); const sidebar = page.getByTestId("properties-sidebar");
@@ -784,7 +782,7 @@ test("폼 셀렉트/체크박스/라디오 레이아웃/패딩/너비/간격 스
await page.getByRole("button", { name: "Save (local + server)" }).click(); await page.getByRole("button", { name: "Save (local + server)" }).click();
await page.waitForURL(/\/projects/); await page.waitForURL(/\/projects/);
await patchProjectStatusForCurrentUser(page, request, slug, "PUBLISHED"); await patchProjectStatusForCurrentUser(request, accessToken, slug, "PUBLISHED");
await page.goto(`/p/${slug}`); await page.goto(`/p/${slug}`);
const publicSelectWrapper = page.locator(".pb-form-field").first(); const publicSelectWrapper = page.locator(".pb-form-field").first();
@@ -1010,8 +1008,8 @@ test("섹션 배경/레이아웃 스타일이 프리뷰와 퍼블릭 페이지
const now = Date.now(); const now = Date.now();
const slug = `section-style-regression-${now}`; const slug = `section-style-regression-${now}`;
// 1) 에디터에서 섹션 블록을 추가하고 배경색/패딩/최대 폭/컬럼 간격을 설정한다. // 1) 에디터에서 섹션 블록을 추가하고 배경색/패딩/최대 폭/컬럼 간격을 설정한다.
await ensureAuthenticated(page, request); const accessToken = await ensureAuthenticated(page, request);
await page.goto("/editor"); await page.goto("/editor");
const sidebar = page.getByTestId("properties-sidebar"); const sidebar = page.getByTestId("properties-sidebar");
@@ -1067,7 +1065,7 @@ test("섹션 배경/레이아웃 스타일이 프리뷰와 퍼블릭 페이지
await page.getByRole("button", { name: "Save (local + server)" }).click(); await page.getByRole("button", { name: "Save (local + server)" }).click();
await page.waitForURL(/\/projects/); await page.waitForURL(/\/projects/);
await patchProjectStatusForCurrentUser(page, request, slug, "PUBLISHED"); await patchProjectStatusForCurrentUser(request, accessToken, slug, "PUBLISHED");
await page.goto(`/p/${slug}`); await page.goto(`/p/${slug}`);
// 4) 퍼블릭 페이지에서 같은 섹션 레이아웃의 스타일을 다시 측정한다. // 4) 퍼블릭 페이지에서 같은 섹션 레이아웃의 스타일을 다시 측정한다.
@@ -1122,7 +1120,7 @@ test("구분선 스타일이 프리뷰와 퍼블릭 페이지에서 동일해야
const now = Date.now(); const now = Date.now();
const slug = `divider-style-regression-${now}`; const slug = `divider-style-regression-${now}`;
await ensureAuthenticated(page, request); const accessToken = await ensureAuthenticated(page, request);
await page.goto("/editor"); await page.goto("/editor");
const sidebar = page.getByTestId("properties-sidebar"); const sidebar = page.getByTestId("properties-sidebar");