import addChangeUrlEvent from './change-url-event';
it("it should add changeUrlEventCreator to popstate,pushstate,replacestate", () => {
// given
const window = {};
const map = {};
window.addEventListener = jest.fn((event, cb) => {
map[event] = cb;
});
// when
addChangeUrlEvent(window);
// then
expect(map['popstate']).toBeDefined();
expect(map['pushstate']).toBeDefined();
expect(map['replacestate']).toBeDefined();
});
it("given event handler should generate a urlchange event only when url changes", () => {
// given
const window = {
location: {
hash: '#hash',
host: 'example.com',
hostname: 'example',
origin: '',
href: '',
pathname: '/path/to/thing',
port: 80,
protocol: 'https:'
}
};
const map = {};
const calls = [];
window.addEventListener = jest.fn((event, cb) => {
map[event] = cb;
});
window.dispatchEvent = jest.fn(ev => {
const evName = ev.type;
calls.push(ev);
if(map[evName]) {
map[evName].handleEvent(ev);
}
});
// when
addChangeUrlEvent(window);
window.dispatchEvent(new Event('popstate'));
window.dispatchEvent(new Event('popstate'));
// then
expect(calls.length).toEqual(3);
expect(calls[1].type).toEqual('urlchanged');
expect(calls[1].detail).toEqual(window.location);
//when
window.location.pathname = '/new/path';
window.dispatchEvent(new Event('popstate'));
//then
expect(calls.length).toEqual(5);
expect(calls[4].type).toEqual('urlchanged');
expect(calls[4].detail).toEqual(window.location);
});
it("should only add url events 1x when addChangeUrlEvent is called on window more than 1x", () => {
// given
const window = {};
const map = {};
window.addEventListener = jest.fn((event, cb) => {
if(!map[event]) {
map[event] = [];
}
map[event].push(cb);
});
// when
addChangeUrlEvent(window);
addChangeUrlEvent(window);
addChangeUrlEvent(window);
expect(Object.keys(map).length).toEqual(3);
//then
for (let event of Object.keys(map)) {
expect(map[event].length).toEqual(1);
}
});