graphqlEnvironment.test.ts 3.0 KB

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