UNPKG

apollo-link-queue

Version:

A link to queue requests when a certain condition is met (eg. device is offline)

80 lines (74 loc) 2.71 kB
import { ApolloLink, FetchResult, Operation, } from '@apollo/client/link/core'; import { Observable, Observer } from '@apollo/client/utilities'; import { ExecutionResult, } from 'graphql'; export class TestLink extends ApolloLink { public operations: Operation[]; constructor() { super(); this.operations = []; } public request (operation: Operation) { this.operations.push(operation); // TODO(helfer): Throw an error if neither testError nor testResponse is defined return new Observable<FetchResult>((observer: Observer<FetchResult>) => { if (operation.getContext().testError) { setTimeout(() => observer.error(operation.getContext().testError), 0); return; } setTimeout(() => observer.next(operation.getContext().testResponse), 0); setTimeout(() => observer.complete(), 0); }); } } export interface ObservableValue { value?: ExecutionResult | Error; delay?: number; type: 'next' | 'error' | 'complete'; } export interface Unsubscribable { unsubscribe: () => void; } export const assertObservableSequence = ( observable: Observable<ExecutionResult>, sequence: ObservableValue[], initializer: (sub: Unsubscribable) => void = () => undefined, ): Promise<boolean | Error> => { let index = 0; if (sequence.length === 0) { throw new Error('Observable sequence must have at least one element'); } return new Promise((resolve, reject) => { const sub = observable.subscribe({ next: (value: FetchResult) => { expect({ type: 'next', value }).toEqual(sequence[index]); index++; if (index === sequence.length) { resolve(true); } }, error: (value: FetchResult) => { expect({ type: 'error', value }).toEqual(sequence[index]); index++; // This check makes sure that there is no next element in // the sequence. If there is, it will print a somewhat useful error expect(undefined).toEqual(sequence[index]); resolve(true); }, complete: () => { expect({ type: 'complete' }).toEqual(sequence[index]); index++; // This check makes sure that there is no next element in // the sequence. If there is, it will print a somewhat useful error expect(undefined).toEqual(sequence[index]); resolve(true); }, }); initializer(sub); }); };