diff --git a/src/QueryManager.ts b/src/QueryManager.ts index 750e9464bdb..0d70dad8099 100644 --- a/src/QueryManager.ts +++ b/src/QueryManager.ts @@ -274,7 +274,7 @@ export class QueryManager { if (this.queryTransformer) { queryDef = applyTransformerToOperation(queryDef, this.queryTransformer); } - const queryString = print(query); + const queryString = print(queryDef); // Parse the query passed in -- this could also be done by a build plugin or tagged // template string diff --git a/test/client.ts b/test/client.ts index 30fed57dd49..3aa74e2eabb 100644 --- a/test/client.ts +++ b/test/client.ts @@ -31,6 +31,8 @@ import { HTTPNetworkInterface, } from '../src/networkInterface'; +import { getQueryDefinition } from '../src/queries/getFromAST'; + import { addTypenameToSelectionSet } from '../src/queries/queryTransform'; import mockNetworkInterface from './mocks/mockNetworkInterface'; @@ -300,7 +302,7 @@ describe('client', () => { apollo: { queries: { '0': { - queryString: print(query), + queryString: print(getQueryDefinition(query)), query: { id: 'ROOT_QUERY', typeName: 'Query', @@ -519,6 +521,58 @@ describe('client', () => { }); }); + it('should be able to transform queries on forced fetches', (done) => { + const query = gql` + query { + author { + firstName + lastName + } + }`; + const transformedQuery = gql` + query { + author { + firstName + lastName + __typename + } + __typename + }`; + const result = { + 'author': { + 'firstName': 'John', + 'lastName': 'Smith', + }, + }; + const transformedResult = { + 'author': { + 'firstName': 'John', + 'lastName': 'Smith', + '__typename': 'Author', + }, + '__typename': 'RootQuery', + }; + const networkInterface = mockNetworkInterface( + { + request: { query }, + result: { data: result }, + }, + { + request: { query: transformedQuery }, + result: { data: transformedResult }, + }); + + const client = new ApolloClient({ + networkInterface, + queryTransformer: addTypenameToSelectionSet, + }); + client.query({ forceFetch: true, query }).then((actualResult) => { + assert.deepEqual(actualResult.data, transformedResult); + done(); + }); + + }); + describe('accepts dataIdFromObject option', () => { const query = gql` query people { diff --git a/test/queryTransform.ts b/test/queryTransform.ts index d395e8b642f..d0efa9978dd 100644 --- a/test/queryTransform.ts +++ b/test/queryTransform.ts @@ -145,4 +145,76 @@ describe('query transforms', () => { assert.equal(print(expectedQuery), print(modifiedQuery)); }); + + it('should add typename fields correctly on this one query' , () => { + const testQuery = getQueryDefinition(gql` + query Feed($type: FeedType!) { + # Eventually move this into a no fetch query right on the entry + # since we literally just need this info to determine whether to + # show upvote/downvote buttons + currentUser { + login + } + feed(type: $type) { + createdAt + score + commentCount + id + postedBy { + login + html_url + } + + repository { + name + full_name + description + html_url + stargazers_count + open_issues_count + created_at + owner { + avatar_url + } + } + } + }`); + const expectedQuery = getQueryDefinition(gql` + query Feed($type: FeedType!) { + currentUser { + login + __typename + } + feed(type: $type) { + createdAt + score + commentCount + id + postedBy { + login + html_url + __typename + } + + repository { + name + full_name + description + html_url + stargazers_count + open_issues_count + created_at + owner { + avatar_url + __typename + } + __typename + } + __typename + } + __typename + }`); + const modifiedQuery = applyTransformerToOperation(testQuery, addTypenameToSelectionSet); + assert.equal(print(expectedQuery), print(modifiedQuery)); + }); });