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