diff --git a/packages/apollo-client/src/__tests__/fetchMore.ts b/packages/apollo-client/src/__tests__/fetchMore.ts index f196e2e45ef..602004cff3c 100644 --- a/packages/apollo-client/src/__tests__/fetchMore.ts +++ b/packages/apollo-client/src/__tests__/fetchMore.ts @@ -473,6 +473,41 @@ describe('fetchMore on an observable query', () => { }, }); }); + + it('will not leak fetchMore query', () => { + latestResult = null; + var beforeQueryCount; + return setup({ + request: { + query, + variables: variablesMore, + }, + result: resultMore, + }) + .then(watchedQuery => { + beforeQueryCount = Object.keys( + client.queryManager.queryStore.getStore(), + ).length; + return watchedQuery.fetchMore({ + variables: { start: 10 }, // rely on the fact that the original variables had limit: 10 + updateQuery: (prev, options) => { + const state = cloneDeep(prev) as any; + state.entry.comments = [ + ...state.entry.comments, + ...(options.fetchMoreResult as any).entry.comments, + ]; + return state; + }, + }); + }) + .then(data => { + var afterQueryCount = Object.keys( + client.queryManager.queryStore.getStore(), + ).length; + expect(afterQueryCount).toBe(beforeQueryCount); + unsetup(); + }); + }); }); describe('fetchMore on an observable query with connection', () => { diff --git a/packages/apollo-client/src/core/ObservableQuery.ts b/packages/apollo-client/src/core/ObservableQuery.ts index 39764ef92db..318d8f078cf 100644 --- a/packages/apollo-client/src/core/ObservableQuery.ts +++ b/packages/apollo-client/src/core/ObservableQuery.ts @@ -337,10 +337,11 @@ export class ObservableQuery< } let combinedOptions: any; + let qid: string; return Promise.resolve() .then(() => { - const qid = this.queryManager.generateQueryId(); + qid = this.queryManager.generateQueryId(); if (fetchMoreOptions.query) { // fetch a new query @@ -374,6 +375,7 @@ export class ObservableQuery< variables: combinedOptions.variables, }), ); + this.queryManager.stopQuery(qid); return fetchMoreResult as ApolloQueryResult; });