@@ -8,13 +8,16 @@ import {
88} from 'apollo-link' ;
99
1010import { print } from 'graphql/language/printer' ;
11+ import { getOperationAST } from 'graphql' ;
1112import {
1213 addTypenameToDocument ,
1314 removeClientSetsFromDocument ,
1415 removeConnectionDirectiveFromDocument ,
1516 cloneDeep ,
1617} from 'apollo-utilities' ;
17- const isEqual = require ( 'lodash.isequal' ) ;
18+ import values from 'lodash/values' ;
19+ import isEqual from 'lodash/isEqual' ;
20+ import diff from 'jest-diff' ;
1821
1922type ResultFunction < T > = ( ) => T ;
2023
@@ -75,10 +78,18 @@ export class MockLink extends ApolloLink {
7578 } ) ;
7679
7780 if ( ! response || typeof responseIndex === 'undefined' ) {
81+ const queryDiffs = ( < string [ ] > [ ] ) . concat (
82+ ...values ( this . mockedResponsesByKey ) . map ( mockedResponses =>
83+ mockedResponses . map ( mockedResponse =>
84+ diffRequest ( mockedResponse . request , operation , this . addTypename ) ,
85+ ) ,
86+ ) ,
87+ ) ;
88+
7889 throw new Error (
79- `No more mocked responses for the query: ${ print (
80- operation . query ,
81- ) } , variables: ${ JSON . stringify ( operation . variables ) } `,
90+ `No more mocked responses for\n ${ requestToString ( operation ) } ${
91+ queryDiffs . length ? `\n\nPossible matches:\n ${ queryDiffs . join ( '\n' ) } ` : ''
92+ } `,
8293 ) ;
8394 }
8495
@@ -178,6 +189,32 @@ function requestToKey(request: GraphQLRequest, addTypename: Boolean): string {
178189 return JSON . stringify ( requestKey ) ;
179190}
180191
192+ function diffRequest (
193+ actualRequest : GraphQLRequest ,
194+ expectedRequest : GraphQLRequest ,
195+ addTypename ?: Boolean
196+ ) : string {
197+ return diff (
198+ requestToString ( actualRequest , addTypename ) ,
199+ requestToString ( expectedRequest )
200+ ) || '' ;
201+ }
202+
203+ function requestToString (
204+ request : GraphQLRequest ,
205+ addTypename ?: Boolean
206+ ) : string {
207+ const query = print (
208+ addTypename ? addTypenameToDocument ( request . query ) : request . query
209+ ) ;
210+ const variables = request . variables
211+ ? JSON . stringify ( request . variables , null , 2 )
212+ : '{}' ;
213+ const operationAST = getOperationAST ( request . query , null ) ;
214+ const operationName = operationAST ? operationAST . operation : 'query' ;
215+ return `${ operationName } :\n${ query } variables:\n${ variables } ` ;
216+ }
217+
181218// Pass in multiple mocked responses, so that you can test flows that end up
182219// making multiple queries to the server
183220// NOTE: The last arg can optionally be an `addTypename` arg
0 commit comments