var tape = require("tape"); var on = require("../../../lib/events/on"); var trigger = require("../../../lib/events/trigger"); var attachForm = require("../../../lib/proto/attach-form"); var attr = "data-pjax-state"; tape("test attach form prototype method", function(t) { var form = document.createElement("form"); var loadUrlCalled = false; attachForm.call( { options: { currentUrlFullReload: true }, loadUrl: function() { loadUrlCalled = true; } }, form ); var internalUri = window.location.protocol + "//" + window.location.host + window.location.pathname + window.location.search; form.action = "http://external.com/"; trigger(form, "submit"); t.equal(form.getAttribute(attr), "external", "external url stop behavior"); form.action = internalUri + "#anchor"; trigger(form, "submit"); t.equal(form.getAttribute(attr), "anchor", "internal anchor stop behavior"); window.location.hash = "#anchor"; form.action = internalUri + "#another-anchor"; trigger(form, "submit"); t.equal(form.getAttribute(attr), "anchor", "different anchors stop behavior"); window.location.hash = ""; form.action = internalUri + "#"; trigger(form, "submit"); t.equal( form.getAttribute(attr), "anchor-empty", "empty anchor stop behavior" ); form.action = window.location.href; trigger(form, "submit"); t.equal( form.getAttribute(attr), "reload", "submitting when currentUrlFullReload is true will submit normally, without XHR" ); t.equal(loadUrlCalled, false, "loadUrl() not called"); form.action = window.location.protocol + "//" + window.location.host + "/internal"; form.method = "POST"; trigger(form, "submit"); t.equal( form.getAttribute(attr), "submit", "triggering a POST request to the next page" ); t.equal(loadUrlCalled, true, "loadUrl() called correctly"); loadUrlCalled = false; form.setAttribute(attr, ""); form.action = window.location.protocol + "//" + window.location.host + "/internal"; form.method = "GET"; trigger(form, "submit"); t.equal( form.getAttribute(attr), "submit", "triggering a GET request to the next page" ); t.equal(loadUrlCalled, true, "loadUrl() called correctly"); t.end(); }); tape("test attach form preventDefaulted events", function(t) { var loadUrlCalled = false; var form = document.createElement("form"); // This needs to be before the call to attachForm() on(form, "submit", function(event) { event.preventDefault(); }); attachForm.call( { options: {}, loadUrl: function() { loadUrlCalled = true; } }, form ); form.action = "#"; trigger(form, "submit"); t.equal( loadUrlCalled, false, "events that are preventDefaulted should not fire callback" ); t.end(); }); tape("test options are not modified by attachForm", function(t) { var form = document.createElement("form"); var options = { foo: "bar" }; var loadUrl = function() {}; attachForm.call({ options: options, loadUrl: loadUrl }, form); form.action = window.location.protocol + "//" + window.location.host + window.location.pathname + window.location.search; form.method = "GET"; trigger(form, "submit"); 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 form elements parsed correctly", function(t) { t.plan(1); var form = document.createElement("form"); var input = document.createElement("input"); input.name = "input"; input.value = "value"; form.appendChild(input); var params = [ { name: "input", value: "value" } ]; var pjax = { options: {}, loadUrl: function(href, options) { t.same( options.requestOptions.requestParams, params, "form elements parsed correctly" ); } }; attachForm.call(pjax, form); form.action = window.location.protocol + "//" + window.location.host + "/internal"; trigger(form, "submit"); // see loadUrl defined above t.end(); }); tape('test form.enctype="multipart/form-data"', function(t) { t.plan(4); var form = document.createElement("form"); form.enctype = "multipart/form-data"; var input = document.createElement("input"); input.name = "input"; input.value = "value"; form.appendChild(input); var pjax = { options: {}, loadUrl: function(href, options) { t.equals( options.requestOptions.requestParams, undefined, "form elements not parsed manually" ); t.true( options.requestOptions.formData instanceof FormData, "requestOptions.formData is a FormData" ); t.equals( Array.from(options.requestOptions.formData.entries()).length, 1, "correct number of FormData elements" ); t.equals( options.requestOptions.formData.get("input"), "value", "FormData element value set correctly" ); } }; attachForm.call(pjax, form); form.action = window.location.protocol + "//" + window.location.host + "/internal"; trigger(form, "submit"); // see loadUrl defined above t.end(); });