"use strict";

require("core-js/modules/es.symbol");

require("core-js/modules/es.symbol.description");

require("core-js/modules/es.symbol.iterator");

require("core-js/modules/es.array.filter");

require("core-js/modules/es.array.find");

require("core-js/modules/es.array.for-each");

require("core-js/modules/es.array.iterator");

require("core-js/modules/es.object.create");

require("core-js/modules/es.object.define-properties");

require("core-js/modules/es.object.define-property");

require("core-js/modules/es.object.get-own-property-descriptor");

require("core-js/modules/es.object.get-own-property-descriptors");

require("core-js/modules/es.object.get-prototype-of");

require("core-js/modules/es.object.keys");

require("core-js/modules/es.object.set-prototype-of");

require("core-js/modules/es.object.to-string");

require("core-js/modules/es.string.iterator");

require("core-js/modules/web.dom-collections.for-each");

require("core-js/modules/web.dom-collections.iterator");

var _react = _interopRequireDefault(require("react"));

var _propTypes = _interopRequireDefault(require("prop-types"));

var _enzyme = require("enzyme");

var _ = _interopRequireDefault(require("."));

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }

function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }

function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }

function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }

function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }

function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }

function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }

function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }

function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }

// eslint-disable-next-line react/prefer-stateless-function
var Test =
/*#__PURE__*/
function (_React$Component) {
  _inherits(Test, _React$Component);

  function Test() {
    _classCallCheck(this, Test);

    return _possibleConstructorReturn(this, _getPrototypeOf(Test).apply(this, arguments));
  }

  return Test;
}(_react["default"].Component);

var defaultValues = {
  a: true,
  b: null,
  c: 15.5,
  d: {
    d1: 'nested'
  }
};

var TestWithDefaults =
/*#__PURE__*/
function (_Test) {
  _inherits(TestWithDefaults, _Test);

  function TestWithDefaults() {
    _classCallCheck(this, TestWithDefaults);

    return _possibleConstructorReturn(this, _getPrototypeOf(TestWithDefaults).apply(this, arguments));
  }

  _createClass(TestWithDefaults, [{
    key: "getDefaults",
    value: function getDefaults() {
      return defaultValues;
    }
  }]);

  return TestWithDefaults;
}(Test);

describe('HOC/handler', function () {
  it('extends class-based components', function () {
    var TestHandler = (0, _["default"])(Test);
    expect(TestHandler.displayName).toBe('handler(Test)');
    expect(function () {
      (0, _["default"])(function () {});
    }).toThrow('Cannot extend a functional component');
  });
  it('updates the state when receiving an onChange', function () {
    var DefaultHandler = (0, _["default"])(TestWithDefaults);
    var wrapper = (0, _enzyme.shallow)(_react["default"].createElement(DefaultHandler, null));
    var instance = wrapper.instance();
    var expectedVal = defaultValues;
    expect(wrapper.state().values).toEqual(defaultValues);
    expect(instance.getChildContext().ffGetValue()).toEqual(defaultValues);
    expectedVal = _objectSpread({}, expectedVal, {
      a: false
    });
    instance.onChange({
      target: {
        name: 'a',
        value: false
      }
    });
    expect(wrapper.state().values).toEqual(expectedVal);
    expect(instance.getChildContext().ffGetValue()).toEqual(expectedVal);
    instance.onChange({
      target: {
        name: ['d', 'd1'],
        value: 'updated'
      }
    });
    expectedVal = _objectSpread({}, expectedVal, {
      d: {
        d1: 'updated'
      }
    });
    expect(wrapper.state().values).toEqual(expectedVal);
    expect(instance.getChildContext().ffGetValue()).toEqual(expectedVal);
  });
  it('creates a form tag automatically', function () {
    var FormHandler = (0, _["default"])(Test);
    var wrapper = (0, _enzyme.shallow)(_react["default"].createElement(FormHandler, null));
    expect(wrapper.type()).toBe('form');
  });
  it('adds formProps() to the form', function () {
    var FormPropsHandler = (0, _["default"])(
    /*#__PURE__*/
    function (_Test2) {
      _inherits(_class, _Test2);

      function _class() {
        _classCallCheck(this, _class);

        return _possibleConstructorReturn(this, _getPrototypeOf(_class).apply(this, arguments));
      }

      _createClass(_class, [{
        key: "formProps",
        value: function formProps() {
          return {
            'data-myProp': true
          };
        }
      }]);

      return _class;
    }(Test));
    var wrapper = (0, _enzyme.shallow)(_react["default"].createElement(FormPropsHandler, null));
    expect(wrapper.type()).toBe('form');
    expect(wrapper.find('form').props()['data-myProp']).toBe(true);
  });
  it('retains childContext', function () {
    var _class2, _temp;

    var FormContextHandler = (0, _["default"])((_temp = _class2 =
    /*#__PURE__*/
    function (_Test3) {
      _inherits(_class2, _Test3);

      function _class2() {
        _classCallCheck(this, _class2);

        return _possibleConstructorReturn(this, _getPrototypeOf(_class2).apply(this, arguments));
      }

      _createClass(_class2, [{
        key: "getChildContext",
        value: function getChildContext() {
          return {
            test: true
          };
        }
      }]);

      return _class2;
    }(Test), _defineProperty(_class2, "childContextTypes", {
      test: _propTypes["default"].bool.isRequired
    }), _temp));
    expect(FormContextHandler.childContextTypes.test).toBe(_propTypes["default"].bool.isRequired);
    var wrapper = (0, _enzyme.shallow)(_react["default"].createElement(FormContextHandler, null));
    expect(wrapper.instance().getChildContext().test).toBe(true);
  });
  it('supports wrapped render', function () {
    var FormRenderHandler = (0, _["default"])(
    /*#__PURE__*/
    function (_Test4) {
      _inherits(_class3, _Test4);

      function _class3() {
        _classCallCheck(this, _class3);

        return _possibleConstructorReturn(this, _getPrototypeOf(_class3).apply(this, arguments));
      }

      _createClass(_class3, [{
        key: "render",
        value: function render() {
          return _react["default"].createElement("pre", null, this.props.children);
        }
      }]);

      return _class3;
    }(Test));
    var wrapper = (0, _enzyme.shallow)(_react["default"].createElement(FormRenderHandler, null));
    expect(wrapper.find('pre').exists()).toBe(true);
  });
  it('tracks form subscriptions', function () {
    var TestHandler = (0, _["default"])(Test);
    var instance = (0, _enzyme.shallow)(_react["default"].createElement(TestHandler, null)).instance();
    var context = instance.getChildContext();
    var updateCallback = jest.fn();
    context.formSubscription.subscribe(updateCallback);
    expect(updateCallback).not.toHaveBeenCalled();
    instance.triggerUpdate();
    expect(updateCallback).toHaveBeenCalledTimes(1);
    context.formSubscription.unsubscribe(updateCallback);
    instance.triggerUpdate();
    expect(updateCallback).toHaveBeenCalledTimes(1);
  });
  it('sets default name', function () {
    var DefaultHandler = (0, _["default"])(TestWithDefaults);
    var context = (0, _enzyme.shallow)(_react["default"].createElement(DefaultHandler, null)).instance().getChildContext();
    expect(context.ffFullName()).toEqual([]);
  });
});