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