Home Reference Source Repository

src/store/__tests__/RelayQueryWriter-test.js

/**
 * Copyright (c) 2013-present, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 *
 * @emails oncall+relay
 */

'use strict';

require('configureForRelayOSS');

const Relay = require('Relay');
const RelayChangeTracker = require('RelayChangeTracker');
const RelayQueryPath = require('RelayQueryPath');
const RelayQueryTracker = require('RelayQueryTracker');
const RelayQueryWriter = require('RelayQueryWriter');
const RelayRecordStore = require('RelayRecordStore');
const RelayRecordWriter = require('RelayRecordWriter');
const RelayTestUtils = require('RelayTestUtils');

const {getNode} = RelayTestUtils;

describe('RelayQueryWriter', () => {
  let changeTracker;
  let node;
  let path;
  let payload;
  let recordID;
  let recordWriter;
  let records;
  let store;

  beforeEach(() => {
    records = {};
    store = new RelayRecordStore({records});
    recordWriter = new RelayRecordWriter(records, {}, false);
    changeTracker = new RelayChangeTracker();
    node = getNode(Relay.QL`query { me }`);
    path = RelayQueryPath.create(node);
    payload = {
      __typename: 'User',
      id: '660361306',
    };
    recordID = '660361306';
  });

  describe('query tracking', () => {
    it('tracks a node upon creation', () => {
      const queryTracker = new RelayQueryTracker();
      const trackNodeForID = queryTracker.trackNodeForID = jest.fn();
      const queryWriter = new RelayQueryWriter(
        store,
        recordWriter,
        queryTracker,
        changeTracker,
      );
      queryWriter.createRecordIfMissing(node, recordID, path, payload);

      // The interesting bit:
      expect(trackNodeForID).toBeCalledWith(node, recordID);

      // Sanity check.
      expect(records).toEqual({
        [recordID]: {
          __dataID__: recordID,
          __typename: 'User',
        },
      });
    });

    it('degrades gracefully in the absence of a configured tracker', () => {
      const queryWriter = new RelayQueryWriter(
        store,
        recordWriter,
        null,
        changeTracker,
      );

      // The interesting bit:
      expect(() => {
        queryWriter.createRecordIfMissing(node, recordID, path, payload);
      }).not.toThrow();

      // Sanity check.
      expect(records).toEqual({
        [recordID]: {
          __dataID__: recordID,
          __typename: 'User',
        },
      });
    });
  });
});