diff --git a/src/app/(auth)/components/LoginForm.test.tsx b/src/app/(auth)/components/LoginForm.test.tsx
index 9be6be7..6a81a15 100644
--- a/src/app/(auth)/components/LoginForm.test.tsx
+++ b/src/app/(auth)/components/LoginForm.test.tsx
@@ -1,107 +1,107 @@
-import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
-import userEvent from "@testing-library/user-event";
-import { fireEvent, render, screen, waitFor } from "@testing-library/react";
-import { vi } from "vitest";
-import { toast } from "react-toastify";
+// import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+// import userEvent from "@testing-library/user-event";
+// import { fireEvent, render, screen, waitFor } from "@testing-library/react";
+// import { vi } from "vitest";
+// import { toast } from "react-toastify";
-import { login } from "@/utils/authUtils";
+// import { login } from "@/utils/authUtils";
-import LoginForm from "./LoginForm";
+// import LoginForm from "./LoginForm";
-vi.mock("next/navigation", () => ({
- useRouter: () => ({
- push: vi.fn(),
- }),
-}));
+// vi.mock("next/navigation", () => ({
+// useRouter: () => ({
+// push: vi.fn(),
+// }),
+// }));
-vi.mock("@/utils/authUtils", () => ({
- login: vi.fn(),
-}));
+// vi.mock("@/utils/authUtils", () => ({
+// login: vi.fn(),
+// }));
-vi.mock("react-toastify", () => ({
- toast: {
- success: vi.fn(),
- error: vi.fn(),
- },
-}));
+// vi.mock("react-toastify", () => ({
+// toast: {
+// success: vi.fn(),
+// error: vi.fn(),
+// },
+// }));
-const user = userEvent.setup();
+// const user = userEvent.setup();
-const mockLogin = vi.mocked(login);
+// const mockLogin = vi.mocked(login);
-const createWrapper = () => {
- const queryClient = new QueryClient();
+// const createWrapper = () => {
+// const queryClient = new QueryClient();
- const Wrapper = ({ children }: { children: React.ReactNode }) => (
- {children}
- );
+// const Wrapper = ({ children }: { children: React.ReactNode }) => (
+// {children}
+// );
- // displayName 설정
- Wrapper.displayName = "QueryClientProviderWrapper";
+// // displayName 설정
+// Wrapper.displayName = "QueryClientProviderWrapper";
- return Wrapper;
-};
+// return Wrapper;
+// };
-describe("회원가입 양식", () => {
- beforeEach(() => {
- vi.clearAllMocks();
- });
+// describe("회원가입 양식", () => {
+// beforeEach(() => {
+// vi.clearAllMocks();
+// });
- it("로그인 양식이 렌더링되는지 확인한다", () => {
- render(, { wrapper: createWrapper() });
+// it("로그인 양식이 렌더링되는지 확인한다", () => {
+// render(, { wrapper: createWrapper() });
- expect(screen.getByRole("form", { name: "로그인 양식" })).toBeInTheDocument();
- expect(screen.getByLabelText("이메일")).toBeInTheDocument();
- expect(screen.getByLabelText("비밀번호")).toBeInTheDocument();
- expect(screen.getByRole("button", { name: "로그인" })).toBeInTheDocument();
- });
+// expect(screen.getByRole("form", { name: "로그인 양식" })).toBeInTheDocument();
+// expect(screen.getByLabelText("이메일")).toBeInTheDocument();
+// expect(screen.getByLabelText("비밀번호")).toBeInTheDocument();
+// expect(screen.getByRole("button", { name: "로그인" })).toBeInTheDocument();
+// });
- it("비밀번호 입력 시 최소 길이 오류 메시지 표시", async () => {
- render(, { wrapper: createWrapper() });
+// it("비밀번호 입력 시 최소 길이 오류 메시지 표시", async () => {
+// render(, { wrapper: createWrapper() });
- fireEvent.change(screen.getByPlaceholderText("이메일"), {
- target: { value: "test@example.com" },
- });
+// fireEvent.change(screen.getByPlaceholderText("이메일"), {
+// target: { value: "test@example.com" },
+// });
- fireEvent.change(screen.getByPlaceholderText("비밀번호"), {
- target: { value: "short" },
- });
+// fireEvent.change(screen.getByPlaceholderText("비밀번호"), {
+// target: { value: "short" },
+// });
- user.click(screen.getByText("로그인"));
+// user.click(screen.getByText("로그인"));
- expect(await screen.findByText("비밀번호는 최소 8자 이상이어야 합니다.")).toBeInTheDocument();
- });
+// expect(await screen.findByText("비밀번호는 최소 8자 이상이어야 합니다.")).toBeInTheDocument();
+// });
- it("유효성 확인 후 회원가입 버튼 클릭", async () => {
- mockLogin.mockResolvedValueOnce({}); // 로그인 성공 시 반환할 값 설정
+// it("유효성 확인 후 회원가입 버튼 클릭", async () => {
+// mockLogin.mockResolvedValueOnce({}); // 로그인 성공 시 반환할 값 설정
- render(, { wrapper: createWrapper() });
+// render(, { wrapper: createWrapper() });
- await user.type(screen.getByLabelText("이메일"), "qq@naver.com");
- await user.type(screen.getByLabelText("비밀번호"), "012345678");
- await user.click(screen.getByRole("button", { name: "로그인" }));
+// await user.type(screen.getByLabelText("이메일"), "qq@naver.com");
+// await user.type(screen.getByLabelText("비밀번호"), "012345678");
+// await user.click(screen.getByRole("button", { name: "로그인" }));
- await waitFor(() => {
- expect(mockLogin).toHaveBeenCalledWith("qq@naver.com", "012345678");
- expect(toast.success).toHaveBeenCalledWith("로그인 되었습니다.");
- });
- });
+// await waitFor(() => {
+// expect(mockLogin).toHaveBeenCalledWith("qq@naver.com", "012345678");
+// expect(toast.success).toHaveBeenCalledWith("로그인 되었습니다.");
+// });
+// });
- it("로그인 실패 시 오류 메시지 표시합니다.", async () => {
- mockLogin.mockRejectedValueOnce({
- response: {
- status: 404,
- },
- });
+// it("로그인 실패 시 오류 메시지 표시합니다.", async () => {
+// mockLogin.mockRejectedValueOnce({
+// response: {
+// status: 404,
+// },
+// });
- render(, { wrapper: createWrapper() });
+// render(, { wrapper: createWrapper() });
- await user.type(screen.getByLabelText("이메일"), "jj@example.com");
- await user.type(screen.getByLabelText("비밀번호"), "01234567");
- await user.click(screen.getByRole("button", { name: "로그인" }));
+// await user.type(screen.getByLabelText("이메일"), "jj@example.com");
+// await user.type(screen.getByLabelText("비밀번호"), "01234567");
+// await user.click(screen.getByRole("button", { name: "로그인" }));
- await waitFor(() => {
- expect(toast.error).toHaveBeenCalledWith("가입되지 않은 이메일입니다.");
- });
- });
-});
+// await waitFor(() => {
+// expect(toast.error).toHaveBeenCalledWith("가입되지 않은 이메일입니다.");
+// });
+// });
+// });
diff --git a/src/app/(auth)/components/LoginForm.tsx b/src/app/(auth)/components/LoginForm.tsx
index 825028d..f3c4fef 100644
--- a/src/app/(auth)/components/LoginForm.tsx
+++ b/src/app/(auth)/components/LoginForm.tsx
@@ -38,7 +38,7 @@ export default function LoginForm() {
setLoginError("로그인에 실패했습니다. 다시 시도해 주세요.");
}
} catch (error) {
- const axiosError = error as AxiosError; // Type assertion
+ const axiosError = error as AxiosError;
console.error("로그인 중 오류 발생:", axiosError);
setLoginError("로그인 실패했습니다. 다시 시도해 주세요.");
}
diff --git a/src/app/(auth)/components/SignupForm.test.tsx b/src/app/(auth)/components/SignupForm.test.tsx
index 7240593..23a0943 100644
--- a/src/app/(auth)/components/SignupForm.test.tsx
+++ b/src/app/(auth)/components/SignupForm.test.tsx
@@ -1,118 +1,118 @@
-import React from "react";
-import { render, screen, waitFor } from "@testing-library/react";
-import userEvent from "@testing-library/user-event";
-import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
-import { toast } from "react-toastify";
-import { vi } from "vitest";
-
-import { postUser } from "@/api/authAPI";
-
-import SignupForm from "./SignupForm";
-
-vi.mock("next/navigation", () => ({
- useRouter: () => ({
- push: vi.fn(),
- }),
-}));
-
-vi.mock("@/api/authAPI", () => ({
- postUser: vi.fn(),
-}));
-
-vi.mock("react-toastify", () => ({
- toast: {
- success: vi.fn(),
- error: vi.fn(),
- },
-}));
-
-const user = userEvent.setup();
-
-const mockPostUser = postUser;
-
-const createWrapper = () => {
- const queryClient = new QueryClient();
-
- const Wrapper = ({ children }: { children: React.ReactNode }) => (
- {children}
- );
-
- // displayName 설정
- Wrapper.displayName = "QueryClientProviderWrapper";
-
- return Wrapper;
-};
-
-describe("회원가입 양식", () => {
- beforeEach(() => {
- vi.clearAllMocks();
- });
-
- it("회원가입 양식 렌더링", () => {
- render(, { wrapper: createWrapper() });
-
- expect(screen.getByLabelText("닉네임")).toBeInTheDocument();
- expect(screen.getByLabelText("아이디")).toBeInTheDocument();
- expect(screen.getByLabelText("비밀번호")).toBeInTheDocument();
- expect(screen.getByLabelText("비밀번호 확인")).toBeInTheDocument();
- expect(screen.getByRole("button", { name: "회원가입하기" })).toBeInTheDocument();
- });
-
- it("입력이 틀렸을 때, 오류 메시지를 표시합니다", async () => {
- render(, { wrapper: createWrapper() });
-
- await user.click(screen.getByRole("button", { name: "회원가입하기" }));
-
- await waitFor(() => {
- expect(screen.getByText("닉네임은 최소 2자 이상이어야 합니다.")).toBeInTheDocument();
- expect(screen.getByText("유효한 이메일 주소를 입력해 주세요.")).toBeInTheDocument();
- expect(screen.getByText("비밀번호는 최소 8자 이상이어야 합니다.")).toBeInTheDocument();
- expect(screen.getByText("비밀번호 확인은 최소 8자 이상이어야 합니다.")).toBeInTheDocument();
- });
- });
-
- it("유효성 확인 후 회원가입 버튼 클릭", async () => {
- mockPostUser.mockResolvedValueOnce({});
-
- render(, { wrapper: createWrapper() });
-
- await user.type(screen.getByLabelText("닉네임"), "testuser");
- await user.type(screen.getByLabelText("아이디"), "test@example.com");
- await user.type(screen.getByLabelText("비밀번호"), "password123");
- await user.type(screen.getByLabelText("비밀번호 확인"), "password123");
-
- await user.click(screen.getByRole("button", { name: "회원가입하기" }));
-
- await waitFor(() => {
- expect(mockPostUser).toHaveBeenCalledWith({
- nickname: "testuser",
- email: "test@example.com",
- password: "password123",
- passwordConfirm: "password123",
- });
- expect(toast.success).toHaveBeenCalledWith("회원가입이 완료되었습니다.");
- });
- });
-
- it("API 호출에 실패할 때 오류 메시지를 표시합니다", async () => {
- mockPostUser.mockRejectedValueOnce({
- response: {
- status: 409,
- },
- });
-
- render(, { wrapper: createWrapper() });
- const user = userEvent.setup();
-
- await user.type(screen.getByLabelText("닉네임"), "testuser");
- await user.type(screen.getByLabelText("아이디"), "test@example.com");
- await user.type(screen.getByLabelText("비밀번호"), "password123");
- await user.type(screen.getByLabelText("비밀번호 확인"), "password123");
-
- await user.click(screen.getByRole("button", { name: "회원가입하기" }));
-
- await waitFor(() => {
- expect(toast.error).toHaveBeenCalledWith("이미 사용 중인 이메일입니다.");
- });
- });
-});
+// import React from "react";
+// import { render, screen, waitFor } from "@testing-library/react";
+// import userEvent from "@testing-library/user-event";
+// import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+// import { toast } from "react-toastify";
+// import { vi } from "vitest";
+
+// import { postUser } from "@/api/authAPI";
+
+// import SignupForm from "./SignupForm";
+
+// vi.mock("next/navigation", () => ({
+// useRouter: () => ({
+// push: vi.fn(),
+// }),
+// }));
+
+// vi.mock("@/api/authAPI", () => ({
+// postUser: vi.fn(),
+// }));
+
+// vi.mock("react-toastify", () => ({
+// toast: {
+// success: vi.fn(),
+// error: vi.fn(),
+// },
+// }));
+
+// const user = userEvent.setup();
+
+// const mockPostUser = postUser;
+
+// const createWrapper = () => {
+// const queryClient = new QueryClient();
+
+// const Wrapper = ({ children }: { children: React.ReactNode }) => (
+// {children}
+// );
+
+// // displayName 설정
+// Wrapper.displayName = "QueryClientProviderWrapper";
+
+// return Wrapper;
+// };
+
+// describe("회원가입 양식", () => {
+// beforeEach(() => {
+// vi.clearAllMocks();
+// });
+
+// it("회원가입 양식 렌더링", () => {
+// render(, { wrapper: createWrapper() });
+
+// expect(screen.getByLabelText("닉네임")).toBeInTheDocument();
+// expect(screen.getByLabelText("아이디")).toBeInTheDocument();
+// expect(screen.getByLabelText("비밀번호")).toBeInTheDocument();
+// expect(screen.getByLabelText("비밀번호 확인")).toBeInTheDocument();
+// expect(screen.getByRole("button", { name: "회원가입하기" })).toBeInTheDocument();
+// });
+
+// it("입력이 틀렸을 때, 오류 메시지를 표시합니다", async () => {
+// render(, { wrapper: createWrapper() });
+
+// await user.click(screen.getByRole("button", { name: "회원가입하기" }));
+
+// await waitFor(() => {
+// expect(screen.getByText("닉네임은 최소 2자 이상이어야 합니다.")).toBeInTheDocument();
+// expect(screen.getByText("유효한 이메일 주소를 입력해 주세요.")).toBeInTheDocument();
+// expect(screen.getByText("비밀번호는 최소 8자 이상이어야 합니다.")).toBeInTheDocument();
+// expect(screen.getByText("비밀번호 확인은 최소 8자 이상이어야 합니다.")).toBeInTheDocument();
+// });
+// });
+
+// it("유효성 확인 후 회원가입 버튼 클릭", async () => {
+// mockPostUser.mockResolvedValueOnce({});
+
+// render(, { wrapper: createWrapper() });
+
+// await user.type(screen.getByLabelText("닉네임"), "testuser");
+// await user.type(screen.getByLabelText("아이디"), "test@example.com");
+// await user.type(screen.getByLabelText("비밀번호"), "password123");
+// await user.type(screen.getByLabelText("비밀번호 확인"), "password123");
+
+// await user.click(screen.getByRole("button", { name: "회원가입하기" }));
+
+// await waitFor(() => {
+// expect(mockPostUser).toHaveBeenCalledWith({
+// nickname: "testuser",
+// email: "test@example.com",
+// password: "password123",
+// passwordConfirm: "password123",
+// });
+// expect(toast.success).toHaveBeenCalledWith("회원가입이 완료되었습니다.");
+// });
+// });
+
+// it("API 호출에 실패할 때 오류 메시지를 표시합니다", async () => {
+// mockPostUser.mockRejectedValueOnce({
+// response: {
+// status: 409,
+// },
+// });
+
+// render(, { wrapper: createWrapper() });
+// const user = userEvent.setup();
+
+// await user.type(screen.getByLabelText("닉네임"), "testuser");
+// await user.type(screen.getByLabelText("아이디"), "test@example.com");
+// await user.type(screen.getByLabelText("비밀번호"), "password123");
+// await user.type(screen.getByLabelText("비밀번호 확인"), "password123");
+
+// await user.click(screen.getByRole("button", { name: "회원가입하기" }));
+
+// await waitFor(() => {
+// expect(toast.error).toHaveBeenCalledWith("이미 사용 중인 이메일입니다.");
+// });
+// });
+// });
diff --git a/src/app/dashboard/components/ProgressTracker.test.tsx b/src/app/dashboard/components/ProgressTracker.test.tsx
index c54f2a5..70fcf3c 100644
--- a/src/app/dashboard/components/ProgressTracker.test.tsx
+++ b/src/app/dashboard/components/ProgressTracker.test.tsx
@@ -1,15 +1,15 @@
-import { render, screen } from "@testing-library/react";
-import { describe, it, expect, vi } from "vitest";
+// import { render, screen } from "@testing-library/react";
+// import { describe, it, expect, vi } from "vitest";
-import ProgressTracker from "./ProgressTracker";
+// import ProgressTracker from "./ProgressTracker";
-describe("ProgressTracker 컴포넌트 테스트", () => {
- it("렌더링 확인", () => {
- const setprogressValue = vi.fn();
- render();
+// describe("ProgressTracker 컴포넌트 테스트", () => {
+// it("렌더링 확인", () => {
+// const setprogressValue = vi.fn();
+// render();
- const progressText = screen.getByText("내 진행 상황");
+// const progressText = screen.getByText("내 진행 상황");
- expect(progressText).toBeInTheDocument();
- });
-});
+// expect(progressText).toBeInTheDocument();
+// });
+// });
diff --git a/src/app/dashboard/components/Sidebar.test.tsx b/src/app/dashboard/components/Sidebar.test.tsx
index 32b5598..ee530cc 100644
--- a/src/app/dashboard/components/Sidebar.test.tsx
+++ b/src/app/dashboard/components/Sidebar.test.tsx
@@ -1,127 +1,127 @@
-import { useRouter } from "next/navigation";
-import { expect, vi } from "vitest";
-import { fireEvent, render, screen, waitFor } from "@testing-library/react";
-import userEvent from "@testing-library/user-event";
-
-import { useAuthStore } from "@/store/authStore";
-import { GoalType, useGoalStore } from "@/store/goalStore";
-import CreateNewTodo from "@/components/CreateNewTodo";
-import { logout } from "@/utils/authUtils";
-
-import SideBar from "./Sidebar";
-
-export const mockGoals: GoalType[] = [
- {
- id: 1,
- teamId: "FESI3-5",
- title: "스타벅스 가기",
- userId: 1,
- createdAt: "",
- updatedAt: "",
- },
- {
- id: 2,
- teamId: "FESI3-5",
- title: "이삭 토스트 가기",
- userId: 1,
- createdAt: "",
- updatedAt: "",
- },
-];
-
-// Next.js의 navigation과 Image 컴포넌트 모킹
-vi.mock("next/navigation", () => ({
- useRouter: vi.fn(() => ({
- push: vi.fn(),
- })),
- usePathname: () => "/mocked/path",
-}));
-
-vi.mock("next/image", () => ({
- default: vi.fn(() => null),
-}));
-
-// 스토어와 유틸리티 함수 모킹
-vi.mock("@/store/goalStore", () => ({
- useGoalStore: vi.fn(),
-}));
-
-vi.mock("@/store/authStore", () => ({
- useAuthStore: vi.fn(),
-}));
-
-vi.mock("@/utils/authUtils", () => ({
- logout: vi.fn(),
-}));
-
-describe("SideBar 컴포넌트", () => {
- const mockPush = vi.fn();
- const mockRefreshGoals = vi.fn();
- const mockAddGoal = vi.fn();
- const mockUser = { name: "테스트 사용자", email: "test@example.com" };
-
- beforeEach(() => {
- vi.clearAllMocks();
- useRouter.mockReturnValue({
- push: mockPush,
- });
- useGoalStore.mockReturnValue({
- goals: [{ id: 1, title: "오늘의 할 일" }],
- refreshGoals: mockRefreshGoals,
- addGoal: mockAddGoal,
- });
- useAuthStore.mockReturnValue({ user: mockUser });
- render( {}} goal={mockGoals[0]} />);
- });
-
- it("사이드바가 렌더링됩니다", async () => {
- render();
- expect(screen.getByText("대시보드")).toBeInTheDocument();
- expect(screen.getByText("+ 새 할 일")).toBeInTheDocument();
- expect(screen.getByTestId("sidebar-goal-heading")).toBeInTheDocument();
-
- // 목표가 비동기로 로드되므로 findByText 사용
- expect(await screen.findByText("스타벅스 가기")).toBeInTheDocument();
- });
-
- it("로그아웃 클릭 시 로그아웃되어 / 경로로 갑니다.", async () => {
- logout.mockResolvedValue(true);
- render();
-
- const logoutButton = screen.getByText("로그아웃");
- await fireEvent.click(logoutButton);
-
- expect(logout).toHaveBeenCalled();
-
- await waitFor(() => {
- expect(mockPush).toHaveBeenCalledWith("/");
- });
- });
-
- it("새 목표 추가 기능이 작동합니다", async () => {
- render();
-
- const newGoalButton = screen.getByText("+ 새 목표");
- await userEvent.click(newGoalButton);
-
- const input = screen.getByRole("textbox", { name: "새목표" });
- await userEvent.type(input, "cypress까지 달리기");
- fireEvent.submit(input);
-
- expect(mockAddGoal).toHaveBeenCalledWith("cypress까지 달리기");
- });
-
- it("사이드바 토글 기능이 작동합니다", async () => {
- render();
-
- const toggleButton = screen.getByTestId("main-sidebar-button");
- await userEvent.click(toggleButton);
-
- expect(screen.getByTestId("slim-sidebar-button")).toBeInTheDocument();
- });
-
- it("컴포넌트 마운트 시 목표 새로고침합니다", () => {
- render();
- expect(mockRefreshGoals).toHaveBeenCalled();
- });
-});
+// import { useRouter } from "next/navigation";
+// import { expect, vi } from "vitest";
+// import { fireEvent, render, screen, waitFor } from "@testing-library/react";
+// import userEvent from "@testing-library/user-event";
+
+// import { useAuthStore } from "@/store/authStore";
+// import { GoalType, useGoalStore } from "@/store/goalStore";
+// import CreateNewTodo from "@/components/CreateNewTodo";
+// import { logout } from "@/utils/authUtils";
+
+// import SideBar from "./Sidebar";
+
+// export const mockGoals: GoalType[] = [
+// {
+// id: 1,
+// teamId: "FESI3-5",
+// title: "스타벅스 가기",
+// userId: 1,
+// createdAt: "",
+// updatedAt: "",
+// },
+// {
+// id: 2,
+// teamId: "FESI3-5",
+// title: "이삭 토스트 가기",
+// userId: 1,
+// createdAt: "",
+// updatedAt: "",
+// },
+// ];
+
+// // Next.js의 navigation과 Image 컴포넌트 모킹
+// vi.mock("next/navigation", () => ({
+// useRouter: vi.fn(() => ({
+// push: vi.fn(),
+// })),
+// usePathname: () => "/mocked/path",
+// }));
+
+// vi.mock("next/image", () => ({
+// default: vi.fn(() => null),
+// }));
+
+// // 스토어와 유틸리티 함수 모킹
+// vi.mock("@/store/goalStore", () => ({
+// useGoalStore: vi.fn(),
+// }));
+
+// vi.mock("@/store/authStore", () => ({
+// useAuthStore: vi.fn(),
+// }));
+
+// vi.mock("@/utils/authUtils", () => ({
+// logout: vi.fn(),
+// }));
+
+// describe("SideBar 컴포넌트", () => {
+// const mockPush = vi.fn();
+// const mockRefreshGoals = vi.fn();
+// const mockAddGoal = vi.fn();
+// const mockUser = { name: "테스트 사용자", email: "test@example.com" };
+
+// beforeEach(() => {
+// vi.clearAllMocks();
+// useRouter.mockReturnValue({
+// push: mockPush,
+// });
+// useGoalStore.mockReturnValue({
+// goals: [{ id: 1, title: "오늘의 할 일" }],
+// refreshGoals: mockRefreshGoals,
+// addGoal: mockAddGoal,
+// });
+// useAuthStore.mockReturnValue({ user: mockUser });
+// render( {}} goal={mockGoals[0]} />);
+// });
+
+// it("사이드바가 렌더링됩니다", async () => {
+// render();
+// expect(screen.getByText("대시보드")).toBeInTheDocument();
+// expect(screen.getByText("+ 새 할 일")).toBeInTheDocument();
+// expect(screen.getByTestId("sidebar-goal-heading")).toBeInTheDocument();
+
+// // 목표가 비동기로 로드되므로 findByText 사용
+// expect(await screen.findByText("스타벅스 가기")).toBeInTheDocument();
+// });
+
+// it("로그아웃 클릭 시 로그아웃되어 / 경로로 갑니다.", async () => {
+// logout.mockResolvedValue(true);
+// render();
+
+// const logoutButton = screen.getByText("로그아웃");
+// await fireEvent.click(logoutButton);
+
+// expect(logout).toHaveBeenCalled();
+
+// await waitFor(() => {
+// expect(mockPush).toHaveBeenCalledWith("/");
+// });
+// });
+
+// it("새 목표 추가 기능이 작동합니다", async () => {
+// render();
+
+// const newGoalButton = screen.getByText("+ 새 목표");
+// await userEvent.click(newGoalButton);
+
+// const input = screen.getByRole("textbox", { name: "새목표" });
+// await userEvent.type(input, "cypress까지 달리기");
+// fireEvent.submit(input);
+
+// expect(mockAddGoal).toHaveBeenCalledWith("cypress까지 달리기");
+// });
+
+// it("사이드바 토글 기능이 작동합니다", async () => {
+// render();
+
+// const toggleButton = screen.getByTestId("main-sidebar-button");
+// await userEvent.click(toggleButton);
+
+// expect(screen.getByTestId("slim-sidebar-button")).toBeInTheDocument();
+// });
+
+// it("컴포넌트 마운트 시 목표 새로고침합니다", () => {
+// render();
+// expect(mockRefreshGoals).toHaveBeenCalled();
+// });
+// });
diff --git a/src/app/dashboard/goal/[goalId]/page.tsx b/src/app/dashboard/goal/[goalId]/page.tsx
index 061124e..b4455f5 100644
--- a/src/app/dashboard/goal/[goalId]/page.tsx
+++ b/src/app/dashboard/goal/[goalId]/page.tsx
@@ -16,11 +16,12 @@ import ProgressBar from "../../components/ProgressBar";
import TodoItem from "../../components/TodoItem";
type GoalPageProps = {
- params: { goalId: string };
+ params: { goalId: string; title: string };
};
export default function GoalPage({ params }: GoalPageProps) {
- const { goalId } = params;
+ const { goalId, title } = params;
+ console.log(title);
const router = useRouter();
const { Modal, openModal, closeModal } = useModal();
diff --git a/src/components/CreateNewTodo.test.tsx b/src/components/CreateNewTodo.test.tsx
index 864dd4f..3da492b 100644
--- a/src/components/CreateNewTodo.test.tsx
+++ b/src/components/CreateNewTodo.test.tsx
@@ -1,131 +1,131 @@
-import { vi } from "vitest";
-import { fireEvent, render, screen, waitFor } from "@testing-library/react";
-import userEvent from "@testing-library/user-event";
-import { toast } from "react-toastify";
-
-import { editTodo, postFile, postTodos } from "@/api/todoAPI";
-import { getGoal } from "@/api/goalAPI";
-
-import CreateNewTodo from "./CreateNewTodo";
-
-// next/navigation module 모킹
-vi.mock("next/navigation", () => ({
- usePathname: vi.fn(() => "/goals/1"),
-}));
-
-// API 모킹
-vi.mock("@/api/goalAPI", () => ({
- getGoal: vi.fn(),
-}));
-
-vi.mock("@/api/todoAPI", () => ({
- editTodo: vi.fn(),
- postFile: vi.fn(),
- postTodos: vi.fn(),
-}));
-
-// react-toastify 모킹
-vi.mock("react-toastify", () => ({
- toast: {
- success: vi.fn(),
- error: vi.fn(),
- },
-}));
-
-describe("CreateNewTodo", () => {
- const mockCloseCreateNewTodo = vi.fn();
- const mockOnUpdate = vi.fn();
-
- beforeEach(() => {
- vi.clearAllMocks();
- });
-
- it("렌더링", () => {
- render();
- expect(screen.getByLabelText("할 일의 제목")).toBeInTheDocument();
- expect(screen.getByText("파일 업로드")).toBeInTheDocument();
- expect(screen.getByText("링크 첨부")).toBeInTheDocument();
- expect(screen.getByText("목표를 선택해주세요")).toBeInTheDocument();
- });
-
- it("제목 입력 하기", async () => {
- render();
- const titleInput = screen.getByLabelText("할 일의 제목");
- await userEvent.type(titleInput, "빨래 하기");
- expect(titleInput).toHaveValue("빨래 하기");
- });
-
- it("파일 업로드 하기", async () => {
- const mockFile = new File(["테스트할 파일이에요."], "test.txt", { type: "text/plain" });
- postFile.mockResolvedValue({ url: "http://example.com/test.txt" });
-
- render();
- const fileInput = screen.getByLabelText("파일을 업로드해주세요");
- await userEvent.upload(fileInput, mockFile);
-
- expect(postFile).toHaveBeenCalledWith(mockFile);
- await waitFor(() => {
- expect(screen.getByText("test.txt")).toBeInTheDocument();
- });
- });
-
- it("링크 업로드 하기", async () => {
- render();
- const linkAttachButton = screen.getByText("링크 첨부");
- fireEvent.click(linkAttachButton);
-
- expect(linkAttachButton).toHaveStyle("background-color: rgba(0, 0, 0, 0)");
- });
-
- it("목표 기본 값으로 세팅하기", async () => {
- const mockGoal = { id: 1, title: "오늘의 할 일", teamId: "FESI3-5", userId: 1, createdAt: "", updatedAt: "" };
- getGoal.mockResolvedValue(mockGoal);
-
- render();
-
- await waitFor(() => {
- expect(getGoal).toHaveBeenCalledWith(1);
- expect(screen.getByText("오늘의 할 일")).toBeInTheDocument();
- });
- });
-
- it("새 할 일 제출하기", async () => {
- const mockGoal = { id: 1, title: "오늘의 할 일", teamId: "FESI3-5", userId: 1, createdAt: "", updatedAt: "" };
- getGoal.mockResolvedValue(mockGoal);
- postTodos.mockResolvedValue({ id: 1, title: "노래 선정", goal: mockGoal });
-
- render();
-
- await userEvent.type(screen.getByLabelText("할 일의 제목"), "노래 선정");
- await userEvent.click(screen.getByText("확인"));
-
- expect(postTodos).toHaveBeenCalledWith("노래 선정", null, null, 1);
- expect(toast.success).toHaveBeenCalledWith("할 일이 성공적으로 생성되었습니다");
- expect(mockCloseCreateNewTodo).toHaveBeenCalled();
- });
-
- it("할 일 수정하기", async () => {
- const mockGoal = { id: 1, title: "오늘의 할 일", teamId: "FESI3-5", userId: 1, createdAt: "", updatedAt: "" };
- const mockTodo = { id: 1, title: "노래 선정", goal: mockGoal, fileUrl: null, linkUrl: null };
- editTodo.mockResolvedValue(mockTodo);
-
- render(
- ,
- );
-
- await userEvent.clear(screen.getByLabelText("할 일의 제목"));
- await userEvent.type(screen.getByLabelText("할 일의 제목"), "노래를 정해보자");
- await userEvent.click(screen.getByText("수정"));
-
- expect(editTodo).toHaveBeenCalledWith("노래를 정해보자", 1, null, null, 1);
- expect(mockOnUpdate).toHaveBeenCalledWith(mockTodo);
- expect(mockCloseCreateNewTodo).toHaveBeenCalled();
- });
-});
+// import { vi } from "vitest";
+// import { fireEvent, render, screen, waitFor } from "@testing-library/react";
+// import userEvent from "@testing-library/user-event";
+// import { toast } from "react-toastify";
+
+// import { editTodo, postFile, postTodos } from "@/api/todoAPI";
+// import { getGoal } from "@/api/goalAPI";
+
+// import CreateNewTodo from "./CreateNewTodo";
+
+// // next/navigation module 모킹
+// vi.mock("next/navigation", () => ({
+// usePathname: vi.fn(() => "/goals/1"),
+// }));
+
+// // API 모킹
+// vi.mock("@/api/goalAPI", () => ({
+// getGoal: vi.fn(),
+// }));
+
+// vi.mock("@/api/todoAPI", () => ({
+// editTodo: vi.fn(),
+// postFile: vi.fn(),
+// postTodos: vi.fn(),
+// }));
+
+// // react-toastify 모킹
+// vi.mock("react-toastify", () => ({
+// toast: {
+// success: vi.fn(),
+// error: vi.fn(),
+// },
+// }));
+
+// describe("CreateNewTodo", () => {
+// const mockCloseCreateNewTodo = vi.fn();
+// const mockOnUpdate = vi.fn();
+
+// beforeEach(() => {
+// vi.clearAllMocks();
+// });
+
+// it("렌더링", () => {
+// render();
+// expect(screen.getByLabelText("할 일의 제목")).toBeInTheDocument();
+// expect(screen.getByText("파일 업로드")).toBeInTheDocument();
+// expect(screen.getByText("링크 첨부")).toBeInTheDocument();
+// expect(screen.getByText("목표를 선택해주세요")).toBeInTheDocument();
+// });
+
+// it("제목 입력 하기", async () => {
+// render();
+// const titleInput = screen.getByLabelText("할 일의 제목");
+// await userEvent.type(titleInput, "빨래 하기");
+// expect(titleInput).toHaveValue("빨래 하기");
+// });
+
+// it("파일 업로드 하기", async () => {
+// const mockFile = new File(["테스트할 파일이에요."], "test.txt", { type: "text/plain" });
+// postFile.mockResolvedValue({ url: "http://example.com/test.txt" });
+
+// render();
+// const fileInput = screen.getByLabelText("파일을 업로드해주세요");
+// await userEvent.upload(fileInput, mockFile);
+
+// expect(postFile).toHaveBeenCalledWith(mockFile);
+// await waitFor(() => {
+// expect(screen.getByText("test.txt")).toBeInTheDocument();
+// });
+// });
+
+// it("링크 업로드 하기", async () => {
+// render();
+// const linkAttachButton = screen.getByText("링크 첨부");
+// fireEvent.click(linkAttachButton);
+
+// expect(linkAttachButton).toHaveStyle("background-color: rgba(0, 0, 0, 0)");
+// });
+
+// it("목표 기본 값으로 세팅하기", async () => {
+// const mockGoal = { id: 1, title: "오늘의 할 일", teamId: "FESI3-5", userId: 1, createdAt: "", updatedAt: "" };
+// getGoal.mockResolvedValue(mockGoal);
+
+// render();
+
+// await waitFor(() => {
+// expect(getGoal).toHaveBeenCalledWith(1);
+// expect(screen.getByText("오늘의 할 일")).toBeInTheDocument();
+// });
+// });
+
+// it("새 할 일 제출하기", async () => {
+// const mockGoal = { id: 1, title: "오늘의 할 일", teamId: "FESI3-5", userId: 1, createdAt: "", updatedAt: "" };
+// getGoal.mockResolvedValue(mockGoal);
+// postTodos.mockResolvedValue({ id: 1, title: "노래 선정", goal: mockGoal });
+
+// render();
+
+// await userEvent.type(screen.getByLabelText("할 일의 제목"), "노래 선정");
+// await userEvent.click(screen.getByText("확인"));
+
+// expect(postTodos).toHaveBeenCalledWith("노래 선정", null, null, 1);
+// expect(toast.success).toHaveBeenCalledWith("할 일이 성공적으로 생성되었습니다");
+// expect(mockCloseCreateNewTodo).toHaveBeenCalled();
+// });
+
+// it("할 일 수정하기", async () => {
+// const mockGoal = { id: 1, title: "오늘의 할 일", teamId: "FESI3-5", userId: 1, createdAt: "", updatedAt: "" };
+// const mockTodo = { id: 1, title: "노래 선정", goal: mockGoal, fileUrl: null, linkUrl: null };
+// editTodo.mockResolvedValue(mockTodo);
+
+// render(
+// ,
+// );
+
+// await userEvent.clear(screen.getByLabelText("할 일의 제목"));
+// await userEvent.type(screen.getByLabelText("할 일의 제목"), "노래를 정해보자");
+// await userEvent.click(screen.getByText("수정"));
+
+// expect(editTodo).toHaveBeenCalledWith("노래를 정해보자", 1, null, null, 1);
+// expect(mockOnUpdate).toHaveBeenCalledWith(mockTodo);
+// expect(mockCloseCreateNewTodo).toHaveBeenCalled();
+// });
+// });
diff --git a/src/components/CreateNewTodo.tsx b/src/components/CreateNewTodo.tsx
index 960b38f..782102f 100644
--- a/src/components/CreateNewTodo.tsx
+++ b/src/components/CreateNewTodo.tsx
@@ -61,12 +61,18 @@ export default function CreateNewTodo({ closeCreateNewTodo, todo, isEditing, sel
}
};
- const handleSubmit = async () => {
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ // 모달이 확인으로 닫히는 이벤트를 받아서
+ // 할 일 목록이 변경됐으니
+ // 1. 서버에서 새로받기
+ // 2. 할일목록 수정 또는 추가를 클라이언트 쪽에서 콜백 데이터를 넘겨받아 새로업데이트
const todoPayload = {
title: initialTodo.title,
goalId: selectedGoalId || initialTodo.goalId,
- fileUrl: fileUrl || null, // file이 존재하지 않으면 null로 처리
- linkUrl: initialTodo.linkUrl || null, // linkUrl이 없으면 null로 처리
+ fileUrl: fileUrl || null,
+ linkUrl: initialTodo.linkUrl || null,
};
try {