vanillajs-browser-helpers
Version:
Collection of convenience code snippets (helpers) that aims to make it a little easier to work with vanilla JS in the browser
96 lines (71 loc) • 2.66 kB
text/typescript
import { mockClientRect } from './assets/mocks';
import { byId, createElement, generateId, insertHtml, removeElement } from './assets/helpers';
import inView from '../inView';
const testID = generateId('InView');
const hiddenID = generateId('InView_hidden');
describe('"inView"', () => {
insertHtml(`
<div id="${hiddenID}" style="display: none;"></div>
<div id="${testID}"></div>
`);
const testNode = byId(testID);
testNode.style.cssText = 'width: 100px; height: 100px';
const div = createElement('div');
div.innerHTML = '<p></p>';
div.style.cssText = 'width: 100px; height: 100px';
afterAll(() => {
removeElement(hiddenID);
removeElement(testID);
});
it('Sets only `inside` property to `true` when the element is inside the viewport area', () => {
const result = { inside: true, above: false, below: false, left: false, right: false };
const restore = mockClientRect({ top: 100, left: 100, right: 100, bottom: 100 });
expect(inView(testNode)).toEqual(result);
restore();
});
describe('Set all properties to `false` when the given element is', () => {
it.each([
['Element not in the DOM', div],
['Child of element not in the DOM', div.firstElementChild as HTMLElement],
['Hidden', byId('hidden')]
])('%s', (_, elm) => {
const result = { inside: false, above: false, below: false, left: false, right: false };
expect(inView(elm)).toEqual(result);
});
});
describe.each([0, 10, -10])('Indicates where the element is off screen (threshold: %i)', (threshold) => {
it.each([
'above',
'below',
'left',
'right',
'above, left',
'above, right',
'below, left',
'below, right'
])('Indicates where the element is off the viewport area: "%s"', (places) => {
type Key = 'above' | 'below' | 'left' | 'right';
const keys = places.split(', ') as [Key] | [Key, Key];
const result = { inside: false, above: false, below: false, left: false, right: false };
const mock = { top: 100, left: 100, right: 100, bottom: 100 };
keys.forEach((key) => {
if (key === 'left') {
mock.right = threshold;
}
if (key === 'right') {
mock.left = window.innerWidth - threshold;
}
if (key === 'above') {
mock.bottom = threshold;
}
if (key === 'below') {
mock.top = window.innerHeight - threshold;
}
result[key] = true;
});
const restore = mockClientRect(mock);
expect(inView(testNode, threshold || undefined)).toEqual(result);
restore();
});
});
});