@activelylearn/material-ui
Version:
Material-UI's workspace package
179 lines (145 loc) • 6.22 kB
JavaScript
import React from 'react';
import { useFakeTimers } from 'sinon';
import { assert } from 'chai';
import { createShallow, createMount, getClasses, unwrap } from '../test-utils';
import TouchRipple, { DELAY_RIPPLE } from './TouchRipple';
describe('<TouchRipple />', () => {
let shallow;
let mount;
let classes;
const TouchRippleNaked = unwrap(TouchRipple);
before(() => {
shallow = createShallow({ dive: true });
mount = createMount();
classes = getClasses(<TouchRipple />);
});
after(() => {
mount.cleanUp();
});
it('should render a <ReactTransitionGroup> component', () => {
const wrapper = shallow(<TouchRipple />);
assert.strictEqual(wrapper.name(), 'TransitionGroup');
assert.strictEqual(wrapper.props().component, 'span', 'should be pass a span as the component');
assert.strictEqual(wrapper.hasClass(classes.root), true, 'should have the root class');
});
it('should render the custom className', () => {
const wrapper = shallow(<TouchRipple className="test-class-name" />);
assert.strictEqual(wrapper.is('.test-class-name'), true, 'should contain the test className');
});
describe('prop: center', () => {
it('should should compute the right ripple dimensions', () => {
const wrapper = shallow(<TouchRipple center />);
const instance = wrapper.instance();
instance.start(
{},
{
fakeElement: true,
},
);
wrapper.update();
assert.strictEqual(wrapper.childAt(0).props().rippleSize, 1, 'should be odd');
});
});
it('should create individual ripples', () => {
const wrapper = mount(<TouchRippleNaked classes={{}} />);
const instance = wrapper.instance();
assert.strictEqual(wrapper.state().ripples.length, 0, 'should start with no ripples');
instance.start({ clientX: 0, clientY: 0 });
assert.strictEqual(wrapper.state().ripples.length, 1, 'should create a ripple');
instance.start({ clientX: 0, clientY: 0 });
assert.strictEqual(wrapper.state().ripples.length, 2, 'should create another ripple');
instance.start({ clientX: 0, clientY: 0 });
assert.strictEqual(wrapper.state().ripples.length, 3, 'should create another ripple');
instance.stop({ type: 'mouseup' });
assert.strictEqual(wrapper.state().ripples.length, 2, 'should remove a ripple');
instance.stop({ type: 'mouseup' });
assert.strictEqual(wrapper.state().ripples.length, 1, 'should remove a ripple');
instance.stop({ type: 'mouseup' });
assert.strictEqual(wrapper.state().ripples.length, 0, 'should remove all the ripples');
});
describe('creating unique ripples', () => {
it('should create a ripple', () => {
const wrapper = shallow(<TouchRipple />);
const instance = wrapper.instance();
instance.start(
{},
{
pulsate: true,
fakeElement: true,
},
);
assert.strictEqual(wrapper.state().ripples.length, 1);
});
it('should ignore a mousedown event', () => {
const wrapper = shallow(<TouchRipple />);
const instance = wrapper.instance();
instance.ignoringMouseDown = true;
instance.start({ type: 'mousedown' });
assert.strictEqual(wrapper.state().ripples.length, 0);
});
it('should set ignoringMouseDown to true', () => {
const wrapper = shallow(<TouchRipple />);
const instance = wrapper.instance();
assert.strictEqual(instance.ignoringMouseDown, false);
instance.start({ type: 'touchstart' }, { fakeElement: true });
assert.strictEqual(wrapper.state().ripples.length, 1);
assert.strictEqual(instance.ignoringMouseDown, true);
});
it('should create a specific ripple', () => {
const wrapper = shallow(<TouchRipple />);
const instance = wrapper.instance();
const clientX = 1;
const clientY = 1;
instance.start({ clientX, clientY }, { fakeElement: true });
assert.strictEqual(wrapper.state().ripples.length, 1);
assert.strictEqual(wrapper.state().ripples[0].props.rippleX, clientX);
assert.strictEqual(wrapper.state().ripples[0].props.rippleY, clientY);
});
});
describe('mobile', () => {
let clock;
before(() => {
clock = useFakeTimers();
});
after(() => {
clock.restore();
});
it('should delay the display of the ripples', () => {
const wrapper = shallow(<TouchRipple />);
const instance = wrapper.instance();
assert.strictEqual(wrapper.state().ripples.length, 0);
instance.start({ touches: [], clientX: 0, clientY: 0 }, { fakeElement: true });
assert.strictEqual(wrapper.state().ripples.length, 0);
clock.tick(DELAY_RIPPLE);
assert.strictEqual(wrapper.state().ripples.length, 1);
clock.tick(DELAY_RIPPLE);
instance.stop({ type: 'touchend' });
assert.strictEqual(wrapper.state().ripples.length, 0);
});
it('should trigger the ripple for short touch interactions', () => {
const wrapper = shallow(<TouchRipple />);
const instance = wrapper.instance();
assert.strictEqual(wrapper.state().ripples.length, 0);
instance.start({ touches: [], clientX: 0, clientY: 0 }, { fakeElement: true });
assert.strictEqual(wrapper.state().ripples.length, 0);
clock.tick(DELAY_RIPPLE / 2);
assert.strictEqual(wrapper.state().ripples.length, 0);
instance.stop({ type: 'touchend', persist: () => {} });
assert.strictEqual(wrapper.state().ripples.length, 1);
clock.tick(1);
assert.strictEqual(wrapper.state().ripples.length, 0);
});
it('should interupt the ripple schedule', () => {
const wrapper = shallow(<TouchRipple />);
const instance = wrapper.instance();
assert.strictEqual(wrapper.state().ripples.length, 0);
instance.start({ touches: [], clientX: 0, clientY: 0 }, { fakeElement: true });
assert.strictEqual(wrapper.state().ripples.length, 0);
clock.tick(DELAY_RIPPLE / 2);
assert.strictEqual(wrapper.state().ripples.length, 0);
instance.stop({ type: 'touchmove' });
clock.tick(DELAY_RIPPLE);
assert.strictEqual(wrapper.state().ripples.length, 0);
});
});
});