From e3db60b2ddfea2fb67186e2af44df098236a67d6 Mon Sep 17 00:00:00 2001 From: Loi Phan Date: Thu, 23 Nov 2023 17:45:26 +0700 Subject: [PATCH] Add test case for user, room hooks --- .../src/hooks/__tests__/rooms.test.tsx | 72 ++++----- .../src/hooks/__tests__/users.test.tsx | 151 +++++++++++------- .../src/hooks/rooms/useDeleteRoom.ts | 3 +- .../src/hooks/rooms/useUpdateRoom.ts | 7 +- 4 files changed, 128 insertions(+), 105 deletions(-) diff --git a/hotel-management/src/hooks/__tests__/rooms.test.tsx b/hotel-management/src/hooks/__tests__/rooms.test.tsx index de4af17..c70b563 100644 --- a/hotel-management/src/hooks/__tests__/rooms.test.tsx +++ b/hotel-management/src/hooks/__tests__/rooms.test.tsx @@ -8,16 +8,13 @@ import { act, renderHook, waitFor } from '@testing-library/react'; import { IRoom } from '@type/rooms'; import { ReactNode } from 'react'; import { MemoryRouter } from 'react-router-dom'; +import { useUpdateRoom } from '@hook/rooms/useUpdateRoom'; +import { useDeleteRoom } from '@hook/rooms/useDeleteRoom'; const mockUseRooms = jest.fn(useRooms); const mockUseCreateRoom = jest.fn(useCreateRoom); -// const mockUseUpdateRoom = useUpdateRoom; -// const mockUseDeleteRoom = useDeleteRoom; - -jest.mock('@hook/rooms/useRooms'); -jest.mock('@hook/rooms/useUpdateRoom'); -jest.mock('@hook/rooms/useDeleteRoom'); - +const mockUseUpdateRoom = jest.fn(useUpdateRoom); +const mockUseDeleteRoom = jest.fn(useDeleteRoom); interface IWrapper { children: ReactNode; } @@ -86,46 +83,39 @@ describe('CRUD Room testing', () => { expect(result.current.isSuccess).toBeTruthy(); }); - test('Create failed room', async () => { - mockUseCreateRoom.mockImplementation(() => ({ - createRoom: () => {sampleData}, - isCreating: false, - isSuccess: false + test('Edit room', async () => { + mockUseUpdateRoom.mockImplementation(() => ({ + updateRoom: () => {sampleData}, + isUpdating: false, + isSuccess: true })); - const { result } = renderHook(() => mockUseCreateRoom(), { wrapper }); + const { result } = renderHook(() => mockUseUpdateRoom(), { wrapper }); act(() => { - result.current.createRoom(sampleData); + const testMethod = async () => { + result.current.updateRoom(sampleData); + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()); + }; + + testMethod(); }); - - await waitFor(() => result.current.isSuccess); - - expect(result.current.isSuccess).toBeFalsy(); }); - // test('Edit room', async () => { - // const { result } = renderHook(() => useUpdateRoom(), { wrapper }); + test('Delete room', async () => { + mockUseDeleteRoom.mockImplementation(() => ({ + deleteRoom: () => {sampleData.id}, + isDeleting: false, + isSuccess: true + })); + const { result } = renderHook(() => mockUseDeleteRoom(), { wrapper }); - // act(() => { - // const testMethod = async () => { - // result.current.updateRoom(sampleData); - // await waitFor(() => expect(result.current.isSuccess).toBeTruthy()); - // }; + act(() => { + const testMethod = async () => { + result.current.deleteRoom(sampleData.id); + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()); + }; - // testMethod(); - // }); - // }); - - // test('Delete room', async () => { - // const { result } = renderHook(() => useDeleteRoom(), { wrapper }); - - // act(() => { - // const testMethod = async () => { - // result.current.deleteRoom(sampleData.id); - // await waitFor(() => expect(result.current.isSuccess).toBeTruthy()); - // }; - - // testMethod(); - // }); - // }); + testMethod(); + }); + }); }); diff --git a/hotel-management/src/hooks/__tests__/users.test.tsx b/hotel-management/src/hooks/__tests__/users.test.tsx index 9ac0970..5958f17 100644 --- a/hotel-management/src/hooks/__tests__/users.test.tsx +++ b/hotel-management/src/hooks/__tests__/users.test.tsx @@ -1,70 +1,101 @@ -// import { useCreateUser } from '@hook/users/useCreateUser'; -// import { useUpdateUser } from '@hook/users/useUpdateUser'; -// import { useUsers } from '@hook/users/useUsers'; -// import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -// import { renderHook, waitFor } from '@testing-library/react'; -// import { IUser } from '@type/users'; -// import { ReactNode } from 'react'; -// import { MemoryRouter } from 'react-router-dom'; -// import { act } from 'react-test-renderer'; +import { useCreateUser } from '@hook/users/useCreateUser'; +import { useUpdateUser } from '@hook/users/useUpdateUser'; +import { useUsers } from '@hook/users/useUsers'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { renderHook, waitFor } from '@testing-library/react'; +import { IUser } from '@type/users'; +import { ReactNode } from 'react'; +import { MemoryRouter } from 'react-router-dom'; +import { act } from 'react-test-renderer'; -// interface IWrapper { -// children: ReactNode; -// } +const mockUseUsers = jest.fn(useUsers); +const mockUseCreateUser = jest.fn(useCreateUser); +const mockUseUpdateUser = jest.fn(useUpdateUser); -// const sampleData: IUser = { -// id: 999, -// name: 'User name test', -// phone: '123456789', -// isBooked: true, -// }; -// const queryClient = new QueryClient({ -// defaultOptions: { -// queries: { -// retry: false, -// }, -// }, -// }); -// const wrapper = ({ children }: IWrapper) => { -// return ( -// -// {children} -// -// ); -// }; +interface IWrapper { + children: ReactNode; +} -// describe('CRUD User testing', () => { -// test('Fetch user data', async () => { -// const { result } = renderHook(() => useUsers(), { wrapper }); +const sampleData: IUser = { + id: 999, + name: 'User name test', + phone: '123456789', + isBooked: true, +}; +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + }, + }, +}); +const wrapper = ({ children }: IWrapper) => { + return ( + + {children} + + ); +}; -// await waitFor(() => -// expect(result.current.users?.length).toBeGreaterThan(0) -// ); -// }); +describe('CRUD User testing', () => { + test('Fetch user data', async () => { + mockUseUsers.mockImplementation(() => ({ + users: [ + { + id: 1, + name: 'Nezumi', + phone: '0123456678', + isBooked: true, + }, + { + id: 2, + name: 'Loi Phan', + phone: '0123456678', + isBooked: false, + }, + ], + isLoading: false, + })) + const { result } = renderHook(() => mockUseUsers(), { wrapper }); -// test('Create user', async () => { -// const { result } = renderHook(() => useCreateUser(), { wrapper }); + await waitFor(() => + expect(result.current.users?.length).toEqual(2) + ); + }); -// act(() => { -// const testMethod = async () => { -// result.current.createUser(sampleData); -// await waitFor(() => expect(result.current.isSuccess).toBeTruthy()); -// }; + test('Create user', async () => { + mockUseCreateUser.mockImplementation(() => ({ + createUser: () => {sampleData}, + isCreating: false, + isSuccess: true, + })); + const { result } = renderHook(() => mockUseCreateUser(), { wrapper }); -// testMethod(); -// }); -// }); + act(() => { + const testMethod = async () => { + result.current.createUser(sampleData); + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()); + }; -// test('Update user', async () => { -// const { result } = renderHook(() => useUpdateUser(), { wrapper }); + testMethod(); + }); + }); -// act(() => { -// const testMethod = async () => { -// result.current.updateUser(sampleData); -// await waitFor(() => expect(result.current.isSuccess).toBeTruthy()); -// }; + test('Update user', async () => { + mockUseUpdateUser.mockImplementation(() => ({ + updateUser: () => {sampleData}, + isUpdating: false, + isSuccess: true, + })); + const { result } = renderHook(() => mockUseUpdateUser(), { wrapper }); -// testMethod(); -// }); -// }); -// }); + act(() => { + const testMethod = async () => { + result.current.updateUser(sampleData); + await waitFor(() => expect(result.current.isSuccess).toBeTruthy()); + }; + + testMethod(); + }); + }); +}); diff --git a/hotel-management/src/hooks/rooms/useDeleteRoom.ts b/hotel-management/src/hooks/rooms/useDeleteRoom.ts index 2a99f5d..56d3aeb 100644 --- a/hotel-management/src/hooks/rooms/useDeleteRoom.ts +++ b/hotel-management/src/hooks/rooms/useDeleteRoom.ts @@ -17,6 +17,7 @@ const useDeleteRoom = () => { const { isPending: isDeleting, mutate: deleteRoom, + isSuccess } = useMutation({ mutationFn: deleteRoomFn, onSuccess: () => { @@ -28,7 +29,7 @@ const useDeleteRoom = () => { onError: (err) => toast.error(err.message), }); - return { isDeleting, deleteRoom }; + return { isDeleting, deleteRoom, isSuccess }; }; export { useDeleteRoom }; diff --git a/hotel-management/src/hooks/rooms/useUpdateRoom.ts b/hotel-management/src/hooks/rooms/useUpdateRoom.ts index f0b748d..cc0baf4 100644 --- a/hotel-management/src/hooks/rooms/useUpdateRoom.ts +++ b/hotel-management/src/hooks/rooms/useUpdateRoom.ts @@ -18,7 +18,8 @@ const useUpdateRoom = () => { const { mutate: updateRoom, - isPending: isUpdating + isPending: isUpdating, + isSuccess } = useMutation({ mutationFn: updateRoomFn, onSuccess: (room) => { @@ -26,7 +27,7 @@ const useUpdateRoom = () => { queryClient.invalidateQueries({ queryKey: ['rooms'] }); // Update name room in global state - dispatch!({ + dispatch?.({ type: 'updateRoomName', payload: [{ id: room.id, name: room.name }], }); @@ -34,7 +35,7 @@ const useUpdateRoom = () => { onError: (err) => toast.error(err.message), }); - return { isUpdating, updateRoom }; + return { isUpdating, updateRoom, isSuccess }; }; export { useUpdateRoom };