UNPKG

html5validation

Version:

HTML5 ValidityState shim

773 lines (448 loc) 20.2 kB
'use strict'; describe('HTML5 Validation', function () { var sinon = require('sinon'), expect = require('chai').expect; var telRegExp = new RegExp(/^\+*\d+[\d ]+$/), $el = $( '<form>' + '<input type="text">' + '<input type="text" required>' + '<input type="text" disabled>' + '<input type="checkbox">' + '<input type="checkbox" required>' + '<input type="radio">' + '<input type="radio" required>' + '<input type="tel">' + '<input type="tel" required>' + '<input type="tel" pattern="' + telRegExp.source + '">' + '<input type="number">' + '<input type="number" required>' + '<input type="number" step="5" min="20" max="500">' + '<input type="range">' + '<input type="email">' + '<input type="email" required>' + '<input type="url">' + '<input type="url" required>' + '<select>' + '<option value="1">value1</option>' + '<option value="2">value2</option>' + '<option value="3">value3</option>' + '<option value="4">value4</option>' + '</select>' + '<select required>' + '<option value>Select</option>' + '<option value="1">value1</option>' + '<option value="2">value2</option>' + '<option value="3">value3</option>' + '<option value="4">value4</option>' + '</select>' + '<textarea></textarea>' + '<textarea required></textarea>' + '</form>'); require('../index'); before(function () { $('#test-body').append($el); }); describe('input[text]', function () { describe('not empty', function () { it('is valid', function () { $el.find('input[type="text"]').val('a string'); expect($el.find('input[type="text"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('[required]', function () { describe('empty', function () { it('is invalid', function () { $el.find('input[type="text"][required]').val(''); expect($el.find('input[type="text"][required]')[0].validity) .to.have.property('valid') .and.equal(false); expect($el.find('input[type="text"][required]')[0].validity) .to.have.property('valueMissing') .and.equal(true); }); }); describe('not empty', function () { it('is valid', function () { $el.find('input[type="text"][required]').val('a string'); expect($el.find('input[type="text"][required]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); }); describe('[disabled]', function () { it('will not validate', function () { $el.find('input[type="text"][disabled]').val('valid string'); expect($el.find('input[type="text"][disabled]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); }); describe('input[checkbox]', function () { describe('checked', function () { it('is valid', function () { $el.find('input[type="checkbox"]').prop('checked', true); expect($el.find('input[type="checkbox"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('[required]', function () { describe('unchecked', function () { it('is invalid', function () { $el.find('input[type="checkbox"][required]').prop('checked', false); expect($el.find('input[type="checkbox"][required]')[0].validity) .to.have.property('valid') .and.equal(false); expect($el.find('input[type="checkbox"][required]')[0].validity) .to.have.property('valueMissing') .and.equal(true); }); }); describe('checked', function () { it('is valid', function () { $el.find('input[type="checkbox"]').prop('checked', true); expect($el.find('input[type="checkbox"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); }); }); describe('input[radio]', function () { describe('checked', function () { it('is valid', function () { $el.find('input[type="radio"]').prop('checked', true); expect($el.find('input[type="radio"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('[required]', function () { describe('unchecked', function () { it('is valid', function () { $el.find('input[type="radio"][required]').prop('checked', false); expect($el.find('input[type="radio"][required]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); }); }); describe('input[tel]', function () { describe('with a number', function () { it('is valid', function () { $el.find('input[type="tel"]').val(123456789); expect($el.find('input[type="tel"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('with a string', function () { it('is valid', function () { $el.find('input[type="tel"]').val('a string'); expect($el.find('input[type="tel"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('[required]', function () { describe('empty', function () { it('is invalid', function () { $el.find('input[type="tel"][required]').val(''); expect($el.find('input[type="tel"][required]')[0].validity) .to.have.property('valid') .and.equal(false); }); }); }); describe('[pattern]', function () { describe('with an invalid value', function () { it('is invalid', function () { $el.find('input[type="tel"][pattern]').val(1); expect($el.find('input[type="tel"][pattern]')[0].validity) .to.have.property('valid') .and.equal(false); }); }); describe('with a valid value', function () { it('is valid', function () { $el.find('input[type="tel"][pattern]').val(123321654); expect($el.find('input[type="tel"][pattern]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); }); }); describe('input[number]', function () { describe('with a positive integer', function () { it('is valid', function () { $el.find('input[type="number"]').val(12); expect($el.find('input[type="number"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('with a decimal number', function () { it('is invalid', function () { $el.find('input[type="number"]').val(12.3456789); expect($el.find('input[type="number"]')[0].validity) .to.have.property('valid') .and.equal(false); }); }); describe('with a negative integer', function () { it('is valid', function () { $el.find('input[type="number"]').val(-12); expect($el.find('input[type="number"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('with a string', function () { it('is valid', function () { $el.find('input[type="number"]').val('12'); expect($el.find('input[type="number"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('[required]', function () { describe('empty', function () { it('is invalid', function () { $el.find('input[type="number"][required]').val(''); expect($el.find('input[type="number"][required]')[0].validity) .to.have.property('valid') .and.equal(false); }); }); }); describe('with step, min and max', function () { describe('with a step lower than min', function () { it('is invalid', function () { $el.find('input[type="number"][step]').val(15); expect($el.find('input[type="number"][step]')[0].validity) .to.have.property('valid') .and.equal(false); }); }); describe('with a step greater than max', function () { it('is invalid', function () { $el.find('input[type="number"][step]').val(505); expect($el.find('input[type="number"][step]')[0].validity) .to.have.property('valid') .and.equal(false); }); }); describe('with a step between min and max', function () { it('is valid', function () { $el.find('input[type="number"][step]').val(200); expect($el.find('input[type="number"][step]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('with a value out of step', function () { it('is invalid', function () { $el.find('input[type="number"][step]').val(202); expect($el.find('input[type="number"][step]')[0].validity) .to.have.property('valid') .and.equal(false); }); }); }); }); describe('input[range]', function () { describe('with a number', function () { it('is valid', function () { $el.find('input[type="range"]').val(123456789); expect($el.find('input[type="range"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('with a string', function () { it('is valid', function () { $el.find('input[type="range"]').val('a string'); expect($el.find('input[type="range"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('empty', function () { it('is invalid', function () { $el.find('input[type="range"]').val(''); expect($el.find('input[type="range"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); }); describe('input[email]', function () { describe('an invalid email', function () { it('is invalid', function () { $el.find('input[type="email"]').val('not_an_email'); expect($el.find('input[type="email"]')[0].validity) .to.have.property('valid') .and.equal(false); expect($el.find('input[type="email"]')[0].validity) .to.have.property('typeMismatch') .and.equal(true); }); }); describe('a valid email', function () { it('is valid', function () { $el.find('input[type="email"]').val('test@test.com'); expect($el.find('input[type="email"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('[required]', function () { describe('empty', function () { it('is invalid', function () { $el.find('input[type="email"][required]').val(''); expect($el.find('input[type="email"][required]')[0].validity) .to.have.property('valid') .and.equal(false); expect($el.find('input[type="email"][required]')[0].validity) .to.have.property('valueMissing') .and.equal(true); }); }); }); }); describe('input[url]', function () { describe('an invalid url', function () { it('is invalid', function () { $el.find('input[type="url"]').val('not a url'); expect($el.find('input[type="url"]')[0].validity) .to.have.property('valid') .and.equal(false); expect($el.find('input[type="url"]')[0].validity) .to.have.property('typeMismatch') .and.equal(true); }); }); describe('a valid url', function () { it('is valid', function () { $el.find('input[type="url"]').val('http://test.com'); expect($el.find('input[type="url"]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); describe('[required]', function () { describe('empty', function () { it('is invalid', function () { $el.find('input[type="url"][required]').val(''); expect($el.find('input[type="url"][required]')[0].validity) .to.have.property('valid') .and.equal(false); expect($el.find('input[type="url"][required]')[0].validity) .to.have.property('valueMissing') .and.equal(true); }); }); }); }); describe('select', function () { describe('value selected', function () { it('is valid', function () { $el.find('select').val('1'); expect($el.find('select')[0].validity) .to.have.property('valid') .and.equal(true); }); }); }); describe('textarea', function () { describe('[required]', function () { describe('empty', function () { it('is invalid', function () { expect($el.find('textarea[required]')[0].validity) .to.have.property('valid') .and.equal(false); expect($el.find('textarea[required]')[0].validity) .to.have.property('valueMissing') .and.equal(true); }); }); describe('not empty', function () { it('is valid', function () { $el.find('textarea[required]').val('some text'); expect($el.find('textarea[required]')[0].validity) .to.have.property('valid') .and.equal(true); }); }); }); }); describe('checkValidity', function () { describe('input[required]', function () { it('returns true if not empty (valid)', function () { $el.find('input[type="text"][required]').val('a string'); expect($el.find('input[type="text"][required]')[0].checkValidity()).to.equal(true); }); it('returns false if empty (invalid)', function () { $el.find('input[type="text"][required]').val(''); expect($el.find('input[type="text"][required]')[0].checkValidity()).to.equal(false); }); it('triggers "invalid" if empty (invalid)', function () { sinon.spy($el.find('input[type="text"][required]')[0], 'dispatchEvent'); $el.find('input[type="text"][required]').val(''); $el.find('input[type="text"][required]')[0].checkValidity(); expect($el.find('input[type="text"][required]')[0].dispatchEvent) .to.have.been.called; }); }); describe('textarea[required]', function () { it('returns true if not empty (valid)', function () { $el.find('textarea[required]').val('a string'); expect($el.find('textarea[required]')[0].checkValidity()).to.equal(true); }); it('returns false if empty (invalid)', function () { $el.find('textarea[required]').val(''); expect($el.find('textarea[required]')[0].checkValidity()).to.equal(false); }); it('triggers "invalid" if empty (invalid)', function () { sinon.spy($el.find('textarea[required]')[0], 'dispatchEvent'); $el.find('textarea[required]').val(''); $el.find('textarea[required]')[0].checkValidity(); expect($el.find('textarea[required]')[0].dispatchEvent) .to.have.been.called; }); }); describe('select[required]', function () { it('returns true if not empty (valid)', function () { $el.find('select[required]').val('1').change(); expect($el.find('select[required]')[0].checkValidity()).to.equal(true); }); it('returns false if empty (invalid)', function () { $el.find('select[required]').val('0').change(); expect($el.find('select[required]')[0].checkValidity()).to.equal(false); }); it('triggers "invalid" if empty (invalid)', function () { sinon.spy($el.find('select[required]')[0], 'dispatchEvent'); $el.find('select[required]').change(); $el.find('select[required]')[0].checkValidity(); expect($el.find('select[required]')[0].dispatchEvent) .to.have.been.called; }); }); }); describe('setCustomValidity', function () { var message = 'Custom validation message'; describe('input', function () { it('sets the message on input.validationMessage', function () { $el.find('input[required]')[0].setCustomValidity(message); expect($el.find('input[required]')[0].validationMessage).to.equal(message); }); }); }); });