scroll-stash
Version:
A JavaScript plugin to help preserve an element's scroll position.
101 lines (85 loc) • 2.95 kB
JavaScript
import 'expect-puppeteer';
import path from 'path';
import { throttleDelay } from './helpers/throttleDelay';
import defaults from '../src/defaults';
let maxScroll;
beforeAll(async () => {
await page.goto(`file:${path.join(__dirname, '../example.html')}`);
maxScroll = await page.$eval('#page', (el) => {
return (el.scrollHeight - el.offsetHeight);
});
});
test('should save all scroll-stash elements to local storage', async () => {
const initialState = {
'page': 0,
'example-1': 0,
'example-2': 217,
'example-3': 107,
'example-4': 217
};
await throttleDelay(defaults.throttleDelay * 2);
const savedState = JSON.parse(await page.evaluate(() => {
return localStorage.getItem('ScrollStash');
}));
expect(Object.keys(savedState).length).toEqual(5);
expect(savedState).toEqual(initialState);
});
test('should update local storage when any scroll position changes', async () => {
const expectedState = {
'page': maxScroll,
'example-1': 100,
'example-2': 300,
'example-3': 200,
'example-4': 300
};
const el_1 = await page.$eval('[data-scroll-stash="example-1"]', (el, obj) => {
document.querySelector('#example-1').scrollIntoView();
el.scrollTop = obj['example-1'];
return el.scrollTop;
}, expectedState);
expect(el_1).toBe(100);
const el_2 = await page.$eval('[data-scroll-stash="example-2"]', (el, obj) => {
document.querySelector('#example-2').scrollIntoView();
el.scrollTop = obj['example-2'];
return el.scrollTop;
}, expectedState);
expect(el_2).toBe(300);
const el_3 = await page.$eval('[data-scroll-stash="example-3"]', (el, obj) => {
document.querySelector('#example-3').scrollIntoView();
el.scrollTop = obj['example-3'];
return el.scrollTop;
}, expectedState);
expect(el_3).toBe(200);
const el_4 = await page.$eval('[data-scroll-stash="example-4"]', (el, obj) => {
document.querySelector('#example-4').scrollIntoView();
el.scrollTop = obj['example-4'];
return el.scrollTop;
}, expectedState);
expect(el_4).toBe(300);
const el_page = await page.$eval('[data-scroll-stash="page"]', (el) => {
el.scrollTop = 9999;
return el.scrollTop;
});
expect(el_page).toBe(maxScroll);
await throttleDelay();
const savedState = JSON.parse(await page.evaluate(() => {
return localStorage.getItem('ScrollStash');
}));
expect(savedState).toEqual(expectedState);
});
test('should apply scroll state when page is reloaded', async () => {
await page.reload();
await throttleDelay();
const savedState = JSON.parse(await page.evaluate(() => {
return localStorage.getItem('ScrollStash');
}));
const currentState = await page.$$eval('[data-scroll-stash]', (els) => {
const obj = {};
els.forEach((el) => {
const id = el.dataset['scrollStash'];
if (id) obj[id] = el.scrollTop;
});
return obj;
});
expect(currentState).toEqual(savedState);
});