@@ -3,9 +3,10 @@ import * as http from "http";
33import { postgraphile } from "postgraphile" ;
44import { ApolloGateway } from "@apollo/gateway" ;
55import { startFederatedServiceExtendingUser } from "./__fixtures__/federatedServiceExtendingUser" ;
6- import { ApolloServer } from "apollo-server" ;
6+ import { ApolloServer , ServerInfo } from "apollo-server" ;
77import * as pg from "pg" ;
88import axios from "axios" ;
9+ import { GraphQLSchema } from "graphql" ;
910
1011let pgPool : pg . Pool | null ;
1112
@@ -51,9 +52,25 @@ function toUrl(
5152 : `http://${ obj . address } :${ obj . port } ` ;
5253}
5354
54- test ( "federated service" , async ( ) => {
55+ async function withFederatedExternalServices (
56+ startExternalServices : {
57+ [ serviceName : string ] : ( ) => ApolloServer | Promise < ApolloServer > ;
58+ } ,
59+ cb : ( _ : { serverInfo : ServerInfo ; schema : GraphQLSchema } ) => Promise < any >
60+ ) {
5561 const postgraphileServer = await startPostgraphile ( ) ;
56- const serviceExtendingUser = startFederatedServiceExtendingUser ( ) ;
62+ const externalServices = await Promise . all (
63+ Object . entries ( startExternalServices ) . map (
64+ async ( [ name , serviceBuilder ] ) => {
65+ const service = await serviceBuilder ( ) ;
66+ return {
67+ name,
68+ service,
69+ url : toUrl ( await service . listen ( { port : 0 , host : "127.0.0.1" } ) ) ,
70+ } ;
71+ }
72+ )
73+ ) ;
5774 let server : ApolloServer | undefined ;
5875
5976 try {
@@ -62,48 +79,55 @@ test("federated service", async () => {
6279 name : "postgraphile" ,
6380 url : toUrl ( postgraphileServer . address ( ) ! ) + "/graphql" ,
6481 } ,
65- {
66- name : "serviceExtendingUser" ,
67- url : toUrl (
68- await serviceExtendingUser . listen ( { port : 0 , host : "127.0.0.1" } )
69- ) ,
70- } ,
82+ ...externalServices ,
7183 ] ;
7284
7385 const { schema, executor } = await new ApolloGateway ( {
7486 serviceList,
7587 } ) . load ( ) ;
7688
77- expect ( schema ) . toMatchSnapshot ( "federated schema" ) ;
78-
7989 server = new ApolloServer ( {
8090 schema,
8191 executor,
8292 } ) ;
8393
84- const running = await server . listen ( { port : 0 , host : "127.0.0.1" } ) ;
85-
86- debugger ;
87- const result = await axios . post ( running . url , {
88- query : `{ allUsersList(first: 1) { firstName, lastName, fullName} }` ,
89- } ) ;
94+ const serverInfo = await server . listen ( { port : 0 , host : "127.0.0.1" } ) ;
9095
91- expect ( result . data ) . toMatchObject ( {
92- data : {
93- allUsersList : [
94- {
95- firstName : "alicia" ,
96- fullName : "alicia keys" ,
97- lastName : "keys" ,
98- } ,
99- ] ,
100- } ,
101- } ) ;
96+ await cb ( { serverInfo, schema } ) ;
10297 } finally {
10398 await postgraphileServer . close ( ) ;
104- await serviceExtendingUser . stop ( ) ;
99+ for ( const external of externalServices ) {
100+ await external . service . stop ( ) ;
101+ }
105102 if ( server ) {
106103 await server . stop ( ) ;
107104 }
108105 }
106+ }
107+
108+ test ( "federated service" , async ( ) => {
109+ await withFederatedExternalServices (
110+ {
111+ serviceExteningUser : startFederatedServiceExtendingUser ,
112+ } ,
113+ async ( { serverInfo, schema } ) => {
114+ expect ( schema ) . toMatchSnapshot ( "federated schema" ) ;
115+
116+ const result = await axios . post ( serverInfo . url , {
117+ query : `{ allUsersList(first: 1) { firstName, lastName, fullName} }` ,
118+ } ) ;
119+
120+ expect ( result . data ) . toMatchObject ( {
121+ data : {
122+ allUsersList : [
123+ {
124+ firstName : "alicia" ,
125+ fullName : "alicia keys" ,
126+ lastName : "keys" ,
127+ } ,
128+ ] ,
129+ } ,
130+ } ) ;
131+ }
132+ ) ;
109133} ) ;
0 commit comments