react-scroll-trigger
Version:
React component tied to scroll events with callbacks for enter, exit and progress while scrolling through the viewport.
279 lines (231 loc) • 7 kB
JavaScript
import React from 'react';
import Enzyme, { mount, shallow } from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
import throttle from 'lodash.throttle';
import ScrollTrigger from './index';
import TestComponent from '../tools/TestComponent';
Enzyme.configure({
adapter: new Adapter(),
});
let component;
describe('<ScrollTrigger />', () => {
beforeEach(() => {
window.Element.prototype.getBoundingClientRect = () => {
return {
left: 0,
top: 0,
right: 0,
bottom: 0,
x: 0,
y: 0,
width: 0,
height: 0,
};
};
});
test('ScrollTrigger should render a div', () => {
component = mount(<ScrollTrigger />, {
attachTo: document.getElementById('root'),
});
expect(component.contains(<div></div>)).toBe(true);
component.unmount();
});
test('ScrollTrigger should render a specified component', () => {
component = mount(<ScrollTrigger component="section" />, {
attachTo: document.getElementById('root'),
});
expect(component.contains(<section></section>)).toBe(true);
component.unmount();
});
test('ScrollTrigger should render an element passed into component', () => {
component = mount(<ScrollTrigger component={<TestComponent />} />, {
attachTo: document.getElementById('root'),
});
expect(component.contains(<section></section>)).toBe(true);
component.unmount();
});
test('ScrollTrigger should render an element passed into component with children', () => {
component = mount(<ScrollTrigger component={<TestComponent />}><div></div></ScrollTrigger>, {
attachTo: document.getElementById('root'),
});
expect(component.contains(<section><div></div></section>)).toBe(true);
component.unmount();
});
test('ScrollTrigger fires onEnter when loaded', () => {
let onEnterFired = false;
const onEnter = () => {
onEnterFired = true;
};
component = mount(<ScrollTrigger onEnter={onEnter} />, {
attachTo: document.getElementById('root'),
});
expect(onEnterFired).toBe(true);
component.unmount();
});
test('ScrollTrigger _does not_ fire onEnter when loaded with triggerOnLoad = false', () => {
let onEnterFired = false;
const onEnter = () => {
onEnterFired = true;
};
component = mount(<ScrollTrigger onEnter={onEnter} triggerOnLoad={false} />, {
attachTo: document.getElementById('root'),
});
expect(onEnterFired).toBe(false);
component.unmount();
});
test('ScrollTrigger _does not_ fire onEnter when loaded outside of viewport', () => {
window.resizeTo(1024, 768);
window.Element.prototype.getBoundingClientRect = () => {
return {
left: 0,
top: 1572,
right: 0,
bottom: 0,
x: 0,
y: 0,
width: 0,
height: 0,
};
};
let onEnterFired = false;
const onEnter = () => {
onEnterFired = true;
};
component = mount(<ScrollTrigger onEnter={onEnter} />, {
attachTo: document.getElementById('root'),
});
expect(onEnterFired).toBe(false);
component.unmount();
});
test('ScrollTrigger fires onEnter callback when entering viewport', () => {
window.resizeTo(1024, 768);
window.Element.prototype.getBoundingClientRect = () => {
return {
left: 0,
top: 1572,
right: 0,
bottom: 0,
x: 0,
y: 0,
width: 0,
height: 0,
};
};
let onEnterFired = false;
const onEnter = () => {
onEnterFired = true;
};
component = mount(<ScrollTrigger onEnter={onEnter} />, {
attachTo: document.getElementById('root'),
});
window.Element.prototype.getBoundingClientRect = () => {
return {
left: 0,
top: 767,
right: 0,
bottom: 0,
x: 0,
y: 0,
width: 0,
height: 0,
};
};
window.scrollTo(0, 768);
expect(onEnterFired).toBe(true);
component.unmount();
});
test('ScrollTrigger fires onExit callback when exiting viewport', () => {
window.resizeTo(1024, 768);
let onExitFired = false;
const onExit = () => {
onExitFired = true;
};
component = mount(<ScrollTrigger onExit={onExit} />, {
attachTo: document.getElementById('root'),
});
window.Element.prototype.getBoundingClientRect = () => {
return {
left: 0,
top: -2,
right: 0,
bottom: -1,
x: 0,
y: 0,
width: 0,
height: 1,
};
};
window.scrollTo(0, 769);
expect(onExitFired).toBe(true);
component.unmount();
});
test('ScrollTrigger fires onProgress callback while scrolling through viewport', () => {
window.resizeTo(1024, 768);
let onProgressInitial = true;
let onProgressCount = 0;
const onProgress = () => {
if (!onProgressInitial) {
onProgressCount++;
}
onProgressInitial = false;
};
component = mount(<ScrollTrigger onProgress={onProgress} throttleScroll={0} />, {
attachTo: document.getElementById('root'),
});
window.scrollTo(1, 0);
window.scrollTo(2, 0);
expect(onProgressCount).toBe(2);
component.unmount();
});
test('ScrollTrigger only fires onProgress once due to throttleScroll value', () => {
window.resizeTo(1024, 768);
let onProgressInitial = true;
let onProgressCount = 0;
const onProgress = () => {
if (!onProgressInitial) {
onProgressCount++;
}
onProgressInitial = false;
};
component = mount(<ScrollTrigger onProgress={onProgress} />, {
attachTo: document.getElementById('root'),
});
window.scrollTo(1, 0);
window.scrollTo(2, 0);
expect(onProgressCount).toBe(1);
component.unmount();
});
test('ScrollTrigger fires onProgress callback when browser is resized', () => {
window.resizeTo(1024, 768);
let onProgressFired = false;
const onProgress = () => {
onProgressFired = true;
};
component = mount(<ScrollTrigger onProgress={onProgress} />, {
attachTo: document.getElementById('root'),
});
window.resizeTo(320, 568);
expect(onProgressFired).toBe(true);
component.unmount();
});
test('ScrollTrigger properly accepts throttleScroll prop change and updates accordingly', () => {
component = mount(<ScrollTrigger />, {
attachTo: document.getElementById('root'),
});
component.setProps({
throttleScroll: 0,
});
expect(component.prop('throttleScroll')).toEqual(0);
component.unmount();
});
test('ScrollTrigger properly accepts throttleResize prop change and updates accordingly', () => {
component = mount(<ScrollTrigger />, {
attachTo: document.getElementById('root'),
});
component.setProps({
throttleResize: 0,
});
expect(component.prop('throttleResize')).toEqual(0);
component.unmount();
});
});