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('');
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");
}
});
});