react-touch
Version:
React wrapper components that make touch events easy
223 lines (184 loc) • 8.28 kB
JavaScript
'use strict';
var _chai = require('chai');
var _sinon = require('sinon');
var _sinon2 = _interopRequireDefault(_sinon);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _reactAddonsTestUtils = require('react-addons-test-utils');
var _reactAddonsTestUtils2 = _interopRequireDefault(_reactAddonsTestUtils);
var _helpers = require('./helpers');
var _Holdable = require('../Holdable.react');
var _Holdable2 = _interopRequireDefault(_Holdable);
var _defineHold = require('../defineHold');
var _defineHold2 = _interopRequireDefault(_defineHold);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint-disable no-unused-expressions */
var clock = void 0;
var renderHoldable = (0, _helpers.renderComponent)(_Holdable2.default);
describe("Holdable", function () {
beforeEach(function () {
clock = _sinon2.default.useFakeTimers();
});
afterEach(function () {
clock.restore();
});
it("should pass updates to callback child as 'holdProgress'", function () {
var progressUpdates = [];
var holdable = _reactAddonsTestUtils2.default.renderIntoDocument(_react2.default.createElement(
_Holdable2.default,
null,
function (_ref) {
var holdProgress = _ref.holdProgress;
progressUpdates.push(holdProgress);
return _react2.default.createElement('div', null);
}
));
_reactAddonsTestUtils2.default.Simulate.touchStart(_reactDom2.default.findDOMNode(holdable));
clock.tick(250);
(0, _chai.expect)(progressUpdates).to.be.lengthOf(3);
clock.tick(250);
(0, _chai.expect)(progressUpdates[3]).to.be.above(progressUpdates[2]);
});
it("should fire a callback 'onHoldProgress' when progress is made", function () {
var spy = _sinon2.default.spy();
var holdable = renderHoldable({ onHoldProgress: spy });
_reactAddonsTestUtils2.default.Simulate.touchStart(_reactDom2.default.findDOMNode(holdable));
clock.tick(1000);
(0, _chai.expect)(spy.callCount).to.be.equal(4);
});
it("should fire a callback 'onHoldComplete' after hold is completed", function () {
var spy = _sinon2.default.spy();
var holdable = renderHoldable({ onHoldComplete: spy });
_reactAddonsTestUtils2.default.Simulate.touchStart(_reactDom2.default.findDOMNode(holdable));
clock.tick(1500);
(0, _chai.expect)(spy.calledOnce).to.be.true;
});
it("should stop firing 'onHoldProgress' when touch is moved", function () {
var spy = _sinon2.default.spy();
var holdable = renderHoldable({ onHoldProgress: spy });
_reactAddonsTestUtils2.default.Simulate.touchStart(_reactDom2.default.findDOMNode(holdable));
clock.tick(250);
(0, _chai.expect)(spy.calledOnce).to.be.true;
(0, _helpers.documentEvent)('touchmove');
clock.tick(250);
(0, _chai.expect)(spy.calledOnce).to.be.true;
});
it("should not fire 'onHoldComplete' when touch is moved", function () {
var spy = _sinon2.default.spy();
var holdable = renderHoldable({ onHoldComplete: spy });
_reactAddonsTestUtils2.default.Simulate.touchStart(_reactDom2.default.findDOMNode(holdable));
clock.tick(250);
(0, _helpers.documentEvent)('touchmove');
(0, _chai.expect)(spy.notCalled).to.be.true;
clock.tick(1000);
(0, _chai.expect)(spy.notCalled).to.be.true;
});
it("should stop firing 'onHoldProgress' when touch is released", function () {
var spy = _sinon2.default.spy();
var holdable = renderHoldable({ onHoldProgress: spy });
_reactAddonsTestUtils2.default.Simulate.touchStart(_reactDom2.default.findDOMNode(holdable));
clock.tick(250);
(0, _helpers.documentEvent)('touchend');
clock.tick(250);
(0, _chai.expect)(spy.calledOnce).to.be.true;
});
it("should not fire 'onHoldComplete' when touch is released", function () {
var spy = _sinon2.default.spy();
var holdable = renderHoldable({ onHoldComplete: spy });
_reactAddonsTestUtils2.default.Simulate.touchStart(_reactDom2.default.findDOMNode(holdable));
clock.tick(250);
(0, _helpers.documentEvent)('touchend');
clock.tick(1000);
(0, _chai.expect)(spy.notCalled).to.be.true;
});
it("should reset the state when touch is ended", function () {
var holdable = renderHoldable();
_reactAddonsTestUtils2.default.Simulate.touchStart(_reactDom2.default.findDOMNode(holdable));
(0, _helpers.documentEvent)('touchend');
(0, _chai.expect)(holdable.state).to.eql({ initial: null, current: null, duration: 0 });
});
it("should alter its progress updates when 'updateEvery' is used", function () {
var spy = _sinon2.default.spy();
var config = (0, _defineHold2.default)({ updateEvery: 50 });
var holdable = renderHoldable({ onHoldProgress: spy, config: config });
_reactAddonsTestUtils2.default.Simulate.touchStart(_reactDom2.default.findDOMNode(holdable));
(0, _chai.expect)(spy.notCalled).to.be.true;
clock.tick(50);
(0, _chai.expect)(spy.calledOnce).to.be.true;
clock.tick(50);
(0, _chai.expect)(spy.calledTwice).to.be.true;
clock.tick(50);
(0, _chai.expect)(spy.calledThrice).to.be.true;
});
it("should alter its hold length when 'holdFor' is used", function () {
var spy = _sinon2.default.spy();
var config = (0, _defineHold2.default)({ holdFor: 500 });
var holdable = renderHoldable({ onHoldComplete: spy, config: config });
_reactAddonsTestUtils2.default.Simulate.touchStart(_reactDom2.default.findDOMNode(holdable));
clock.tick(250);
(0, _chai.expect)(spy.notCalled).to.be.true;
clock.tick(500);
(0, _chai.expect)(spy.calledOnce).to.be.true;
clock.tick(500);
(0, _chai.expect)(spy.calledOnce).to.be.true;
});
it("should render its child as its only output", function () {
var renderer = _reactAddonsTestUtils2.default.createRenderer();
renderer.render(_react2.default.createElement(
_Holdable2.default,
null,
_react2.default.createElement('div', null)
));
var output = renderer.getRenderOutput();
(0, _chai.expect)(output.type).to.be.equal('div');
});
it("should pass the correct props to nested react-touch components", function () {
var renderer = _reactAddonsTestUtils2.default.createRenderer();
renderer.render(_react2.default.createElement(
_Holdable2.default,
null,
_react2.default.createElement(
_Holdable2.default,
null,
_react2.default.createElement('div', null)
)
));
var output = renderer.getRenderOutput();
(0, _chai.expect)(output.props).to.have.keys(['__passThrough', 'children', 'config', 'onMouseDown', 'onTouchStart', 'onHoldComplete', 'onHoldProgress']);
});
it("should not pass custom props to its children", function () {
var renderer = _reactAddonsTestUtils2.default.createRenderer();
renderer.render(_react2.default.createElement(
_Holdable2.default,
null,
_react2.default.createElement(_helpers.ExampleComponent, null)
));
var output = renderer.getRenderOutput();
(0, _chai.expect)(output.props).to.have.keys(['onMouseDown', 'onTouchStart']);
});
it("should not pass custom props down to DOM nodes", function () {
var renderer = _reactAddonsTestUtils2.default.createRenderer();
renderer.render(_react2.default.createElement(
_Holdable2.default,
null,
_react2.default.createElement('div', null)
));
var output = renderer.getRenderOutput();
(0, _chai.expect)(output.props).to.have.keys(['onMouseDown', 'onTouchStart']);
});
it("should remove timers and listeners when the component unmounts", function () {
var container = document.createElement('div');
var spy = _sinon2.default.spy();
var holdable = _reactDom2.default.render(_react2.default.createElement(
_Holdable2.default,
{ onHoldProgress: spy },
_react2.default.createElement('div', null)
), container);
_reactAddonsTestUtils2.default.Simulate.touchStart(_reactDom2.default.findDOMNode(holdable));
_reactDom2.default.unmountComponentAtNode(container);
clock.tick(250);
(0, _chai.expect)(spy.notCalled).to.be.true;
});
});