1- import { ApolloGateway } from '@apollo/gateway' ;
2- import { ApolloServerBase as ApolloServer } from 'apollo-server-core' ;
3- import { createTestClient } from 'apollo-server-testing' ;
1+ import { ApolloGateway , IntrospectAndCompose , RemoteGraphQLDataSource } from '@apollo/gateway' ;
2+ import { ApolloServer } from '@apollo/server' ;
3+ import { ApolloServerPluginUsageReporting } from '@apollo/server/plugin/usageReporting' ;
4+
45import gql from 'graphql-tag' ;
56import { spawn } from 'child_process' ;
67
@@ -45,7 +46,7 @@ const startService = serviceName =>
4546 } ) ;
4647 } ) ;
4748
48- let testClient ;
49+ let gatewayServer ;
4950let serviceProcesses = [ ] ;
5051const serviceList = [
5152 { name : 'accounts' , url : 'http://localhost:5001/graphql' } ,
@@ -57,14 +58,47 @@ const serviceList = [
5758beforeAll ( async ( ) => {
5859 serviceProcesses = await Promise . all ( serviceList . map ( ( { name } ) => startService ( name ) ) ) ;
5960
60- const gateway = new ApolloGateway ( { serviceList } ) ;
61+ const gateway = new ApolloGateway ( {
62+ supergraphSdl : new IntrospectAndCompose ( {
63+ subgraphs : serviceList ,
64+ } ) ,
65+ buildService ( { name, url } ) {
66+ return new RemoteGraphQLDataSource ( {
67+ name,
68+ url,
6169
62- const server = new ApolloServer ( {
63- gateway,
64- subscriptions : false ,
70+ // We can't mock the calls to the Apollo reporting API since they're sent asynchronously
71+ // after query execution completes so instead keep track of any subgraph traces in the
72+ // context.
73+ didReceiveResponse ( { response, context } ) {
74+ if ( context . subgraphTraces && response . extensions && response . extensions . ftv1 ) {
75+ context . subgraphTraces . push ( response . extensions . ftv1 ) ;
76+ }
77+ return response ;
78+ } ,
79+ } ) ;
80+ } ,
6581 } ) ;
6682
67- testClient = createTestClient ( server ) ;
83+ gatewayServer = new ApolloServer ( {
84+ gateway,
85+ apollo : {
86+ key : 'My Key' ,
87+ graphRef : 'My Graph' ,
88+ } ,
89+ plugins : [
90+ ApolloServerPluginUsageReporting ( {
91+ sendReportsImmediately : true ,
92+ fetcher : ( ) => {
93+ return {
94+ status : 200 ,
95+ headers : new Map ( ) ,
96+ } ;
97+ } ,
98+ fieldLevelInstrumentation : ( ) => true ,
99+ } ) ,
100+ ] ,
101+ } ) ;
68102} ) ;
69103
70104afterAll ( ( ) => {
@@ -100,7 +134,8 @@ it('works with a gateway', async () => {
100134 }
101135 ` ;
102136
103- const result = await testClient . query ( { query } ) ;
137+ const response = await gatewayServer . executeOperation ( { query } ) ;
138+ const result = response . body . singleResult ;
104139
105140 expect ( result . errors ) . toBeUndefined ( ) ;
106141 expect ( result . data ) . toEqual ( {
@@ -164,7 +199,8 @@ it('works with a @requires directive', async () => {
164199 }
165200 ` ;
166201
167- const result = await testClient . query ( { query } ) ;
202+ const response = await gatewayServer . executeOperation ( { query } ) ;
203+ const result = response . body . singleResult ;
168204
169205 expect ( result . errors ) . toBeUndefined ( ) ;
170206 expect ( result . data ) . toEqual ( {
@@ -200,7 +236,8 @@ it('works with a @provides directive', async () => {
200236 }
201237 ` ;
202238
203- const result = await testClient . query ( { query } ) ;
239+ const response = await gatewayServer . executeOperation ( { query } ) ;
240+ const result = response . body . singleResult ;
204241
205242 expect ( result . errors ) . toBeUndefined ( ) ;
206243 expect ( result . data ) . toEqual ( {
@@ -247,3 +284,23 @@ it('works with a @provides directive', async () => {
247284 ] ,
248285 } ) ;
249286} ) ;
287+
288+ it ( 'works with federated traces' , async ( ) => {
289+ const query = gql `
290+ {
291+ me {
292+ name
293+ reviews {
294+ body
295+ }
296+ }
297+ }
298+ ` ;
299+
300+ const contextValue = { subgraphTraces : [ ] } ;
301+ const response = await gatewayServer . executeOperation ( { query } , { contextValue } ) ;
302+ const result = response . body . singleResult ;
303+
304+ expect ( result . errors ) . toBeUndefined ( ) ;
305+ expect ( contextValue . subgraphTraces . length ) . toEqual ( 2 ) ;
306+ } ) ;
0 commit comments