describe("hx-push-url attribute", function() { var HTMX_HISTORY_CACHE_NAME = "htmx-history-cache"; beforeEach(function () { this.server = makeServer(); clearWorkArea(); localStorage.removeItem(HTMX_HISTORY_CACHE_NAME); }); afterEach(function () { this.server.restore(); clearWorkArea(); localStorage.removeItem(HTMX_HISTORY_CACHE_NAME); }); it("navigation should push an element into the cache when true", function () { this.server.respondWith("GET", "/test", "second"); getWorkArea().innerHTML.should.be.equal(""); var div = make('
first
'); div.click(); this.server.respond(); div.click(); this.server.respond(); getWorkArea().textContent.should.equal("second") var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); cache[cache.length - 1].url.should.equal("/test"); }); it("navigation should push an element into the cache when string", function () { this.server.respondWith("GET", "/test", "second"); getWorkArea().innerHTML.should.be.equal(""); var div = make('
first
'); div.click(); this.server.respond(); div.click(); this.server.respond(); getWorkArea().textContent.should.equal("second") var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); cache.length.should.equal(2); cache[1].url.should.equal("/abc123"); }); it("restore should return old value", function () { this.server.respondWith("GET", "/test1", '
test1
'); this.server.respondWith("GET", "/test2", '
test2
'); make('
init
'); byId("d1").click(); this.server.respond(); var workArea = getWorkArea(); workArea.textContent.should.equal("test1") byId("d2").click(); this.server.respond(); workArea.textContent.should.equal("test2") var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); cache.length.should.equal(2); htmx._('restoreHistory')("/test1") getWorkArea().textContent.should.equal("test1") }); it("history restore should not have htmx support classes in content", function () { this.server.respondWith("GET", "/test1", '
test1
'); this.server.respondWith("GET", "/test2", '
test2
'); make('
init
'); byId("d1").click(); this.server.respond(); var workArea = getWorkArea(); workArea.textContent.should.equal("test1") byId("d2").click(); this.server.respond(); workArea.textContent.should.equal("test2") htmx._('restoreHistory')("/test1") getWorkArea().getElementsByClassName("htmx-request").length.should.equal(0); }); it("cache should only store 10 entries", function () { var x = 0; this.server.respondWith("GET", /test.*/, function(xhr){ x++; xhr.respond(200, {}, '
') }); getWorkArea().innerHTML.should.be.equal(""); make('
'); for (var i = 0; i < 20; i++) { // issue 20 requests byId("d1").click(); this.server.respond(); } var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); cache.length.should.equal(10); // should only be 10 elements }); it("cache miss should issue another GET", function () { this.server.respondWith("GET", "/test1", '
test1
'); this.server.respondWith("GET", "/test2", '
test2
'); make('
init
'); byId("d1").click(); this.server.respond(); var workArea = getWorkArea(); workArea.textContent.should.equal("test1") byId("d2").click(); this.server.respond(); workArea.textContent.should.equal("test2") var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); cache.length.should.equal(2); localStorage.removeItem(HTMX_HISTORY_CACHE_NAME); // clear cache htmx._('restoreHistory')("/test1") this.server.respond(); getWorkArea().textContent.should.equal("test1") }); it("navigation should push an element into the cache w/ data-* prefix", function () { this.server.respondWith("GET", "/test", "second"); getWorkArea().innerHTML.should.be.equal(""); var div = make('
first
'); div.click(); this.server.respond(); getWorkArea().textContent.should.equal("second") var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); cache.length.should.equal(1); }); it("deals with malformed JSON in history cache when getting", function () { localStorage.setItem(HTMX_HISTORY_CACHE_NAME, "Invalid JSON"); var history = htmx._('getCachedHistory')('url'); should.equal(history, null); }); it("deals with malformed JSON in history cache when saving", function () { localStorage.setItem(HTMX_HISTORY_CACHE_NAME, "Invalid JSON"); htmx._('saveToHistoryCache')('url', 'content', 'title', 'scroll'); var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); cache.length.should.equal(1); }); it("does not blow out cache when saving a URL twice", function () { htmx._('saveToHistoryCache')('url1', 'content', 'title', 'scroll'); htmx._('saveToHistoryCache')('url2', 'content', 'title', 'scroll'); htmx._('saveToHistoryCache')('url3', 'content', 'title', 'scroll'); htmx._('saveToHistoryCache')('url2', 'content', 'title', 'scroll'); var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); cache.length.should.equal(3); }); it("history cache is LRU", function () { htmx._('saveToHistoryCache')('url1', 'content', 'title', 'scroll'); htmx._('saveToHistoryCache')('url2', 'content', 'title', 'scroll'); htmx._('saveToHistoryCache')('url3', 'content', 'title', 'scroll'); htmx._('saveToHistoryCache')('url2', 'content', 'title', 'scroll'); htmx._('saveToHistoryCache')('url1', 'content', 'title', 'scroll'); var cache = JSON.parse(localStorage.getItem(HTMX_HISTORY_CACHE_NAME)); cache.length.should.equal(3); cache[0].url.should.equal("url3"); cache[1].url.should.equal("url2"); cache[2].url.should.equal("url1"); }); it("htmx:afterSettle is called when replacing outerHTML", function () { var called = false; var handler = htmx.on("htmx:afterSettle", function (evt) { called = true; }); try { this.server.respondWith("POST", "/test", function (xhr) { xhr.respond(200, {}, ""); }); var div = make(""); div.click(); this.server.respond(); should.equal(called, true); } finally { htmx.off("htmx:afterSettle", handler); } }); it("should include parameters on a get", function () { var path = ""; var handler = htmx.on("htmx:pushedIntoHistory", function (evt) { path = evt.detail.path; }); try { this.server.respondWith("GET", /test.*/, function (xhr) { xhr.respond(200, {}, "second") }); var form = make('
first
'); form.click(); this.server.respond(); form.textContent.should.equal("second") path.should.equal("/test?foo=bar") } finally { htmx.off("htmx:pushedIntoHistory", handler); } }); it("saveToHistoryCache should not throw", function () { var bigContent = "Dummy"; for (var i = 0; i < 20; i++) { bigContent += bigContent; } try { localStorage.removeItem("htmx-history-cache"); htmx._("saveToHistoryCache")("/dummy", bigContent, "Foo", 0); should.equal(localStorage.getItem("htmx-history-cache"), null); } finally { // clear history cache afterwards localStorage.removeItem("htmx-history-cache"); } }); });