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("