Home Reference Source Repository

src/container/__tests__/RelayContainer_hasFragmentData-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';

jest.mock('warning');

require('configureForRelayOSS');

const React = require('React');
const Relay = require('Relay');
const RelayEnvironment = require('RelayEnvironment');
const RelayQueryConfig = require('RelayQueryConfig');
const RelayRecord = require('RelayRecord');
const RelayTestUtils = require('RelayTestUtils');

describe('RelayContainer', () => {
  const {getNode} = RelayTestUtils;

  const getFragmentCompositeHash = (fragmentReference, queryConfig) => {
    const variables = {};
    const concreteFragmentID = fragmentReference.getFragment(variables);
    const fragment = getNode(concreteFragmentID, variables, queryConfig);
    return fragment.getCompositeHash();
  };

  describe('hasFragmentData()', () => {
    let MockContainer;
    let container;
    let queryConfig;
    let store;

    beforeEach(() => {
      jest.resetModuleRegistry();

      class MockComponent extends React.Component {
        render() {
          return <div />;
        }
      }
      MockContainer = Relay.createContainer(MockComponent, {
        fragments: {
          foo: () => Relay.QL`fragment on Node{id}`,
        },
      });
      const RelayTestRenderer = RelayTestUtils.createRenderer();

      const environment = new RelayEnvironment();
      queryConfig = RelayQueryConfig.genMockInstance();
      container = RelayTestRenderer.render(
        genMockPointer => <MockContainer foo={genMockPointer('42')} />,
        environment,
        queryConfig
      );
      store = environment.getStoreData().getCachedStore();

      jasmine.addMatchers(RelayTestUtils.matchers);
    });

    it('returns true for deferred fragments with resolved data', () => {
      store.hasFragmentData = jest.fn(() => true);
      const hasData = container.hasFragmentData(
        MockContainer.getFragment('foo').defer(),
        RelayRecord.create('42')
      );
      expect(hasData).toBe(true);
      expect(store.hasFragmentData).toBeCalledWith(
        '42',
        getFragmentCompositeHash(MockContainer.getFragment('foo'), queryConfig)
      );
    });

    it('returns false for deferred fragments without resolved data', () => {
      store.hasFragmentData = jest.fn(() => false);
      const hasData = container.hasFragmentData(
       MockContainer.getFragment('foo').defer(),
       RelayRecord.create('42')
      );
      expect(hasData).toBe(false);
      expect(store.hasFragmentData).toBeCalledWith(
        '42',
        getFragmentCompositeHash(MockContainer.getFragment('foo'), queryConfig)
      );
    });
  });
});