DEV Community

Ben Read
Ben Read

Posted on

5 1

Apollo GraphQL: testing the `fetchMore` function

I'm building a messaging app with my team, and one of the things we realised recently is that our API has a hard limit on it. We can't fetch all of a users' message threads in one go due to rate limits, so we have to use the relay style, cursor-based pagination that the API team have introduced.

Implementing this pagination in our application was super easy, largely thanks to two things: (1) this post about pagination with Apollo by Emma on her personal blog and (2) Realising that Apollo have a relay-style pagination helper already which is a doddle to implement.

But when I wanted to test this implementation, there was very little documentation on how to test fetchMore

Here's my implementation:

    const {
        loading,
        error,
        data,
        fetchMore,
    } = useQuery(THREAD_LIST_QUERY, {
        variables: {
            ThreadsInput: {
                limit: 50,
            },
        },
    });
    useEffect(() => {
        if (data && fetchMore) {
            const nextPage = getHasNextPage(data);
            const after = getAfter(data);

            if (nextPage && after !== null) {
                fetchMore({
                    updateQuery,
                    variables: {
                        ThreadsInput: {
                            limit: 50,
                            cursor: after,
                        },
                    },
                });
            }
        }
    }, [data, fetchMore]);
Enter fullscreen mode Exit fullscreen mode

If you're wondering about the contents of the getHasNextPage and other functions in this snippet, head over to Emma's blog I mentioned at the outset.

In the rest of my test suite, I have my mocks like this:

    <MockedProvider
        mocks={mocks}
    >
        <Threads />
    </MockedProvider>
Enter fullscreen mode Exit fullscreen mode

What I hadn't noticed before is the significance of why mocks is an array: it's so you can pass multiple mocks ... sequential ones:

    <MockedProvider
        mocks={[mocks, fetchMoreMocks]}
        addTypename={false}
    >
        <Threads />
    </MockedProvider>
Enter fullscreen mode Exit fullscreen mode

It's as easy as that!

I'm glad we have such a comprehensive suite of tools in Apollo, but they can't cover everything in their documentation, it's already quite comprehensive. Still, this was a delightful discovery I wanted to pass on to you!

Image of Datadog

The Essential Toolkit for Front-end Developers

Take a user-centric approach to front-end monitoring that evolves alongside increasingly complex frameworks and single-page applications.

Get The Kit

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay