| <!doctype html> |
| <!-- |
| @license |
| Copyright (c) 2015 The Polymer Project Authors. All rights reserved. |
| This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt |
| The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
| The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt |
| Code distributed by Google as part of the polymer project is also |
| subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt |
| --> |
| <html> |
| <head> |
| <title>iron-form</title> |
| |
| <script src="../../webcomponentsjs/webcomponents-lite.js"></script> |
| <script src="../../web-component-tester/browser.js"></script> |
| |
| <link rel="import" href="../../polymer/polymer.html"> |
| <link rel="import" href="../../paper-checkbox/paper-checkbox.html"> |
| <link rel="import" href="../../paper-input/paper-input.html"> |
| <link rel="import" href="../../paper-button/paper-button.html"> |
| <link rel="import" href="../iron-form.html"> |
| |
| </head> |
| <body> |
| |
| <dom-module id="x-input-wrapper"> |
| <template> |
| <input name="check_wrapped" value="foo"/> |
| </template> |
| </dom-module> |
| |
| <test-fixture id="serialization"> |
| <template> |
| <div> |
| <iron-form id="native-checkboxes"> |
| <form action="/get" method="get"> |
| <input type="checkbox" name="check1" checked> <!-- default value is "on" --> |
| <input type="checkbox" name="check1" value="1"> |
| <input type="checkbox" name="check1" value="2" checked> |
| <input type="checkbox" name="check2" value="3" checked> |
| <input type="checkbox" name="check3" value="4"> |
| </form> |
| </iron-form> |
| <iron-form id="native-radios"> |
| <form action="/get" method="get"> |
| <input type="radio" name="radio1" checked> <!-- default value is "on" --> |
| <input type="radio" name="radio1" value="1"> |
| <input type="radio" name="radio2" value="2" checked> |
| <input type="radio" name="radio2" value="3" checked> <!-- it's a radio group --> |
| <input type="radio" name="radio3" value="4"> |
| </form> |
| </iron-form> |
| <iron-form id="native-buttons"> |
| <form action="/get" method="get"> |
| <input type="reset" name="reset1" value="reset"> |
| <input type="submit" name="submit1" value="submit"> |
| <button name="button1" value="button">text</button> |
| </form> |
| </iron-form> |
| <iron-form id="native-selects"> |
| <form action="/get" method="get"> |
| <select name="select1" multiple> |
| <option value="1" selected>A</option> |
| <option value="2" selected>B</option> |
| <option value="3">C</option> |
| </select> |
| <select name="select2"> |
| <option value="1" selected>A</option> |
| <option value="2">B</option> |
| </select> |
| </form> |
| </iron-form> |
| <iron-form id="native-inputs"> |
| <form action="/get" method="get"> |
| <input type="text" name="input1"> |
| <input type="text" name="input1" value="foo"> |
| <input type="text" name="input1" value="zag"> |
| <input type="text" name="input2" value="bar"> |
| <input type="password" name="pass1" value="pass"> |
| <input type="number" name="number1" value="35"> |
| <input name="empty" value=""> |
| <input name="empty" value=""> |
| </form> |
| </iron-form> |
| <iron-form id="native-inputs-empty"> |
| <form action="/get" method="get"> |
| <input type="text" name="input1"> |
| </form> |
| </iron-form> |
| <iron-form id="custom-checkboxes"> |
| <form action="/get" method="get"> |
| <paper-checkbox name="check1" checked></paper-checkbox> <!-- default value is "on" --> |
| <paper-checkbox name="check1" value="1"></paper-checkbox> |
| <paper-checkbox name="check1" value="2" checked></paper-checkbox> |
| <paper-checkbox name="check2" value="3" checked></paper-checkbox> |
| <paper-checkbox name="check3" value="4"></paper-checkbox> |
| </form> |
| </iron-form> |
| <iron-form id="custom-inputs"> |
| <form action="/get" method="get"> |
| <paper-input name="input1" value=""></paper-input> |
| <paper-input name="input1" value="foo"></paper-input> |
| <paper-input name="input1" value="zag"></paper-input> |
| <paper-input name="input2" value="bar"></paper-input> |
| <paper-input type="password" name="pass1" value="pass"></paper-input> |
| <paper-input type="number" name="number1" value="35"></paper-input> |
| <paper-input name="empty" value=""></paper-input> |
| <paper-input name="empty" value=""></paper-input> |
| <x-input-wrapper></x-input-wrapper> |
| </form> |
| </iron-form> |
| <iron-form id="nested-elements"> |
| <form action="/get" method="get"> |
| <div> |
| <input type="text" name="input1" value="i1"> |
| </div> |
| <div> |
| <paper-input name="paper-input1" value="p1"></paper-input> |
| </div> |
| <div> |
| <p> |
| <div> |
| <input type="text" name="input2" value="i2"> |
| <paper-input name="paper-input2" value="p2"></paper-input> |
| </div> |
| </p> |
| </div> |
| </form> |
| </iron-form> |
| <iron-form id="duplicate-names"> |
| <form action="/get" method="get"> |
| <input name="input1" value=""> |
| <input name="input1" value="foo"> |
| <paper-input name="input1" value=""></paper-input> |
| <paper-input name="input1" value="bar"></paper-input> |
| <input name="empty" value=""> |
| <input name="empty" value=""> |
| <paper-input name="empty" value=""></paper-input> |
| <paper-input name="empty" value=""></paper-input> |
| </form> |
| </iron-form> |
| |
| </div> |
| </template> |
| </test-fixture> |
| |
| <test-fixture id="validation"> |
| <template> |
| <div> |
| <iron-form id="native-required"> |
| <form action="/get" method="get"> |
| <input required> |
| </form> |
| </iron-form> |
| |
| <iron-form id="native-invalid"> |
| <form action="/get" method="get"> |
| <input pattern="aa" value="b"> |
| </form> |
| </iron-form> |
| |
| <iron-form id="custom-required"> |
| <form action="/get" method="get"> |
| <paper-input required></paper-input> |
| </form> |
| </iron-form> |
| |
| <iron-form id="custom-invalid"> |
| <form action="/get" method="get"> |
| <paper-input pattern="aa" value="b"></paper-input> |
| </form> |
| </iron-form> |
| |
| <iron-form id="mixed-invalid"> |
| <form action="/get" method="get"> |
| <input pattern="aa" value="b"> |
| <paper-input pattern="aa" value="b"></paper-input> |
| </form> |
| </iron-form> |
| </div> |
| </template> |
| </test-fixture> |
| |
| <test-fixture id="submission"> |
| <template> |
| <iron-form> |
| <form action="/get" method="get"> |
| <input type="checkbox" name="check1" checked> |
| <input type="submit"> |
| <input type="button"> |
| <paper-button></paper-button> |
| </form> |
| </iron-form> |
| </template> |
| </test-fixture> |
| |
| <test-fixture id="resetting"> |
| <template> |
| <iron-form> |
| <form action="/get" method="get"> |
| <input type="input" name="input1" id="input1" value="input1"> |
| <input type="input" name="input2" id="input2"> |
| <input type="checkbox" name="check1" id="check1" checked> |
| <input type="checkbox" name="check2" id="check2"> |
| <input type="radio" name="radio1" id="radio1" checked> |
| <input type="radio" name="radio2" id="radio2"> |
| <paper-checkbox name="papercheck1" id="papercheck1" checked></paper-checkbox> |
| <paper-checkbox name="papercheck2" id="papercheck2"></paper-checkbox> |
| <paper-input name="paper1" id="paper1" value="paper1"></paper-input> |
| <paper-input name="paper2" id="paper2" value=""></paper-input> |
| <input type="reset"> |
| </form> |
| </iron-form> |
| </template> |
| </test-fixture> |
| |
| <test-fixture id="content-type"> |
| <template> |
| <div> |
| <iron-form id="simple-form"> |
| <form action="/valid/url" method="post"> |
| <paper-input name="paper1" value="value1"></paper-input> |
| <paper-input name="paper2" value="value2"></paper-input> |
| </form> |
| </iron-form> |
| <iron-form id="json-form"> |
| <form action="/valid/url" method="post" enctype="application/json"> |
| <paper-input name="paper1" value="value1"></paper-input> |
| <paper-input name="paper2" value="value2"></paper-input> |
| </form> |
| </iron-form> |
| <iron-form id="plain-form"> |
| <form action="/valid/url" method="post" enctype="text/plain"> |
| <paper-input name="paper1" value="value1"></paper-input> |
| <paper-input name="paper2" value="value2"></paper-input> |
| </form> |
| </iron-form> |
| </div> |
| </template> |
| </test-fixture> |
| |
| <script> |
| suite('serialization', function() { |
| var f; |
| var server; |
| |
| suiteSetup(function () { |
| Polymer({is: 'x-input-wrapper'}); |
| }); |
| |
| setup(function() { |
| f = fixture('serialization'); |
| |
| server = sinon.fakeServer.create(); |
| server.respondWith( |
| 'GET', |
| /\/get.*/, |
| [ |
| 200, |
| '{"Content-Type":"application/json"}', |
| '{"success":true}' |
| ] |
| ); |
| }); |
| |
| teardown(function() { |
| server.restore(); |
| }); |
| |
| test('serializes native checkboxes', function(done) { |
| var form = f.querySelector('#native-checkboxes'); |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.url).to.equal('/get?check1=on&check1=2&check2=3'); |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('serializes native radio buttons', function(done) { |
| var form = f.querySelector('#native-radios'); |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.url).to.equal('/get?radio1=on&radio2=3'); |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('serializes native buttons', function(done) { |
| var form = f.querySelector('#native-buttons'); |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.url).to.equal('/get'); |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('serializes native selects', function(done) { |
| var form = f.querySelector('#native-selects'); |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.url).to.equal('/get?select1=1&select1=2&select2=1'); |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('serializes native inputs', function(done) { |
| var form = f.querySelector('#native-inputs'); |
| |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.url).to.equal('/get?input1=&input1=foo&input1=zag&input2=bar&pass1=pass&number1=35&empty=&empty='); |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('serializes empty native inputs', function(done) { |
| var form = f.querySelector('#native-inputs-empty'); |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.url).to.equal('/get?input1='); |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('serializes custom checkboxes', function(done) { |
| var form = f.querySelector('#custom-checkboxes'); |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.url).to.equal('/get?check1=on&check1=2&check2=3'); |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('serializes custom inputs', function(done) { |
| var form = f.querySelector('#custom-inputs'); |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.url).to.equal('/get?input1=&input1=foo&input1=zag&input2=bar&pass1=pass&number1=35&empty=&empty=&check_wrapped=foo'); |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('serializes elements deeply nested in divs', function(done) { |
| var form = f.querySelector('#nested-elements'); |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.url).to.equal('/get?input1=i1&paper-input1=p1&input2=i2&paper-input2=p2'); |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('serializes elements with duplicate names', function(done) { |
| var form = f.querySelector('#duplicate-names'); |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.url).to.equal('/get?input1=&input1=foo&input1=&input1=bar&empty=&empty=&empty=&empty='); |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| }); |
| |
| |
| suite('validation', function() { |
| var f; |
| var server; |
| |
| setup(function() { |
| f = fixture('validation'); |
| |
| server = sinon.fakeServer.create(); |
| server.respondWith( |
| 'GET', |
| /\/get.*/, |
| [ |
| 200, |
| '{"Content-Type":"application/json"}', |
| '{"success":true}' |
| ] |
| ); |
| }); |
| |
| teardown(function() { |
| server.restore(); |
| }); |
| |
| test('fires iron-form-invalid if it can\'t submit', function(done) { |
| var form = f.querySelector('#mixed-invalid'); |
| form.addEventListener('iron-form-invalid', function(event) { |
| expect(form.validate()).to.be.equal(false); |
| done(); |
| }); |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| expect(form.validate()).to.be.equal(false); |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('<input required> is validated and does not submit the form', function(done) { |
| var form = f.querySelector('#native-required'); |
| |
| var responses = 0; |
| form.addEventListener('iron-form-response', function(event) { |
| responses++; |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| expect(form.validate()).to.be.equal(false); |
| form.submit(); |
| server.respond(); |
| }); |
| |
| setTimeout(function() { |
| expect(responses).to.be.equal(0); |
| done(); |
| }, 200); |
| }); |
| |
| test('invalid <input> but not required is validated and does not submit the form', function(done) { |
| var form = f.querySelector('#native-invalid'); |
| |
| var responses = 0; |
| form.addEventListener('iron-form-response', function(event) { |
| responses++; |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| expect(form.validate()).to.be.equal(false); |
| form.submit(); |
| server.respond(); |
| }); |
| |
| setTimeout(function() { |
| expect(responses).to.be.equal(0); |
| done(); |
| }, 200); |
| }); |
| |
| test('<paper-input required> is validated and does not submit the form', function(done) { |
| var form = f.querySelector('#custom-required'); |
| |
| var responses = 0; |
| form.addEventListener('iron-form-response', function(event) { |
| responses++; |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.validate(); |
| expect(form.validate()).to.be.equal(false); |
| form.submit(); |
| server.respond(); |
| }); |
| |
| setTimeout(function() { |
| expect(responses).to.be.equal(0); |
| done(); |
| }, 200); |
| }); |
| |
| test('invalid <paper-input> but not required is validated and does not submit the form', function(done) { |
| var form = f.querySelector('#custom-invalid'); |
| |
| var responses = 0; |
| form.addEventListener('iron-form-response', function(event) { |
| responses++; |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| expect(form.validate()).to.be.equal(false); |
| form.submit(); |
| server.respond(); |
| }); |
| |
| setTimeout(function() { |
| expect(responses).to.be.equal(0); |
| done(); |
| }, 200); |
| }); |
| }); |
| |
| suite('submission', function() { |
| var form; |
| var server; |
| |
| setup(function() { |
| form = fixture('submission'); |
| |
| server = sinon.fakeServer.create(); |
| server.respondWith( |
| 'GET', |
| /\/get.*/, |
| [ |
| 200, |
| '{"Content-Type":"application/json"}', |
| '{"success":true}' |
| ] |
| ); |
| server.respondWith( |
| 'POST', |
| /\/post.*/, |
| [ |
| 200, |
| '{"Content-Type":"application/json"}', |
| '{"success":true}' |
| ] |
| ); |
| server.respondWith( |
| 'GET', |
| /\/error.*/, |
| [ |
| 404, |
| '{"Content-Type":"application/text"}', |
| '{"success":false}' |
| ] |
| ); |
| }); |
| |
| teardown(function() { |
| server.restore(); |
| }); |
| |
| test('calling submit() on a form with method=get', function(done) { |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('calling submit() on a form with method=post', function(done) { |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form._form.setAttribute('method', 'POST'); |
| form._form.setAttribute('action', '/post'); |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('calling submit() on a form with method unset', function(done) { |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form._form.removeAttribute('method'); |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('pressing an <input type=submit> submits the form', function(done) { |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form._form.querySelector('input[type=submit]').click(); |
| server.respond(); |
| }); |
| }); |
| |
| test('pressing an <input type=button> with an event handler submits the form', function(done) { |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| var button = form._form.querySelector('input[type=button]'); |
| button.addEventListener('click', function() { |
| form.submit(); |
| }); |
| button.click(); |
| |
| server.respond(); |
| }); |
| }); |
| |
| test('pressing a paper-button with an event handler submits the form', function(done) { |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| var button = form._form.querySelector('paper-button'); |
| button.addEventListener('click', function() { |
| form.submit(); |
| }); |
| button.click(); |
| |
| server.respond(); |
| }); |
| }); |
| |
| test('can modify the request in the presubmit', function(done) { |
| var submitted = false; |
| var presubmitted = false; |
| |
| form.addEventListener('iron-form-submit', function() { |
| submitted = true; |
| }); |
| form.addEventListener('iron-form-presubmit', function() { |
| presubmitted = true; |
| this.request.params = {batman: true}; |
| }); |
| |
| form.addEventListener('iron-form-response', function(event) { |
| expect(submitted).to.be.equal(true); |
| expect(presubmitted).to.be.equal(true); |
| |
| // We have changed the json parameters |
| expect(event.detail.url).to.contain('batman=true'); |
| |
| var response = event.detail.response; |
| expect(response).to.be.ok; |
| expect(response).to.be.an('object'); |
| expect(response.success).to.be.equal(true); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| |
| test('can do a custom submission in the presubmit', function(done) { |
| var presubmitted = false; |
| // Since we are not using the normal form submission, these events should |
| // never be called. |
| var formResponseHandler = sinon.spy(); |
| form.addEventListener('iron-form-response', formResponseHandler); |
| var formSubmitHandler = sinon.spy(); |
| form.addEventListener('iron-form-submit', formSubmitHandler); |
| |
| form.addEventListener('iron-form-presubmit', function(event) { |
| presubmitted = true; |
| event.preventDefault(); |
| // Your custom submission logic could go here (like using Firebase). |
| // In this case, fire a custom event as a an example. |
| this.fire('custom-form-submit'); |
| }); |
| form.addEventListener('custom-form-submit', function(event) { |
| expect(presubmitted).to.be.equal(true); |
| expect(formResponseHandler.callCount).to.be.equal(0); |
| expect(formSubmitHandler.callCount).to.be.equal(0); |
| done(); |
| }); |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| }); |
| }); |
| |
| test('can relay errors', function(done) { |
| form.addEventListener('iron-form-error', function(event) { |
| var error = event.detail; |
| expect(error).to.be.ok; |
| expect(error).to.be.an('object'); |
| expect(error.error).to.be.ok; |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form._form.setAttribute('action', '/error'); |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| }); |
| |
| suite('resetting', function() { |
| test('can reset a form', function(done) { |
| var form = fixture('resetting'); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| var initial = form.serializeForm(); |
| expect(JSON.stringify(initial)).to.be.equal('{"input1":"input1","input2":"","check1":"on","radio1":"on","papercheck1":"on","paper1":"paper1","paper2":""}'); |
| |
| // Modify all the values, flip all the inputs. |
| document.getElementById('input1').value = 'input1++'; |
| document.getElementById('input2').value = 'input2++'; |
| document.getElementById('check1').checked = false; |
| document.getElementById('check2').checked = true; |
| document.getElementById('radio1').checked = false; |
| document.getElementById('radio2').checked = true; |
| document.getElementById('papercheck1').checked = false; |
| document.getElementById('papercheck2').checked = true; |
| document.getElementById('paper1').value = 'paper1++'; |
| document.getElementById('paper2').value = 'paper2++'; |
| |
| var updated = form.serializeForm(); |
| expect(JSON.stringify(updated)).to.not.be.equal(initial); |
| form.reset(); |
| var final = form.serializeForm(); |
| expect(JSON.stringify(initial)).to.be.equal(JSON.stringify(final)); |
| done(); |
| }); |
| }); |
| }); |
| |
| suite('dynamically created', function() { |
| var server; |
| |
| setup(function() { |
| server = sinon.fakeServer.create(); |
| server.respondWith( |
| 'GET', |
| /\/get.*/, |
| [ |
| 200, |
| '{"Content-Type":"application/json"}', |
| '{"success":true}' |
| ] |
| ); |
| }); |
| |
| teardown(function() { |
| server.restore(); |
| }); |
| |
| test('submits a form', function(done) { |
| var form = document.createElement('iron-form'); |
| // Need to add to the document so observeNodes runs. |
| document.body.appendChild(form); |
| |
| var nativeForm = document.createElement('form'); |
| nativeForm.action = '/get'; |
| nativeForm.method = 'get'; |
| |
| var input = document.createElement('input'); |
| nativeForm.appendChild(input); |
| input.required = true; |
| input.name = 'foo'; |
| Polymer.dom(form).appendChild(nativeForm); |
| |
| form.addEventListener('iron-form-response', function(event) { |
| expect(event.detail.url).to.equal('/get?foo=bar'); |
| expect(event.detail.response.success).to.be.equal(true); |
| document.body.removeChild(form); |
| done(); |
| }); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| expect(form.validate()).to.be.equal(false); |
| input.value = 'bar'; |
| expect(form.validate()).to.be.equal(true); |
| form.submit(); |
| server.respond(); |
| }, 1); |
| }); |
| }); |
| |
| suite('content type', function() { |
| var server; |
| var f; |
| |
| setup(function() { |
| server = sinon.fakeServer.create(); |
| f = fixture('content-type'); |
| }); |
| |
| teardown(function() { |
| server.restore(); |
| }); |
| |
| test('submits a form with text/plain', function(done) { |
| var form = f.querySelector('#plain-form'); |
| |
| server.respondWith( |
| 'POST', |
| /\/valid\/url.*/, |
| function (request) { |
| expect(request.requestHeaders).to.deep.equal({ |
| "content-type": "text/plain;charset=utf-8", |
| "accept": "application/json"}); |
| expect(request.requestBody).to.deep.equal({ |
| "paper1": "value1", |
| "paper2": "value2"}); |
| done(); |
| } |
| ); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| test('submits a form with application/json', function(done) { |
| var form = f.querySelector('#json-form'); |
| |
| server.respondWith( |
| 'POST', |
| /\/valid\/url.*/, |
| function (request) { |
| expect(request.requestHeaders).to.deep.equal({ |
| "content-type": "application/json;charset=utf-8", |
| "accept": "application/json"}); |
| expect(request.requestBody).to.equal( |
| '{"paper1":"value1","paper2":"value2"}'); |
| done(); |
| } |
| ); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| test('submits a form with application/x-www-form-urlencoded', function(done) { |
| var form = f.querySelector('#simple-form'); |
| |
| server.respondWith( |
| 'POST', |
| /\/valid\/url.*/, |
| function (request) { |
| expect(request.requestHeaders).to.deep.equal({ |
| "content-type": "application/x-www-form-urlencoded;charset=utf-8", |
| "accept": "application/json"}); |
| expect(request.requestBody).to.equal( |
| 'paper1=value1&paper2=value2'); |
| done(); |
| } |
| ); |
| |
| // Wait one tick for observeNodes. |
| Polymer.Base.async(function() { |
| form.submit(); |
| server.respond(); |
| }); |
| }); |
| }); |
| </script> |
| </body> |
| </html> |