Add room hook testing and update config test

This commit is contained in:
2023-11-21 21:10:49 +07:00
parent 609b9abd52
commit d379262a7d
11 changed files with 125 additions and 22 deletions
+1 -2
View File
@@ -12,8 +12,7 @@ dist
dist-ssr dist-ssr
*.local *.local
.vscode .vscode
.jest
src/db.json
# Editor directories and files # Editor directories and files
.vscode/* .vscode/*
+7 -1
View File
@@ -1,4 +1,7 @@
export default { import type { Config } from 'jest';
const config: Config = {
verbose: true,
testEnvironment: 'jsdom', testEnvironment: 'jsdom',
transform: { transform: {
'^.+\\.tsx?$': 'ts-jest', '^.+\\.tsx?$': 'ts-jest',
@@ -17,4 +20,7 @@ export default {
'@page/(.*)': ['<rootDir>/src/pages/$1'], '@page/(.*)': ['<rootDir>/src/pages/$1'],
}, },
setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'], setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
setupFiles: ['<rootDir>/.jest/setEnvVar.ts']
}; };
export default config;
+1
View File
@@ -46,6 +46,7 @@
"ts-node": "^10.9.1", "ts-node": "^10.9.1",
"typescript": "^5.0.2", "typescript": "^5.0.2",
"vite": "^4.4.5", "vite": "^4.4.5",
"vite-plugin-environment": "^1.1.3",
"vite-tsconfig-paths": "^4.2.1" "vite-tsconfig-paths": "^4.2.1"
} }
} }
+11
View File
@@ -106,6 +106,9 @@ devDependencies:
vite: vite:
specifier: ^4.4.5 specifier: ^4.4.5
version: 4.4.11(@types/node@20.9.2) version: 4.4.11(@types/node@20.9.2)
vite-plugin-environment:
specifier: ^1.1.3
version: 1.1.3(vite@4.4.11)
vite-tsconfig-paths: vite-tsconfig-paths:
specifier: ^4.2.1 specifier: ^4.2.1
version: 4.2.1(typescript@5.2.2)(vite@4.4.11) version: 4.2.1(typescript@5.2.2)(vite@4.4.11)
@@ -4580,6 +4583,14 @@ packages:
convert-source-map: 2.0.0 convert-source-map: 2.0.0
dev: true dev: true
/vite-plugin-environment@1.1.3(vite@4.4.11):
resolution: {integrity: sha512-9LBhB0lx+2lXVBEWxFZC+WO7PKEyE/ykJ7EPWCq95NEcCpblxamTbs5Dm3DLBGzwODpJMEnzQywJU8fw6XGGGA==}
peerDependencies:
vite: '>= 2.7'
dependencies:
vite: 4.4.11(@types/node@20.9.2)
dev: true
/vite-tsconfig-paths@4.2.1(typescript@5.2.2)(vite@4.4.11): /vite-tsconfig-paths@4.2.1(typescript@5.2.2)(vite@4.4.11):
resolution: {integrity: sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==} resolution: {integrity: sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==}
peerDependencies: peerDependencies:
+2 -2
View File
@@ -1,6 +1,6 @@
const DEFAULT_SORT_BY = 'id'; const DEFAULT_SORT_BY = 'id';
const DEFAULT_ORDER_BY = 'asc'; const DEFAULT_ORDER_BY = 'asc';
const supabaseUrl = 'https://pjqujsjzzdrlrgqbxepe.supabase.co' const supabaseUrl = 'https://pjqujsjzzdrlrgqbxepe.supabase.co';
const supabaseKey = import.meta.env.VITE_SUPABASE_KEY const supabaseKey = process.env.VITE_SUPABASE_KEY;
export { DEFAULT_SORT_BY, DEFAULT_ORDER_BY, supabaseKey, supabaseUrl }; export { DEFAULT_SORT_BY, DEFAULT_ORDER_BY, supabaseKey, supabaseUrl };
@@ -1,11 +1,84 @@
import { useCreateRoom } from '@hook/rooms/useCreateRoom';
import { useDeleteRoom } from '@hook/rooms/useDeleteRoom';
import { useRooms } from '@hook/rooms/useRooms'; import { useRooms } from '@hook/rooms/useRooms';
import { useUpdateRoom } from '@hook/rooms/useUpdateRoom';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { renderHook, waitFor } from '@testing-library/react'; import { renderHook, waitFor } from '@testing-library/react';
import { IRoom } from '@type/rooms';
import { ReactNode } from 'react';
import { MemoryRouter } from 'react-router-dom';
import { act } from 'react-test-renderer';
interface IWrapper {
children: ReactNode;
}
const sampleData: IRoom = {
id: 999,
name: 'Room name test',
price: 9999,
status: true,
};
const queryClient = new QueryClient({
defaultOptions: {
queries: {
retry: false,
},
},
});
const wrapper = ({ children }: IWrapper) => {
return (
<QueryClientProvider client={queryClient}>
<MemoryRouter>{children}</MemoryRouter>
</QueryClientProvider>
);
};
describe('CRUD Room testing', () => { describe('CRUD Room testing', () => {
test('Fetch room data', async () => { test('Fetch room data', async () => {
const { result } = renderHook(() => useRooms()); const { result } = renderHook(() => useRooms(), { wrapper });
const { rooms } = result.current;
await waitFor(() => expect(rooms?.length).toBeGreaterThan(0)) await waitFor(() =>
}) expect(result.current.rooms?.length).toBeGreaterThan(0)
}) );
});
test('Create room', async () => {
const { result } = renderHook(() => useCreateRoom(), { wrapper });
act(() => {
const testMethod = async () => {
result.current.createRoom(sampleData);
await waitFor(() => expect(result.current.isSuccess).toBeTruthy());
};
testMethod();
});
});
test('Edit room', async () => {
const { result } = renderHook(() => useUpdateRoom(), { wrapper });
act(() => {
const testMethod = async () => {
result.current.updateRoom(sampleData);
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();
});
});
});
@@ -16,7 +16,11 @@ const useCreateRoom = () => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { dispatch } = useUserRoomAvailable(); const { dispatch } = useUserRoomAvailable();
const { mutate: createRoom, isPending: isCreating } = useMutation({ const {
mutate: createRoom,
isPending: isCreating,
isSuccess,
} = useMutation({
mutationFn: createRoomFn, mutationFn: createRoomFn,
onSuccess: (room) => { onSuccess: (room) => {
toast.success(ADD_SUCCESS); toast.success(ADD_SUCCESS);
@@ -31,7 +35,7 @@ const useCreateRoom = () => {
onError: (err) => toast.error(err.message), onError: (err) => toast.error(err.message),
}); });
return { isCreating, createRoom }; return { isCreating, createRoom, isSuccess };
}; };
export { useCreateRoom }; export { useCreateRoom };
@@ -14,7 +14,11 @@ import * as messages from '@constant/messages';
const useDeleteRoom = () => { const useDeleteRoom = () => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { isPending: isDeleting, mutate: deleteRoom } = useMutation({ const {
isPending: isDeleting,
mutate: deleteRoom,
isSuccess,
} = useMutation({
mutationFn: deleteRoomFn, mutationFn: deleteRoomFn,
onSuccess: () => { onSuccess: () => {
toast.success(messages.DELETE_SUCCESS); toast.success(messages.DELETE_SUCCESS);
@@ -25,7 +29,7 @@ const useDeleteRoom = () => {
onError: (err) => toast.error(err.message), onError: (err) => toast.error(err.message),
}); });
return { isDeleting, deleteRoom }; return { isDeleting, deleteRoom, isSuccess };
}; };
export { useDeleteRoom }; export { useDeleteRoom };
+1 -1
View File
@@ -18,7 +18,7 @@ const useRooms = () => {
const { const {
isLoading, isLoading,
data: rooms, data: rooms,
error, error
} = useQuery({ } = useQuery({
queryKey: ['rooms', sortByValue, orderByValue, phoneSearch], queryKey: ['rooms', sortByValue, orderByValue, phoneSearch],
queryFn: () => getAllRooms(sortByValue, orderByValue, phoneSearch), queryFn: () => getAllRooms(sortByValue, orderByValue, phoneSearch),
@@ -16,7 +16,11 @@ const useUpdateRoom = () => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { dispatch } = useUserRoomAvailable(); const { dispatch } = useUserRoomAvailable();
const { mutate: updateRoom, isPending: isUpdating } = useMutation({ const {
mutate: updateRoom,
isPending: isUpdating,
isSuccess,
} = useMutation({
mutationFn: updateRoomFn, mutationFn: updateRoomFn,
onSuccess: (room) => { onSuccess: (room) => {
toast.success(UPDATE_SUCCESS); toast.success(UPDATE_SUCCESS);
@@ -31,7 +35,7 @@ const useUpdateRoom = () => {
onError: (err) => toast.error(err.message), onError: (err) => toast.error(err.message),
}); });
return { isUpdating, updateRoom }; return { isUpdating, updateRoom, isSuccess };
}; };
export { useUpdateRoom }; export { useUpdateRoom };
+6 -5
View File
@@ -1,8 +1,9 @@
import { defineConfig } from 'vite' import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react' import react from '@vitejs/plugin-react';
import tsconfigPaths from 'vite-tsconfig-paths' import tsconfigPaths from 'vite-tsconfig-paths';
import EnvironmentPlugin from 'vite-plugin-environment';
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({
plugins: [react(), tsconfigPaths()], plugins: [react(), tsconfigPaths(), EnvironmentPlugin('all')],
}) });