選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

usersPageReducer.test.js 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import * as redux from "react-redux";
  2. import store from "../../store";
  3. import { Router } from "react-router-dom";
  4. import history from "../../store/utils/history";
  5. import { mockState } from "../../mockState";
  6. import { render } from "@testing-library/react";
  7. import * as api from "../../request/usersRequest";
  8. import { runSaga } from "redux-saga";
  9. import {
  10. setUsers,
  11. setUsersError,
  12. } from "../../store/actions/users/usersActions";
  13. import { FETCH_USERS_REQ } from "../../store/actions/users/usersActionConstants";
  14. import { getUsers } from "../../store/saga/usersSaga";
  15. import * as helper from "../../util/helpers/rejectErrorCodeHelper";
  16. import UsersPage from "../../pages/UsersPage/UsersPage";
  17. describe("UsersPage reducer tests", () => {
  18. const cont = (
  19. <redux.Provider store={store}>
  20. <Router history={history}>
  21. <UsersPage />
  22. </Router>
  23. </redux.Provider>
  24. );
  25. let spyOnUseSelector;
  26. let spyOnUseDispatch;
  27. let mockDispatch;
  28. beforeEach(() => {
  29. // Mock useSelector hook
  30. spyOnUseSelector = jest.spyOn(redux, "useSelector");
  31. spyOnUseSelector.mockReturnValueOnce(mockState.users);
  32. // Mock useDispatch hook
  33. spyOnUseDispatch = jest.spyOn(redux, "useDispatch");
  34. // Mock dispatch function returned from useDispatch
  35. mockDispatch = jest.fn();
  36. spyOnUseDispatch.mockReturnValue(mockDispatch);
  37. });
  38. afterEach(() => {
  39. jest.restoreAllMocks();
  40. });
  41. it("Should dispatch get users request when rendered", () => {
  42. render(cont);
  43. expect(mockDispatch).toHaveBeenCalledWith({
  44. type: FETCH_USERS_REQ,
  45. });
  46. });
  47. it("should load and handle users in case of success", async () => {
  48. const dispatchedActions = [];
  49. const mockedCall = { data: mockState.users };
  50. api.getAllUsers = jest.fn(() => Promise.resolve(mockedCall));
  51. const fakeStore = {
  52. getState: () => mockState.users,
  53. dispatch: (action) => dispatchedActions.push(action),
  54. };
  55. await runSaga(fakeStore, getUsers).done;
  56. expect(api.getAllUsers.mock.calls.length).toBe(1);
  57. expect(dispatchedActions).toContainEqual(setUsers(mockedCall.data));
  58. });
  59. it("should handle users load errors in case of failure", async () => {
  60. const dispatchedActions = [];
  61. helper.rejectErrorCodeHelper = jest.fn(
  62. () => mockState.users.fetchUsersErrorMessage
  63. );
  64. const error = {
  65. response: {
  66. data: { message: mockState.users.fetchUsersErrorMessage },
  67. },
  68. };
  69. api.getAllUsers = jest.fn(() => Promise.reject(error));
  70. const fakeStore = {
  71. getState: () => mockState.users,
  72. dispatch: (action) => dispatchedActions.push(action),
  73. };
  74. await runSaga(fakeStore, getUsers).done;
  75. expect(api.getAllUsers.mock.calls.length).toBe(1);
  76. expect(dispatchedActions).toContainEqual(
  77. setUsersError(error.response.data.message)
  78. );
  79. });
  80. });