Files
pjax/tests/lib/proto/attach-link.js
Behind The Math c13149626b Prettier fixes
2019-03-03 01:37:45 -05:00

191 lines
4.2 KiB
JavaScript

var tape = require("tape");
var on = require("../../../lib/events/on");
var trigger = require("../../../lib/events/trigger");
var attachLink = require("../../../lib/proto/attach-link");
var attr = "data-pjax-state";
tape("test attach link prototype method", function(t) {
var a = document.createElement("a");
var loadUrlCalled = false;
attachLink.call(
{
options: {},
loadUrl: function() {
loadUrlCalled = true;
}
},
a
);
var internalUri =
window.location.protocol +
"//" +
window.location.host +
window.location.pathname +
window.location.search;
a.href = internalUri;
trigger(a, "click", { metaKey: true });
t.equal(a.getAttribute(attr), "modifier", "event key modifier stop behavior");
a.href = "http://external.com/";
trigger(a, "click");
t.equal(a.getAttribute(attr), "external", "external url stop behavior");
window.location.hash = "#anchor";
a.href = internalUri + "#anchor";
trigger(a, "click");
t.equal(a.getAttribute(attr), "anchor", "internal anchor stop behavior");
a.href = internalUri + "#another-anchor";
trigger(a, "click");
t.equal(a.getAttribute(attr), "anchor", "different anchors stop behavior");
window.location.hash = "";
a.href = internalUri + "#";
trigger(a, "click");
t.equal(a.getAttribute(attr), "anchor-empty", "empty anchor stop behavior");
a.href = window.location.protocol + "//" + window.location.host + "/internal";
trigger(a, "click");
t.equals(
a.getAttribute(attr),
"load",
"triggering an internal link sets the state attribute to 'load'"
);
t.equals(
loadUrlCalled,
true,
"triggering an internal link actually loads the page"
);
t.end();
});
tape("test attach link preventDefaulted events", function(t) {
var loadUrlCalled = false;
var a = document.createElement("a");
// This needs to be before the call to attachLink()
on(a, "click", function(event) {
event.preventDefault();
});
attachLink.call(
{
options: {},
loadUrl: function() {
loadUrlCalled = true;
}
},
a
);
a.href = "#";
trigger(a, "click");
t.equal(
loadUrlCalled,
false,
"events that are preventDefaulted should not fire callback"
);
t.end();
});
tape("test options are not modified by attachLink", function(t) {
var a = document.createElement("a");
var options = { foo: "bar" };
var loadUrl = function() {};
attachLink.call({ options: options, loadUrl: loadUrl }, a);
a.href =
window.location.protocol +
"//" +
window.location.host +
window.location.pathname +
window.location.search;
trigger(a, "click");
t.equal(
1,
Object.keys(options).length,
"options object that is passed in should not be modified"
);
t.equal(
"bar",
options.foo,
"options object that is passed in should not be modified"
);
t.end();
});
tape("test link triggered by keyboard", function(t) {
var a = document.createElement("a");
var pjax = {
options: {},
loadUrl: function() {
t.equal(
a.getAttribute(attr),
"load",
"triggering a internal link actually loads the page"
);
}
};
t.plan(3);
attachLink.call(pjax, a);
a.href = window.location.protocol + "//" + window.location.host + "/internal";
trigger(a, "keyup", { keyCode: 14 });
t.equal(
a.getAttribute(attr),
"",
"keycode other than 13 doesn't trigger anything"
);
trigger(a, "keyup", { keyCode: 13, metaKey: true });
t.equal(a.getAttribute(attr), "modifier", "event key modifier stop behavior");
trigger(a, "keyup", { keyCode: 13 });
// see loadUrl defined above
t.end();
});
tape(
"test link with the same URL as the current one, when currentUrlFullReload set to true",
function(t) {
var a = document.createElement("a");
var pjax = {
options: {
currentUrlFullReload: true
},
reload: function() {
t.pass("this.reload() was called correctly");
},
loadUrl: function() {
t.fail("loadUrl() was called wrongly");
}
};
t.plan(2);
attachLink.call(pjax, a);
a.href = window.location.href;
trigger(a, "click");
t.equal(a.getAttribute(attr), "reload", "reload stop behavior");
t.end();
}
);