diff --git a/packages/apollo-server-integration-testsuite/src/ApolloServer.ts b/packages/apollo-server-integration-testsuite/src/ApolloServer.ts index 750e4a5beaf..dbb38b37d53 100644 --- a/packages/apollo-server-integration-testsuite/src/ApolloServer.ts +++ b/packages/apollo-server-integration-testsuite/src/ApolloServer.ts @@ -37,6 +37,7 @@ import { ApolloServerBase, } from 'apollo-server-core'; import { GraphQLExtension, GraphQLResponse } from 'graphql-extensions'; +import { TracingFormat } from 'apollo-tracing'; export function createServerInfo( server: AS, @@ -1260,5 +1261,46 @@ export function testApolloServer( }, done.fail); }); }); + + describe('Tracing', () => { + const typeDefs = gql` + type Book { + title: String + author: String + } + + type Query { + books: [Book] + } + `; + + const books = [{ title: 'H', author: 'J' }]; + + it('reports a total duration that is longer than the durations of its constituent resolvers', async () => { + const resolvers = { + Query: { + books: () => + new Promise(resolve => setTimeout(() => resolve(books), 10)), + }, + }; + + const { url: uri } = await createApolloServer({ + typeDefs, + resolvers, + tracing: true, + }); + + const apolloFetch = createApolloFetch({ uri }); + const result = await apolloFetch({ + query: `{ books { title author } }`, + }); + + const tracing: TracingFormat = result.extensions.tracing; + + tracing.execution.resolvers.forEach(resolver => + expect(resolver.duration).toBeLessThan(tracing.duration), + ); + }); + }); }); }