I'm writing a test where I expect an error message to show.
This is the component I'm testing:
export const CourseOverview = () => {
const { data, isError, error, isSuccess } = useGetCourses();
if (isError) {
return <div>{error.message}</div>;
}
if (isSuccess) {
return (
<CourseAccordion items={data.courses} />
);
}
return <div>Loading...</div>;
};
useGetCourses is a custom hook that wraps @tanstack/react-query:
const query = gql(`
query getCourses($language: LanguageType!) {
courses(language: $language) {
academicYearEnd
academicYearStart
coursePeriods
title
}
}
`);
export const useGetCourses = () => {
// queryClient is an instance of graphql-request GraphQLClient
// with api and headers for auth set
const { queryClient } = useQueryClient();
return useQuery({
queryKey: ['coursesOverview'],
queryFn: () => queryClient.request(query),
});
};
In my test I am using MSW to generate an error:
import { graphql, HttpResponse } from 'msw';
describe('CourseOverview', () => {
it('should render error state', async () => {
// mockServer is defined and exported in jest-setup as described in the official docs: https://mswjs.io/docs/integrations/node
mockServer.use(
graphql.query('getCourses', () => {
return HttpResponse.json({ errors: [{ message: 'oopsie' }] });
})
);
// renderWithProviders wraps the testing-library render function with QueryClientProvider (see below)
renderWithProviders(<CourseOverview />);
expect(await screen.findByText('oopsie')).toBeInTheDocument();
});
});
export const renderWithProviders = (
element: JSX.Element
): RenderResult => {
const queryClient = new QueryClient({
defaultOptions: {
queries: {
retry: false,
},
},
});
return render(
<QueryClientProvider client={queryClient}>
{element}
</QueryClientProvider>
);
};
If you look at the component, we are outputting the error.message
. So I expect to see: "oopsie".
However, there appears to be a whole response object in it (console.log result in component):
"oopsie: {\"response\":{\"errors\":[{\"message\":\"oopsie\"}],\"status\":200,\"headers\":{}},\"request\":{\"query\":\"query getCourses($language: LanguageType!) {\\n courses(language: $language) {\\n academicYearEnd\\n academicYearStart\\n coursePeriods\\n title\\n }\\n}\",\"variables\":{\"language\":\"NL\"}}}"
The default graphql error is the errors
object. We are getting that, but wrapped in response
.
I suspect that is because of the HttpResponse.json
function in the msw handler, but according to the docs this is how it should be done: https://mswjs.io/docs/api/graphql#graphqllinkurl (line 19).
How can I make MSW return the expected object?
Or is it react-query that doesn't parse the error correctly?