From 691b80d825efd3576d8b04eabcf9f03bb79ff5e8 Mon Sep 17 00:00:00 2001 From: hwillson Date: Tue, 13 Aug 2019 16:16:40 -0400 Subject: [PATCH] Add test to verify error is persisted on re-render, when appropriate Issue #3295 demonstrates a problem where errors aren't maintained on re-renders, when they should still be available. This issue was fixed by PR #3339, but this commit will add an extra test to verify that the issue is indeed fixed. Fixes #3295. --- .../hooks/src/__tests__/useQuery.test.tsx | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/packages/hooks/src/__tests__/useQuery.test.tsx b/packages/hooks/src/__tests__/useQuery.test.tsx index 84c18c23e1..62e626ddd9 100644 --- a/packages/hooks/src/__tests__/useQuery.test.tsx +++ b/packages/hooks/src/__tests__/useQuery.test.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useReducer } from 'react'; import { DocumentNode, GraphQLError } from 'graphql'; import gql from 'graphql-tag'; import { MockedProvider, MockLink } from '@apollo/react-testing'; @@ -319,5 +319,59 @@ describe('useQuery Hook', () => { ); }); + + it('should persist errors on re-render if they are still valid', done => { + const query = gql` + query SomeQuery { + stuff { + thing + } + } + `; + + const mocks = [ + { + request: { query }, + result: { + errors: [new GraphQLError('forced error')] + } + } + ]; + + let renderCount = 0; + function App() { + const [_, forceUpdate] = useReducer(x => x + 1, 0); + const { loading, error } = useQuery(query); + + switch (renderCount) { + case 0: + expect(loading).toBeTruthy(); + expect(error).toBeUndefined(); + break; + case 1: + expect(error).toBeDefined(); + expect(error!.message).toEqual('GraphQL error: forced error'); + setTimeout(() => { + forceUpdate(0); + }); + break; + case 2: + expect(error).toBeDefined(); + expect(error!.message).toEqual('GraphQL error: forced error'); + done(); + break; + default: // Do nothing + } + + renderCount += 1; + return null; + } + + render( + + + + ); + }); }); });