graphqlEnvironment.test.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import {RequestParameters, GraphQLResponse} from 'relay-runtime';
  2. import fetchMock from 'fetch-mock';
  3. import {cache, fetchQuery} from 'packs/frontend/graphqlEnvironment';
  4. describe('fetchQuery', () => {
  5. const defaultRequestParameters: RequestParameters = {
  6. name: 'test query',
  7. operationKind: 'query',
  8. metadata: {foo: 'bar'},
  9. id: null,
  10. text: 'dummy text',
  11. };
  12. afterEach(fetchMock.reset);
  13. it('builds the correct request', done => {
  14. fetchMock.mock('/api/graphql', {great: 'success', errors: []});
  15. const res = fetchQuery(defaultRequestParameters, {bar: 'baz'}, null);
  16. const opts = fetchMock.lastOptions();
  17. expect(opts.method).toEqual('POST');
  18. expect(opts.headers['Content-Type']).toEqual('application/json');
  19. expect(opts['body']).toEqual(
  20. JSON.stringify({query: 'dummy text', variables: {bar: 'baz'}})
  21. );
  22. (res as Promise<GraphQLResponse>).finally(() => {
  23. cache.clear();
  24. done();
  25. });
  26. });
  27. it('responds with json', done => {
  28. fetchMock.mock('/api/graphql', {great: 'success', errors: []});
  29. const res = fetchQuery(defaultRequestParameters, {bar: 'baz'}, null);
  30. (res as Promise<GraphQLResponse>)
  31. .then(data => expect(data).toEqual({great: 'success', errors: []}))
  32. .finally(() => {
  33. cache.clear();
  34. done();
  35. });
  36. });
  37. it('caches responses', done => {
  38. const variables = {bar: 'baz'};
  39. const expectedResponse = {great: 'success', errors: []};
  40. cache.set(defaultRequestParameters.name, variables, expectedResponse);
  41. fetchMock.postOnce('/api/graphql', {great: 'success 1', errors: []});
  42. const res = fetchQuery(defaultRequestParameters, variables, null);
  43. expect(fetchMock.calls().length).toEqual(0);
  44. (res as Promise<GraphQLResponse>)
  45. .then(data => {
  46. expect(data.extensions).not.toBeNull();
  47. expect(data.extensions.cacheTimestamp).not.toBeNull();
  48. // Remove cache data from response info after we've verified it exists
  49. delete data.extensions;
  50. expect(data).toEqual(expectedResponse);
  51. })
  52. .finally(() => {
  53. cache.clear();
  54. done();
  55. });
  56. });
  57. it('bypasses cache when force param given', done => {
  58. const variables = {bar: 'baz'};
  59. const cachedResponse = {great: 'success', errors: []};
  60. cache.set(defaultRequestParameters.name, variables, cachedResponse);
  61. fetchMock.postOnce('/api/graphql', {great: 'success 1', errors: []});
  62. const res = fetchQuery(defaultRequestParameters, variables, {force: true});
  63. expect(fetchMock.calls().length).toEqual(1);
  64. (res as Promise<GraphQLResponse>)
  65. .then(data => expect(data).toEqual({great: 'success 1', errors: []}))
  66. .finally(() => {
  67. cache.clear();
  68. done();
  69. });
  70. });
  71. });