Something went wrong. Try again.
Mirror: The highly customizable and versatile GraphQL client with which you add on features like normalized caching as you grow.
Something went wrong. Try again.
7.0 kB · 262 lines
TSX
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263// @vitest-environment jsdom
import { expect, it, describe, vi } from 'vitest';import { CreateQueryState, createQuery } from './createQuery';import { renderHook, testEffect } from '@solidjs/testing-library';import { createClient } from '@urql/core';import { createEffect, createSignal } from 'solid-js';import { makeSubject } from 'wonka';import { OperationResult, OperationResultSource } from '@urql/core';
const client = createClient({ url: '/graphql', exchanges: [], suspense: false,});
vi.mock('./context', () => { const useClient = () => { return client!; };
return { useClient };});
// Given that it is not possible to directly listen to all store changes it is necessary// to access all relevant parts on which `createEffect` should listen onconst markStateDependencies = (state: CreateQueryState<any, any>) => { state.data; state.error; state.extensions; state.fetching; state.operation; state.stale;};
describe('createQuery', () => { it('should fetch when query is resumed', () => { const subject = makeSubject<Pick<OperationResult<{ test: boolean }, any>, 'data'>>(); const executeQuery = vi .spyOn(client, 'executeQuery') .mockImplementation( () => subject.source as OperationResultSource<OperationResult> );
return testEffect(done => { const [pause, setPause] = createSignal<boolean>(true); const [state] = createQuery<{ test: boolean }, { variable: number }>({ query: '{ test }', pause: pause, });
createEffect((run: number = 0) => { markStateDependencies(state);
switch (run) { case 0: { expect(state.fetching).toEqual(false); expect(executeQuery).not.toHaveBeenCalled(); setPause(false); break; } case 1: { expect(state.fetching).toEqual(true); expect(executeQuery).toHaveBeenCalledOnce(); subject.next({ data: { test: true } }); break; } case 2: { expect(state.fetching).toEqual(false); expect(state.data).toStrictEqual({ test: true }); done(); break; } }
return run + 1; }); }); });
it('should override pause when execute via refetch', () => { const subject = makeSubject<Pick<OperationResult<{ test: boolean }, any>, 'data'>>(); const executeQuery = vi .spyOn(client, 'executeQuery') .mockImplementation( () => subject.source as OperationResultSource<OperationResult> );
return testEffect(done => { const [state, refetch] = createQuery< { test: boolean }, { variable: number } >({ query: '{ test }', pause: true, });
createEffect((run: number = 0) => { markStateDependencies(state);
switch (run) { case 0: { expect(state.fetching).toEqual(false); expect(executeQuery).not.toBeCalled(); refetch(); break; } case 1: { expect(state.fetching).toEqual(true); expect(executeQuery).toHaveBeenCalledOnce(); subject.next({ data: { test: true } }); break; } case 2: { expect(state.fetching).toEqual(false); expect(state.data).toStrictEqual({ test: true }); done(); break; } }
return run + 1; }); }); });
it('should trigger refetch on variables change', () => { const subject = makeSubject<Pick<OperationResult<{ test: boolean }, any>, 'data'>>(); const executeQuery = vi .spyOn(client, 'executeQuery') .mockImplementation( () => subject.source as OperationResultSource<OperationResult> );
return testEffect(done => { const [variables, setVariables] = createSignal<{ variable: number }>({ variable: 1, });
const [state] = createQuery<{ test: boolean }, { variable: number }>({ query: '{ test }', variables: variables, });
createEffect((run: number = 0) => { markStateDependencies(state);
switch (run) { case 0: { expect(state.fetching).toEqual(true);
subject.next({ data: { test: true } });
break; } case 1: { expect(state.fetching).toEqual(false); expect(state.data).toEqual({ test: true }); setVariables({ variable: 2 }); break; } case 2: { expect(state.fetching).toEqual(true); expect(executeQuery).toHaveBeenCalledTimes(2);
subject.next({ data: { test: false } }); break; } case 3: { expect(state.fetching).toEqual(false); expect(state.data).toEqual({ test: false }); done(); break; } }
return run + 1; }); }); });
it('should receive data', () => { const subject = makeSubject<Pick<OperationResult<{ test: boolean }, any>, 'data'>>(); const executeQuery = vi .spyOn(client, 'executeQuery') .mockImplementation( () => subject.source as OperationResultSource<OperationResult> );
return testEffect(done => { const [state] = createQuery<{ test: boolean }, { variable: number }>({ query: '{ test }', });
createEffect((run: number = 0) => { markStateDependencies(state);
switch (run) { case 0: { expect(state.fetching).toEqual(true); expect(state.data).toBeUndefined();
subject.next({ data: { test: true } }); break; }
case 1: { expect(state.fetching).toEqual(false); expect(state.data).toStrictEqual({ test: true }); expect(executeQuery).toHaveBeenCalledTimes(1); done(); break; } }
return run + 1; }); }); });
it('should unsubscribe on teardown', () => { const subject = makeSubject<Pick<OperationResult<{ value: number }, any>, 'data'>>(); vi.spyOn(client, 'executeQuery').mockImplementation( () => subject.source as OperationResultSource<OperationResult> );
const { result: [state], cleanup, } = renderHook(() => createQuery<{ test: number }, { variable: number }>({ query: '{ test }', }) );
return testEffect(done => { markStateDependencies(state);
createEffect((run: number = 0) => { switch (run) { case 0: { expect(state.fetching).toEqual(true); cleanup(); break; } case 1: { expect(state.fetching).toEqual(false); done(); break; } }
return run + 1; }); }); });});