Files
pjax/tests/lib/proto/attach-link.js

191 lines
4.2 KiB
JavaScript
Raw Normal View History

2019-03-03 01:37:45 -05:00
var tape = require("tape");
2014-05-22 06:20:38 +02:00
2019-03-03 01:37:45 -05:00
var on = require("../../../lib/events/on");
var trigger = require("../../../lib/events/trigger");
var attachLink = require("../../../lib/proto/attach-link");
2014-05-22 06:20:38 +02:00
2019-03-03 01:37:45 -05:00
var attr = "data-pjax-state";
2014-05-22 06:20:38 +02:00
tape("test attach link prototype method", function(t) {
2019-03-03 01:37:45 -05:00
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();
});
2016-01-04 23:45:25 +11:00
tape("test attach link preventDefaulted events", function(t) {
2019-03-03 01:37:45 -05:00
var loadUrlCalled = false;
var a = document.createElement("a");
2016-01-04 23:45:25 +11:00
// This needs to be before the call to attachLink()
on(a, "click", function(event) {
2019-03-03 01:37:45 -05:00
event.preventDefault();
});
attachLink.call(
{
options: {},
loadUrl: function() {
loadUrlCalled = true;
}
},
a
);
2016-01-04 23:45:25 +11:00
2019-03-03 01:37:45 -05:00
a.href = "#";
trigger(a, "click");
t.equal(
loadUrlCalled,
false,
"events that are preventDefaulted should not fire callback"
);
2016-01-04 23:45:25 +11:00
2019-03-03 01:37:45 -05:00
t.end();
});
tape("test options are not modified by attachLink", function(t) {
2019-03-03 01:37:45 -05:00
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) {
2019-03-03 01:37:45 -05:00
var a = document.createElement("a");
var pjax = {
options: {},
loadUrl: function() {
2019-03-03 01:37:45 -05:00
t.equal(
a.getAttribute(attr),
"load",
"triggering a internal link actually loads the page"
);
}
2019-03-03 01:37:45 -05:00
};
2019-03-03 01:37:45 -05:00
t.plan(3);
2019-03-03 01:37:45 -05:00
attachLink.call(pjax, a);
2019-03-03 01:37:45 -05:00
a.href = window.location.protocol + "//" + window.location.host + "/internal";
2019-03-03 01:37:45 -05:00
trigger(a, "keyup", { keyCode: 14 });
t.equal(
a.getAttribute(attr),
"",
"keycode other than 13 doesn't trigger anything"
);
2019-03-03 01:37:45 -05:00
trigger(a, "keyup", { keyCode: 13, metaKey: true });
t.equal(a.getAttribute(attr), "modifier", "event key modifier stop behavior");
2019-03-03 01:37:45 -05:00
trigger(a, "keyup", { keyCode: 13 });
// see loadUrl defined above
2019-03-03 01:37:45 -05:00
t.end();
});
2019-03-03 01:37:45 -05:00
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");
}
};
2019-03-03 01:37:45 -05:00
t.plan(2);
2019-03-03 01:37:45 -05:00
attachLink.call(pjax, a);
2019-03-03 01:37:45 -05:00
a.href = window.location.href;
2019-03-03 01:37:45 -05:00
trigger(a, "click");
t.equal(a.getAttribute(attr), "reload", "reload stop behavior");
2019-03-03 01:37:45 -05:00
t.end();
}
);