diff --git a/src/react/data/QueryData.ts b/src/react/data/QueryData.ts index 9d97f7283e5..8014c13a989 100644 --- a/src/react/data/QueryData.ts +++ b/src/react/data/QueryData.ts @@ -8,7 +8,6 @@ import { FetchMoreQueryOptions, SubscribeToMoreOptions, ObservableQuery, - applyNextFetchPolicy, FetchMoreOptions, UpdateQueryOptions, DocumentNode, @@ -199,8 +198,6 @@ export class QueryData extends OperationData< options.fetchPolicy === 'cache-and-network') ) { options.fetchPolicy = 'cache-first'; - } else if (options.nextFetchPolicy && this.currentObservable) { - applyNextFetchPolicy(options); } return { diff --git a/src/react/hoc/__tests__/queries/skip.test.tsx b/src/react/hoc/__tests__/queries/skip.test.tsx index ff0d0b1a3dc..8b6a960da18 100644 --- a/src/react/hoc/__tests__/queries/skip.test.tsx +++ b/src/react/hoc/__tests__/queries/skip.test.tsx @@ -589,6 +589,7 @@ describe('[queries] skip', () => { const data = { allPeople: { people: [{ name: 'Luke Skywalker' }] } }; const nextData = { allPeople: { people: [{ name: 'Anakin Skywalker' }] } }; + const finalData = { allPeople: { people: [{ name: 'Darth Vader' }] } }; let ranQuery = 0; @@ -605,6 +606,14 @@ describe('[queries] skip', () => { request: { query }, result: { data: nextData }, }, + { + request: { query }, + result: { data: nextData }, + }, + { + request: { query }, + result: { data: finalData }, + }, ) ); @@ -625,6 +634,8 @@ describe('[queries] skip', () => { })( class extends React.Component { render() { + expect(this.props.data?.error).toBeUndefined(); + switch (++count) { case 1: expect(this.props.data.loading).toBe(true); @@ -639,40 +650,52 @@ describe('[queries] skip', () => { expect(ranQuery).toBe(1); setTimeout(() => { this.props.setSkip(true); - }); + }, 10); break; case 3: // This render is triggered after setting skip to true. Now // let's set skip to false to re-trigger the query. + expect(this.props.skip).toBe(true); expect(this.props.data).toBeUndefined(); expect(ranQuery).toBe(1); setTimeout(() => { this.props.setSkip(false); - }); + }, 10); break; case 4: + expect(this.props.skip).toBe(false); + expect(this.props.data!.loading).toBe(true); + expect(this.props.data.allPeople).toEqual(data.allPeople); + expect(ranQuery).toBe(2); + break; + case 5: + expect(this.props.skip).toBe(false); + expect(this.props.data!.loading).toBe(false); + expect(this.props.data.allPeople).toEqual(nextData.allPeople); + expect(ranQuery).toBe(3); // Since the `nextFetchPolicy` was set to `cache-first`, our // query isn't loading as it's able to find the result of the // query directly from the cache. Let's trigger a refetch // to manually load the next batch of data. - expect(this.props.data!.loading).toBe(false); - expect(this.props.data.allPeople).toEqual(data.allPeople); - expect(ranQuery).toBe(1); setTimeout(() => { this.props.data.refetch(); - }); + }, 10); break; - case 5: + case 6: + expect(this.props.skip).toBe(false); expect(this.props.data!.loading).toBe(true); - expect(ranQuery).toBe(2); + expect(this.props.data.allPeople).toEqual(nextData.allPeople); + expect(ranQuery).toBe(4); break; - case 6: + case 7: // The next batch of data has loaded. + expect(this.props.skip).toBe(false); expect(this.props.data!.loading).toBe(false); - expect(this.props.data.allPeople).toEqual(nextData.allPeople); - expect(ranQuery).toBe(2); + expect(this.props.data.allPeople).toEqual(finalData.allPeople); + expect(ranQuery).toBe(4); break; default: + throw new Error(`too many renders (${count})`); } return null; } @@ -698,7 +721,7 @@ describe('[queries] skip', () => { ); await wait(() => { - expect(count).toEqual(6); + expect(count).toEqual(7); }); });