Skip to content

Commit

Permalink
Merge pull request #47 from Selody-project/30-front-task-개인일정-리스트
Browse files Browse the repository at this point in the history
feat: 개인일정 등록 (#30)
  • Loading branch information
97970z authored Jun 4, 2023
2 parents 2f2fc62 + 4ed9117 commit 8a7d5f2
Show file tree
Hide file tree
Showing 24 changed files with 1,294 additions and 231 deletions.
12 changes: 12 additions & 0 deletions __test__/__mocks__/msw/handlers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { rest } from "msw";

const BASE_URL = "http://localhost:8000";

export const handlers = [
rest.post(`${BASE_URL}/api/user/calendar`, (req, res, ctx) => {
return res(
ctx.status(201),
ctx.json({ message: "Successfully create user schedule" }),
);
}),
];
4 changes: 4 additions & 0 deletions __test__/__mocks__/msw/server.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { setupServer } from "msw/node";
import { handlers } from "./handlers.js";

export const server = setupServer(...handlers);
22 changes: 5 additions & 17 deletions __test__/pagesTest/LoginPage.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,29 @@
* @jest-environment jsdom
*/
import React from "react";
import { render, screen } from "@testing-library/react";
import { screen } from "@testing-library/react";
import { render } from "../../jest.setup.js";
import "@testing-library/jest-dom/extend-expect";
import { Provider } from "react-redux";
import { BrowserRouter } from "react-router-dom";
import { GoogleOAuthProvider } from "@react-oauth/google";
import { store } from "../../src/store/store";
import LoginPage from "../../src/pages/LoginPage";

const renderWithReduxAndRouter = (component) =>
render(
<Provider store={store}>
<GoogleOAuthProvider clientId="379597382111-vo2ht0r8a3d0ais7v12q7777lu48al1a.apps.googleusercontent.com">
<BrowserRouter>{component}</BrowserRouter>
</GoogleOAuthProvider>
</Provider>,
);

describe("LoginPage", () => {
// 로그인 페이지 랜더링 테스트
test("renders LoginPage without crashing", () => {
renderWithReduxAndRouter(<LoginPage />);
render(<LoginPage />);
const loginHeader = screen.getByText(/LOGIN/i);
expect(loginHeader).toBeInTheDocument();
});

// 네이버로그인 버튼이 있는지 테스트
test("renders Google login component", () => {
renderWithReduxAndRouter(<LoginPage />);
render(<LoginPage />);
const googleLoginElement = screen.getByTestId("google-login");
expect(googleLoginElement).toBeInTheDocument();
});

// 구글로그인 버튼이 있는지 테스트
test("renders Naver login component", () => {
renderWithReduxAndRouter(<LoginPage />);
render(<LoginPage />);
const naverLoginElement = screen.getByTestId("naver-login");
expect(naverLoginElement).toBeInTheDocument();
});
Expand Down
36 changes: 10 additions & 26 deletions __test__/pagesTest/PersonalSchedulePage.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,24 @@
* @jest-environment jsdom
*/
import React from "react";
import { render, screen, fireEvent } from "@testing-library/react";
import { screen, fireEvent } from "@testing-library/react";
import { render } from "../../jest.setup.js";
import "@testing-library/jest-dom";
import { Provider } from "react-redux";
import { configureStore } from "@reduxjs/toolkit";
import { BrowserRouter } from "react-router-dom";
import userSlice from "../../src/store/user/user-slice";
import PersonalSchedulePage from "../../src/pages/PersonalSchedulePage";

jest.mock("@daypilot/daypilot-lite-react");

const store = configureStore({
reducer: {
user: userSlice,
},
});

const renderWithRedux = (component) =>
render(
<Provider store={store}>
<BrowserRouter>{component}</BrowserRouter>
</Provider>,
);

describe("PersonalSchedulePage", () => {
// PersonalSchedulePage 페이지 랜더링 테스트
// PersonalSchedulePage 페이지 랜더링 테스트
test("renders PersonalSchedulePage without crashing", () => {
renderWithRedux(<PersonalSchedulePage />);
render(<PersonalSchedulePage />);
const mainContainer = screen.getByRole("main");
expect(mainContainer).toBeInTheDocument();
});

// 캘린더 랜더링 테스트
test("renders Calendar component", () => {
renderWithRedux(<PersonalSchedulePage />);
render(<PersonalSchedulePage />);

// Check if the "월간" button is rendered
const monthlyButton = screen.getByText(/월간/i);
Expand All @@ -48,21 +32,21 @@ describe("PersonalSchedulePage", () => {

// 헤더 랜더링 테스트
test("renders Header component", () => {
renderWithRedux(<PersonalSchedulePage />);
render(<PersonalSchedulePage />);
const headerElement = screen.getByRole("banner");
expect(headerElement).toBeInTheDocument();
});

// PersonalTodoList 랜더링 테스트
// PersonalTodoList 랜더링 테스트
test("renders PersonalTodoList component", () => {
renderWithRedux(<PersonalSchedulePage />);
render(<PersonalSchedulePage />);
const personalTodoListElement = screen.getByText(/오늘의 할 일/i);
expect(personalTodoListElement).toBeInTheDocument();
});

// Modal 랜더링 테스트
// Modal 랜더링 테스트
test("renders Modal component", () => {
renderWithRedux(<PersonalSchedulePage />);
render(<PersonalSchedulePage />);
expect(screen.queryByTestId("modal")).toBeNull();

const addEventButton = screen.getByText(/일정추가/i);
Expand Down
22 changes: 2 additions & 20 deletions __test__/pagesTest/SignUpPage.test.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,10 @@
* @jest-environment jsdom
*/
import React from "react";
import { render } from "@testing-library/react";
import { render } from "../../jest.setup.js";
import "@testing-library/jest-dom";
import { Provider } from "react-redux";
import { configureStore } from "@reduxjs/toolkit";
import { BrowserRouter } from "react-router-dom";
import userSlice from "../../src/store/user/user-slice";
import SignUpPage from "../../src/pages/SignUpPage";

const store = configureStore({
reducer: {
user: userSlice,
},
});

const renderWithRedux = (component) =>
render(
<Provider store={store}>
<BrowserRouter>{component}</BrowserRouter>
</Provider>,
);

// 회원가입 페이지 랜더링 테스트
test("renders SignUpPage without crashing", () => {
renderWithRedux(<SignUpPage />);
render(<SignUpPage />);
});
58 changes: 58 additions & 0 deletions __test__/reduxTest/scheduleSlice.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { rest } from "msw";
import { server } from "../__mocks__/msw/server.js";

import { store } from "../../src/store/index.js";
import { createSchedule } from "../../src/features/schedule/schedule-service.js";

const mockSchedule = {
title: "Test title",
details: "Test details",
startDate: "2023-06-04",
endDate: "2023-06-20",
startTime: "10:00",
endTime: "11:00",
repeat: "None",
notification: "None",
};

describe("schedule slice", () => {
beforeAll(() => {
server.use(
rest.post("/api/user/calendar", (req, res, ctx) => {
return res(ctx.status(500));
}),
);
});

it("handles createSchedule failure", async () => {
const initialScheduleState = {
schedule: [],
isLoading: false,
};

expect(store.getState().schedule).toEqual(initialScheduleState);

server.use(
rest.post("/api/user/calendar", (req, res, ctx) => {
return res(ctx.status(500));
}),
);

await store.dispatch(createSchedule(mockSchedule));

expect(store.getState().schedule.isLoading).toBe(false);
});

it("handles createSchedule success", async () => {
const initialScheduleState = {
schedule: [],
isLoading: false,
};

expect(store.getState().schedule).toEqual(initialScheduleState);

await store.dispatch(createSchedule(mockSchedule));

expect(store.getState().schedule.isLoading).toBe(false);
});
});
45 changes: 17 additions & 28 deletions jest.config.cjs
Original file line number Diff line number Diff line change
@@ -1,30 +1,19 @@
// {
// "testEnvironment": "jsdom",
// "transform": {
// "^.+\\.jsx?$": "babel-jest"
// },
// "transformIgnorePatterns": [
// "/node_modules/(?!@emotion/react|@emotion/styled|@react-oauth/google|react-icons|react-modal|react-toastify|styled-components)"
// ],
// "setupFilesAfterEnv": [
// "<rootDir>/jest.setup.js"
// ],
// "moduleNameMapper": {
// "react-calendar/dist/Calendar.css": "<rootDir>/__mocks__/mock.js",
// "\\.(css|less|scss|sass)$": "<rootDir>/__mocks__/styleMock.js"
// }
// }

module.exports = {
testEnvironment: 'jsdom',
transform: {
'^.+\\.jsx?$': 'babel-jest',
},
transformIgnorePatterns: [
'/node_modules/(?!@emotion/react|@emotion/styled|@react-oauth/google|react-icons|react-modal|react-toastify|styled-components)',
],
setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
moduleNameMapper: {
'\\.(css|less|scss|sass)$': '<rootDir>/__mocks__/styleMock.js',
},
testEnvironment: "jsdom",
transform: {
"^.+\\.jsx?$": "babel-jest",
},
transformIgnorePatterns: [
"/node_modules/(?!@emotion/react|@emotion/styled|@react-oauth/google|react-icons|react-modal|react-toastify|styled-components)",
],
setupFilesAfterEnv: ["<rootDir>/jest.setup.js"],
moduleNameMapper: {
"^@/(.*)$": "<rootDir>/src/$1",
"^@components/(.*)$": "<rootDir>/src/components/$1",
"^@pages/(.*)$": "<rootDir>/src/pages/$1",
"^@features/(.*)$": "<rootDir>/src/features/$1",
"^@store/(.*)$": "<rootDir>/src/store/$1",
"^@utils/(.*)$": "<rootDir>/src/utils/$1",
"\\.(css|less|scss|sss|styl)$": "<rootDir>/node_modules/jest-css-modules",
},
};
36 changes: 27 additions & 9 deletions jest.setup.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,27 @@
window.matchMedia =
window.matchMedia ||
function () {
return {
matches: false,
addListener: function () {},
removeListener: function () {},
};
};
import "@testing-library/jest-dom/extend-expect";
import { server } from "./__test__/__mocks__/msw/server.js";

beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());

import React from "react";
import { render as rtlRender } from "@testing-library/react";
import { Provider } from "react-redux";
import { BrowserRouter } from "react-router-dom";
import { GoogleOAuthProvider } from "@react-oauth/google";
import { store } from "./src/store/index.js";

const render = (ui, { ...options } = {}) => {
const Wrapper = ({ children }) => (
<GoogleOAuthProvider clientId="379597382111-vo2ht0r8a3d0ais7v12q7777lu48al1a.apps.googleusercontent.com">
<Provider store={store}>
<BrowserRouter>{children}</BrowserRouter>
</Provider>
</GoogleOAuthProvider>
);
return rtlRender(ui, { wrapper: Wrapper, ...options });
};

export * from "@testing-library/react";
export { render };
Loading

0 comments on commit 8a7d5f2

Please sign in to comment.