i18n 적용
This commit is contained in:
@@ -69,12 +69,12 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
expect(await screen.findByText("테스트 프로젝트 B")).toBeTruthy();
|
||||
expect(screen.getByText("test-project-b")).toBeTruthy();
|
||||
|
||||
const editLinks = screen.getAllByText("편집");
|
||||
const editLinks = screen.getAllByText("Edit");
|
||||
expect(editLinks).toHaveLength(2);
|
||||
expect(editLinks[0].closest("a")?.getAttribute("href")).toBe("/editor?slug=test-project-a");
|
||||
expect(editLinks[1].closest("a")?.getAttribute("href")).toBe("/editor?slug=test-project-b");
|
||||
|
||||
const previewLinks = screen.getAllByText("미리보기");
|
||||
const previewLinks = screen.getAllByText("Preview");
|
||||
expect(previewLinks).toHaveLength(2);
|
||||
expect(previewLinks[0].closest("a")?.getAttribute("href")).toBe("/preview?slug=test-project-a");
|
||||
expect(previewLinks[1].closest("a")?.getAttribute("href")).toBe("/preview?slug=test-project-b");
|
||||
@@ -107,7 +107,7 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
expect(fetchMock).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
const link = screen.getByText("전체 제출 내역");
|
||||
const link = screen.getByText("All submissions");
|
||||
expect(link).toBeTruthy();
|
||||
expect(link.closest("a")?.getAttribute("href")).toBe("/projects/submissions");
|
||||
});
|
||||
@@ -139,7 +139,7 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
expect(fetchMock).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
const link = screen.getByText("대시보드");
|
||||
const link = screen.getByText("Dashboard");
|
||||
expect(link).toBeTruthy();
|
||||
expect(link.closest("a")?.getAttribute("href")).toBe("/dashboard");
|
||||
});
|
||||
@@ -220,31 +220,31 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
expect(toolbarClass).toContain("text-slate-600");
|
||||
expect(toolbarClass).toContain("dark:text-slate-300");
|
||||
|
||||
const editLink = screen.getByText("편집").closest("a") as HTMLElement | null;
|
||||
const editLink = screen.getByText("Edit").closest("a") as HTMLElement | null;
|
||||
expect(editLink).not.toBeNull();
|
||||
const editClass = editLink!.className;
|
||||
expect(editClass).toContain("text-sky-600");
|
||||
expect(editClass).toContain("dark:text-sky-300");
|
||||
|
||||
const previewLink = screen.getByText("미리보기").closest("a") as HTMLElement | null;
|
||||
const previewLink = screen.getByText("Preview").closest("a") as HTMLElement | null;
|
||||
expect(previewLink).not.toBeNull();
|
||||
const previewClass = previewLink!.className;
|
||||
expect(previewClass).toContain("text-slate-600");
|
||||
expect(previewClass).toContain("dark:text-slate-300");
|
||||
|
||||
const submissionsLink = screen.getByText("폼 제출 내역").closest("a") as HTMLElement | null;
|
||||
const submissionsLink = screen.getByText("Form submissions").closest("a") as HTMLElement | null;
|
||||
expect(submissionsLink).not.toBeNull();
|
||||
const submissionsClass = submissionsLink!.className;
|
||||
expect(submissionsClass).toContain("text-emerald-600");
|
||||
expect(submissionsClass).toContain("dark:text-emerald-300");
|
||||
|
||||
const deleteButton = screen.getByText("삭제").closest("button") as HTMLElement | null;
|
||||
const deleteButton = screen.getByText("Delete").closest("button") as HTMLElement | null;
|
||||
expect(deleteButton).not.toBeNull();
|
||||
const deleteClass = deleteButton!.className;
|
||||
expect(deleteClass).toContain("text-red-600");
|
||||
expect(deleteClass).toContain("dark:text-red-300");
|
||||
|
||||
const prevButton = screen.getByRole("button", { name: "이전" });
|
||||
const prevButton = screen.getByRole("button", { name: "Previous" });
|
||||
const prevClass = prevButton.className;
|
||||
expect(prevClass).toContain("border-slate-300");
|
||||
expect(prevClass).toContain("text-slate-700");
|
||||
@@ -279,9 +279,9 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
expect(fetchMock).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
const dashboardLink = await screen.findByRole("link", { name: "대시보드" });
|
||||
const projectsLink = await screen.findByRole("link", { name: "프로젝트 목록" });
|
||||
const submissionsLink = await screen.findByRole("link", { name: "전체 제출 내역" });
|
||||
const dashboardLink = await screen.findByRole("link", { name: "Dashboard" });
|
||||
const projectsLink = await screen.findByRole("link", { name: "Projects" });
|
||||
const submissionsLink = await screen.findByRole("link", { name: "All submissions" });
|
||||
|
||||
expect(projectsLink.closest("a")?.getAttribute("href")).toBe("/projects");
|
||||
expect(projectsLink.closest("a")?.getAttribute("aria-current")).toBe("page");
|
||||
@@ -320,7 +320,7 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
const html = document.documentElement;
|
||||
html.classList.remove("dark");
|
||||
|
||||
const themeToggleButton = await screen.findByRole("button", { name: "테마 전환" });
|
||||
const themeToggleButton = await screen.findByRole("button", { name: "Toggle theme" });
|
||||
|
||||
expect(html.classList.contains("dark")).toBe(false);
|
||||
|
||||
@@ -367,7 +367,7 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
expect(await screen.findByText("테스트 프로젝트 A")).toBeTruthy();
|
||||
expect(await screen.findByText("테스트 프로젝트 B")).toBeTruthy();
|
||||
|
||||
const submissionLinks = screen.getAllByText("폼 제출 내역");
|
||||
const submissionLinks = screen.getAllByText("Form submissions");
|
||||
expect(submissionLinks).toHaveLength(2);
|
||||
expect(submissionLinks[0].closest("a")?.getAttribute("href")).toBe(
|
||||
"/projects/test-project-a/submissions",
|
||||
@@ -428,7 +428,7 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
|
||||
expect(await screen.findByText("테스트 프로젝트 A")).toBeTruthy();
|
||||
|
||||
const deleteButtons = screen.getAllByText("삭제");
|
||||
const deleteButtons = screen.getAllByText("Delete");
|
||||
expect(deleteButtons.length).toBeGreaterThan(0);
|
||||
|
||||
deleteButtons[0].click();
|
||||
@@ -482,8 +482,8 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
// 상단 툴바에서 선택 삭제와 새 프로젝트 만들기 버튼이 함께 보여야 한다.
|
||||
const toolbar = await screen.findByTestId("projects-toolbar");
|
||||
|
||||
expect(toolbar.querySelector("button[type='button']")?.textContent).toContain("선택 삭제");
|
||||
expect(toolbar.querySelector("a[href='/editor?new=1']")?.textContent).toContain("새 프로젝트 만들기");
|
||||
expect(toolbar.querySelector("button[type='button']")?.textContent).toContain("Delete selected");
|
||||
expect(toolbar.querySelector("a[href='/editor?new=1']")?.textContent).toContain("Create new project");
|
||||
});
|
||||
|
||||
it("체크박스로 여러 프로젝트를 선택한 뒤 '선택 삭제' 버튼으로 일괄 삭제할 수 있어야 한다", async () => {
|
||||
@@ -544,13 +544,20 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
expect(await screen.findByText("테스트 프로젝트 A")).toBeTruthy();
|
||||
expect(await screen.findByText("테스트 프로젝트 B")).toBeTruthy();
|
||||
|
||||
const checkboxA = screen.getByLabelText("테스트 프로젝트 A 선택");
|
||||
const checkboxB = screen.getByLabelText("테스트 프로젝트 B 선택");
|
||||
const rowA = (await screen.findByText("테스트 프로젝트 A")).closest("tr") as HTMLElement | null;
|
||||
const rowB = (await screen.findByText("테스트 프로젝트 B")).closest("tr") as HTMLElement | null;
|
||||
expect(rowA).not.toBeNull();
|
||||
expect(rowB).not.toBeNull();
|
||||
|
||||
fireEvent.click(checkboxA);
|
||||
fireEvent.click(checkboxB);
|
||||
const checkboxA = rowA!.querySelector("input[type='checkbox']") as HTMLInputElement | null;
|
||||
const checkboxB = rowB!.querySelector("input[type='checkbox']") as HTMLInputElement | null;
|
||||
expect(checkboxA).not.toBeNull();
|
||||
expect(checkboxB).not.toBeNull();
|
||||
|
||||
const bulkDeleteButton = screen.getByText("선택 삭제");
|
||||
fireEvent.click(checkboxA!);
|
||||
fireEvent.click(checkboxB!);
|
||||
|
||||
const bulkDeleteButton = screen.getByText("Delete selected");
|
||||
fireEvent.click(bulkDeleteButton);
|
||||
|
||||
await waitFor(() => {
|
||||
@@ -635,10 +642,10 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
expect(fetchMock).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
const menuButton = await screen.findByRole("button", { name: "메뉴" });
|
||||
const menuButton = await screen.findByRole("button", { name: "Menu" });
|
||||
fireEvent.click(menuButton);
|
||||
|
||||
const logoutButton = await screen.findByRole("button", { name: "로그아웃" });
|
||||
const logoutButton = await screen.findByRole("button", { name: "Log out" });
|
||||
fireEvent.click(logoutButton);
|
||||
|
||||
await waitFor(() => {
|
||||
@@ -669,7 +676,7 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
|
||||
expect(
|
||||
await screen.findByText(
|
||||
"프로젝트 목록을 불러오는 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.",
|
||||
"An error occurred while loading your projects. Please try again later.",
|
||||
),
|
||||
).toBeTruthy();
|
||||
});
|
||||
@@ -714,11 +721,13 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
|
||||
expect(await screen.findByText("삭제 실패 프로젝트")).toBeTruthy();
|
||||
|
||||
const deleteButton = screen.getByText("삭제");
|
||||
const deleteButton = screen.getByText("Delete");
|
||||
fireEvent.click(deleteButton);
|
||||
|
||||
expect(
|
||||
await screen.findByText("프로젝트 삭제 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요."),
|
||||
await screen.findByText(
|
||||
"An error occurred while deleting the project. Please try again later.",
|
||||
),
|
||||
).toBeTruthy();
|
||||
|
||||
// 삭제 실패이므로 여전히 목록에 남아 있어야 한다.
|
||||
@@ -780,18 +789,25 @@ describe("ProjectsPage - 프로젝트 목록", () => {
|
||||
expect(await screen.findByText("성공 프로젝트")).toBeTruthy();
|
||||
expect(await screen.findByText("실패 프로젝트")).toBeTruthy();
|
||||
|
||||
const checkboxSuccess = screen.getByLabelText("성공 프로젝트 선택");
|
||||
const checkboxFail = screen.getByLabelText("실패 프로젝트 선택");
|
||||
const successRow = (await screen.findByText("성공 프로젝트")).closest("tr") as HTMLElement | null;
|
||||
const failRow = (await screen.findByText("실패 프로젝트")).closest("tr") as HTMLElement | null;
|
||||
expect(successRow).not.toBeNull();
|
||||
expect(failRow).not.toBeNull();
|
||||
|
||||
fireEvent.click(checkboxSuccess);
|
||||
fireEvent.click(checkboxFail);
|
||||
const checkboxSuccess = successRow!.querySelector("input[type='checkbox']") as HTMLInputElement | null;
|
||||
const checkboxFail = failRow!.querySelector("input[type='checkbox']") as HTMLInputElement | null;
|
||||
expect(checkboxSuccess).not.toBeNull();
|
||||
expect(checkboxFail).not.toBeNull();
|
||||
|
||||
const bulkDeleteButton = screen.getByText("선택 삭제");
|
||||
fireEvent.click(checkboxSuccess!);
|
||||
fireEvent.click(checkboxFail!);
|
||||
|
||||
const bulkDeleteButton = screen.getByText("Delete selected");
|
||||
fireEvent.click(bulkDeleteButton);
|
||||
|
||||
expect(
|
||||
await screen.findByText(
|
||||
"일부 프로젝트 삭제에 실패했습니다. 페이지를 새로고침한 뒤 목록을 확인해 주세요.",
|
||||
"Failed to delete some projects. Please refresh and review the list.",
|
||||
),
|
||||
).toBeTruthy();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user