git.fiddlerwoaroof.com
Raw Blame History
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);
  }

});