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);
  }
});