diff --git a/libs/react-helpers/src/lib/generic-data-provider.spec.ts b/libs/react-helpers/src/lib/generic-data-provider.spec.ts index 96c6f9e58..7a00ac42e 100644 --- a/libs/react-helpers/src/lib/generic-data-provider.spec.ts +++ b/libs/react-helpers/src/lib/generic-data-provider.spec.ts @@ -19,11 +19,12 @@ import type { OperationVariables, ApolloQueryResult, QueryOptions, - ApolloError, } from '@apollo/client'; +import { ApolloError } from '@apollo/client'; +import type { GraphQLErrors } from '@apollo/client/errors'; import { GraphQLError } from 'graphql'; - import type { Subscription, Observable } from 'zen-observable-ts'; +import { waitFor } from '@testing-library/react'; type Item = { cursor: string; @@ -108,6 +109,23 @@ const paginatedSubscribe = makeDataProvider< }, }); +const mockErrorPolicyGuard: (errors: GraphQLErrors) => boolean = jest + .fn() + .mockImplementation(() => true); +const errorGuardedSubscribe = makeDataProvider< + QueryData, + Data, + SubscriptionData, + Delta +>({ + query, + subscriptionQuery, + update, + getData, + getDelta, + errorPolicyGuard: mockErrorPolicyGuard, +}); + const derivedSubscribe = makeDerivedDataProvider( [paginatedSubscribe, subscribe], combineData, @@ -537,6 +555,34 @@ describe('data provider', () => { expect(lastCallbackArgs[0].totalCount).toBe(100); subscription.unsubscribe(); }); + + it('errorPolicyGuard should work properly', async () => { + const subscription = errorGuardedSubscribe(callback, client); + const graphQLError = new GraphQLError( + '', + undefined, + undefined, + undefined, + ['market', 'data'], + undefined, + { + type: 'Internal', + } + ); + const graphQLErrors = [graphQLError]; + const error = new ApolloError({ graphQLErrors }); + + await rejectQuery(error); + const data = generateData(0, 5); + await resolveQuery({ + data, + }); + expect(mockErrorPolicyGuard).toHaveBeenNthCalledWith(1, graphQLErrors); + await waitFor(() => + expect(getData).toHaveBeenCalledWith({ data }, undefined) + ); + subscription.unsubscribe(); + }); }); describe('derived data provider', () => { diff --git a/libs/react-helpers/src/lib/generic-data-provider.ts b/libs/react-helpers/src/lib/generic-data-provider.ts index 2f891e522..9bc11e37f 100644 --- a/libs/react-helpers/src/lib/generic-data-provider.ts +++ b/libs/react-helpers/src/lib/generic-data-provider.ts @@ -190,6 +190,9 @@ interface DataProviderParams< * @param getData transforms received query data to format that will be stored in data provider * @param getDelta transforms delta data to format that will be stored in data provider * @param fetchPolicy + * @param resetDelay + * @param additionalContext add property to the context of the query, ie. 'isEnlargedTimeout' + * @param errorPolicyGuard indicate which gql errors can be tolerate * @returns subscribe function */ function makeDataProviderInternal<