import { GetStaticProps } from "next";
import {
addApolloStateAndReturnPageProps,
initializeApollo,
} from "@/lib/apolloClient";
import { gql } from "@apollo/client";
import { Country } from "@/types";
const GET_COUNTRIES = gql`
query Countries {
countries {
code
name
emoji
}
}
`;
interface Props {
countries: Country[];
}
const FetchSample = ({ countries }: Props) => {
return (
<div className="grid grid-cols-5 gap-8 p-10">
{countries.map((country) => {
const { code, name, emoji } = country;
return (
<div
key={code as string}
className="w-auto p-4 shadow-md h-25 hover:bg-slate-100">
<div>{emoji}</div>
<div className="text-sm">{name}</div>
</div>
);
})}
</div>
);
};
export const getStaticProps: GetStaticProps = async (ctx) => {
const apolloClient = initializeApollo();
const {
data: { countries },
} = await apolloClient.query({
query: GET_COUNTRIES,
});
return addApolloStateAndReturnPageProps(apolloClient, {
props: { countries },
});
};
export default FetchSample;
Here's an example test code for the given code:
import { MockedProvider } from "@apollo/client/testing";
import { render } from "@testing-library/react";
import { GetStaticPropsContext } from "next";
import FetchSample, { getStaticProps, COUNTRIS_QUERY } from "@/pages/fetchSample";
const mockCountries = [
{ code: "US", name: "United States", emoji: "🇺🇸" },
{ code: "CA", name: "Canada", emoji: "🇨🇦" },
];
const mockContext: GetStaticPropsContext = {};
const mockApolloClient = {
query: jest.fn().mockResolvedValue({ data: { countries: mockCountries } }),
};
describe("FetchSample", () => {
it("renders a list of countries", async () => {
const { getByText } = render(
<MockedProvider client={mockApolloClient}>
<FetchSample countries={mockCountries} />
</MockedProvider>
);
mockCountries.forEach((country) => {
expect(getByText(country.name)).toBeInTheDocument();
});
});
it("fetches countries data with getStaticProps", async () => {
const { props } = await getStaticProps(mockContext);
expect(props.countries).toEqual(mockCountries);
expect(mockApolloClient.query).toHaveBeenCalledWith({
query: COUNTRIS_QUERY,
});
});
});
In this test code, we're using Jest as the test runner and @testing-library/react for rendering and querying the rendered components. We're also using MockedProvider from @apollo/client/testing to mock the Apollo client in our tests.
The first test checks that the FetchSample component renders a list of countries correctly. We're using the render function from @testing-library/react to render the component with the mockCountries data as the countries prop. We're then using the getByText function to check that each country name is present in the rendered output.
The second test checks that the getStaticProps function fetches the countries data correctly. We're mocking the GetStaticPropsContext object with an empty object, and we're also mocking the Apollo client with the mockApolloClient object, which we're setting to return the mockCountries data when the COUNTRIS_QUERY is queried. We're then calling the getStaticProps function with the mocked context, and we're checking that it returns the expected props object with the mockCountries data. We're also checking that the mockApolloClient.query function was called with the COUNTRIS_QUERY.