describe('Core htmx client side validation tests', function() { beforeEach(function() { this.server = makeServer() clearWorkArea() }) afterEach(function() { this.server.restore() clearWorkArea() }) it('HTML5 required validation error prevents request', function() { this.server.respondWith('POST', '/test', 'Clicked!') var form = make('
') form.textContent.should.equal('No Request') form.click() this.server.respond() form.textContent.should.equal('No Request') byId('i1').value = 'foo' form.click() this.server.respond() form.textContent.should.equal('Clicked!') }) it('Novalidate skips form validation', function() { this.server.respondWith('POST', '/test', 'Clicked!') var form = make('') form.textContent.should.equal('No Request') form.click() this.server.respond() form.textContent.should.equal('Clicked!') }) it('Validation skipped for indirect form submission', function() { this.server.respondWith('POST', '/test', 'Clicked!') var form = make('') form.textContent.should.equal('No Request') byId('button').click() this.server.respond() form.textContent.should.equal('Clicked!') }) it('Formnovalidate skips form validation', function() { this.server.respondWith('POST', '/test', 'Clicked!') var form = make('') form.textContent.should.equal('No Request') byId('button').click() this.server.respond() form.textContent.should.equal('Clicked!') }) it('HTML5 pattern validation error prevents request', function() { this.server.respondWith('POST', '/test', 'Clicked!') var form = make('') byId('i1').value = 'xyz' form.textContent.should.equal('No Request') form.click() this.server.respond() form.textContent.should.equal('No Request') byId('i1').value = 'abc' form.click() this.server.respond() form.textContent.should.equal('Clicked!') }) it('Custom validation error prevents request', function() { this.server.respondWith('POST', '/test', 'Clicked!') var form = make('') byId('i1').setCustomValidity('Nope') form.textContent.should.equal('No Request') form.click() this.server.respond() form.textContent.should.equal('No Request') byId('i1').setCustomValidity('') form.click() this.server.respond() form.textContent.should.equal('Clicked!') }) it('hyperscript validation error prevents request', function() { this.server.respondWith('POST', '/test', 'Clicked!') var form = make('') htmx.trigger(form, 'htmx:load') byId('i1').value = 'boo' form.textContent.should.equal('No Request') form.click() this.server.respond() form.textContent.should.equal('No Request') byId('i1').value = 'foo' form.click() this.server.respond() form.textContent.should.equal('Clicked!') }) it('calls htmx:validation:failed on failure', function() { var form = make('') var calledEvent = false var handler = htmx.on(form, 'htmx:validation:failed', function() { calledEvent = true }) try { form.click() this.server.respond() } finally { htmx.off(form, handler) } calledEvent.should.equal(true) }) it('calls htmx:validation:halted on failure', function() { var form = make('') var errors = null var handler = htmx.on(form, 'htmx:validation:halted', function(evt) { errors = evt.detail.errors }) try { form.click() this.server.respond() } finally { htmx.off(form, handler) } errors.length.should.equal(1) byId('i1').should.equal(errors[0].elt) errors[0].validity.valueMissing.should.equal(true) }) it('hx-validate can prevent a single input from submitting', function() { this.server.respondWith('POST', '/test', 'Clicked!') var div = make("