aboutsummaryrefslogtreecommitdiff
path: root/catapult/third_party/polymer/components/iron-form/test/basic.html
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/third_party/polymer/components/iron-form/test/basic.html')
-rw-r--r--catapult/third_party/polymer/components/iron-form/test/basic.html923
1 files changed, 923 insertions, 0 deletions
diff --git a/catapult/third_party/polymer/components/iron-form/test/basic.html b/catapult/third_party/polymer/components/iron-form/test/basic.html
new file mode 100644
index 00000000..8f649182
--- /dev/null
+++ b/catapult/third_party/polymer/components/iron-form/test/basic.html
@@ -0,0 +1,923 @@
+<!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>