apollo-server/docs/source/features/testing.md
2018-11-14 20:25:38 -05:00

2.8 KiB

title description
Integration testing Utilities for testing Apollo Server

Testing apollo-server can be done in many ways. The apollo-server-testing package provides tooling to make testing easier and accessible to users of all of the apollo-server integrations.

createTestClient

Integration testing a GraphQL server means testing many things. apollo-server has a request pipeline that can support many plugins that can affect the way an operation is executed. createTestClient provides a single hook to run operations through the request pipeline, enabling the most thorough tests possible without starting up an HTTP server.

const { createTestClient } = require('apollo-server-testing');

const { query, mutate } = createTestClient(server);

query({
  query: GET_USER,
  variables: { id: 1 }
});

mutate({
  mutation: UPDATE_USER,
  variables: { id: 1, email: 'nancy@foo.co' }
});

When passed an instance of the ApolloServer class, createTestClient returns a query and mutate function that can be used to run operations against the server instance. Currently, queries and mutations are the only operation types supported by createTestClient.

const { createTestClient } = require('apollo-server-testing');

it('fetches single launch', async () => {
  const userAPI = new UserAPI({ store });
  const launchAPI = new LaunchAPI();

  // create a test server to test against, using our production typeDefs,
  // resolvers, and dataSources.
  const server = new ApolloServer({
    typeDefs,
    resolvers,
    dataSources: () => ({ userAPI, launchAPI }),
    context: () => ({ user: { id: 1, email: 'a@a.a' } }),
  });

  // mock the dataSource's underlying fetch methods
  launchAPI.get = jest.fn(() => [mockLaunchResponse]);
  userAPI.store = mockStore;
  userAPI.store.trips.findAll.mockReturnValueOnce([
    { dataValues: { launchId: 1 } },
  ]);

  // use the test server to create a query function
  const { query } = createTestClient(server);

  // run query against the server and snapshot the output
  const res = await query({ query: GET_LAUNCH, variables: { id: 1 } });
  expect(res).toMatchSnapshot();
});

This is an example of a full integration test being run against a test instance of apollo-server. This test imports the important pieces to test (typeDefs, resolvers, dataSources) and creates a new instance of apollo-server. Once an instance is created, it's passed to createTestClient which returns { query, mutate }. These methods can then be used to execute operations against the server.

For more examples of this tool in action, check out the integration tests in the Fullstack Tutorial.