All files / utils useBackend.js

100% Statements 29/29
100% Branches 9/9
100% Functions 9/9
100% Lines 28/28

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102                                                          746x     152x 152x 119x     33x 1x   32x 32x   19x                   262x     41x 41x 34x     7x 1x   6x 6x   4x               28x 22x       466x   466x     10x 1x   9x 9x         14x 12x            
import { useQuery, useMutation, useQueryClient } from "react-query";
import axios from "axios";
import { toast } from "react-toastify";
 
// example
//  queryKey ["/api/users/all"] for "api/users/all"
//  queryKey ["/api/users","4"]  for "/api/users?id=4"
 
// For axiosParameters
//   
// {
//     method: 'post',
//     url: '/user/12345',
//     data: {
//       firstName: 'Fred',
//       lastName: 'Flintstone'
//     }
//  }
// 
 
// GET Example:
// useBackend(
//     ["/api/admin/users"],
//     { method: "GET", url: "/api/admin/users" },
//     []
// );
 
export function useBackend(queryKey, axiosParameters, initialData, rest) {
 
    return useQuery({
        queryKey: queryKey,
        queryFn: async () => {
            try {
                const response = await axios(axiosParameters);
                return response.data;
            } catch (e) {
                // Stryker disable next-line OptionalChaining
                if (e.response?.data?.message) {
                    toast.error(e.response.data.message);
                } else {
                    const errorMessage = `Error communicating with backend via ${axiosParameters.method} on ${axiosParameters.url}`;
                    toast.error(errorMessage);
                }
                throw e;
            }
        }, 
        initialData: initialData,
        ...rest
        });
}
 
export function useBackendConsole(queryKey, axiosParameters, initialData, rest) {
 
    return useQuery({
        queryKey: queryKey,
        queryFn: async () => {
            try {
                const response = await axios(axiosParameters);
                return response.data;
            } catch (e) {
                // Stryker disable next-line OptionalChaining
                if (e.response?.data?.message) {
                    console.log(e.response.data.message);
                } else {
                    const errorMessage = `Error communicating with backend via ${axiosParameters.method} on ${axiosParameters.url}`;
                    toast.error(errorMessage);
                }
                throw e;
            }
        }, 
        initialData: initialData,
        ...rest
        });
}
 
const wrappedParams = async (params) => {
    return await (await axios(params)).data;
};
 
export function useBackendMutation(objectToAxiosParams, useMutationParams, queryKey = null) {
    const queryClient = useQueryClient();
 
    return useMutation((object) => wrappedParams(objectToAxiosParams(object)), {
        onError: (error) => {
            // Stryker disable next-line OptionalChaining : we want to check if each nested object is there but we dont want to write tests for each specific case
            if (error.response?.data?.message) {
                toast.error(error.response.data.message);
            } else {
                const errorMessage = `Error communicating with backend via ${error.response.config.method} on ${error.response.config.url}`;
                toast.error(errorMessage);
            }
        },
        // Stryker disable all : Not sure how to set up the complex behavior needed to test this
        onSettled: () => {
            if (queryKey !== null)
                queryClient.invalidateQueries(queryKey);
        },
        // Stryker restore all
        retry: false,
        ...useMutationParams
    })
}