describe('hx-include attribute', function() { beforeEach(function() { this.server = makeServer() clearWorkArea() }) afterEach(function() { this.server.restore() clearWorkArea() }) it('By default an input includes itself', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) var div = make('
') var input = byId('i1') input.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('non-GET includes closest form', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) var div = make('
') var input = byId('d1') input.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('non-GET includes closest form and overrides values included that exist outside the form', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) var div = make('
' + '' + '
' + '') var input = byId('d1') input.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('GET does not include closest form by default', function() { this.server.respondWith('GET', '/include', function(xhr) { var params = getParameters(xhr) should.equal(params.i1, undefined) xhr.respond(200, {}, 'Clicked!') }) var div = make('
') var input = byId('d1') input.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('Single input not included twice when in form', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) var div = make('
') var input = byId('i1') input.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('Two inputs are included twice when they have the same name', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.deep.equal(['test', 'test2']) xhr.respond(200, {}, 'Clicked!') }) var div = make('
' + '' + '' + '
') var input = byId('i1') input.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('Two inputs are included twice when in form when they have the same name', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.deep.equal(['test', 'test2']) xhr.respond(200, {}, 'Clicked!') }) var div = make('
' + '' + '' + '
') var input = byId('i1') input.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('Input not included twice when it explicitly refers to parent form', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) var div = make('
' + '' + '
') var input = byId('i1') input.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('Input can be referred to externally', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) make('') var div = make('
') div.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('Input can be referred to externally and then via a form then it will only be included once', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) make('
') var div = make('
') div.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('checkbox can be referred to externally', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('on') xhr.respond(200, {}, 'Clicked!') }) make('') var div = make('
') div.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('files input can be referred to externally', function() { // This test is just to make loc coverage complete and does not test that real file values are sent this.server.respondWith('POST', '/include', function(xhr) { xhr.respond(200, {}, 'Clicked!') }) make('') var div = make('
') div.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('properly handles multiple select input referred to externally', function() { var values this.server.respondWith('Post', '/include', function(xhr) { values = getParameters(xhr) xhr.respond(204, {}, '') }) make('') var div = make('
') div.click() this.server.respond() values.should.deep.equal({}) byId('m1').selected = true div.click() this.server.respond() values.should.deep.equal({ multiSelect: 'm1' }) byId('m1').selected = true byId('m3').selected = true div.click() this.server.respond() values.should.deep.equal({ multiSelect: ['m1', 'm3'] }) }) it('properly handles multiple select input referred to externally and then via a form then it will only be included once', function() { var values this.server.respondWith('Post', '/include', function(xhr) { values = getParameters(xhr) xhr.respond(204, {}, '') }) make('
') var div = make('
') div.click() this.server.respond() values.should.deep.equal({}) byId('m1').selected = true div.click() this.server.respond() values.should.deep.equal({ multiSelect: 'm1' }) byId('m1').selected = true byId('m3').selected = true div.click() this.server.respond() values.should.deep.equal({ multiSelect: ['m1', 'm3'] }) }) it('Two inputs can be referred to externally', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') params.i2.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) make('') make('') var div = make('
') div.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('A form can be referred to externally', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') params.i2.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) make('
' + '' + '' + '
') var div = make('
') div.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('By default an input includes itself w/ data-* prefix', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) var div = make('
') var input = byId('i1') input.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('If the element is not includeable, its descendant inputs are included', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') params.i2.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) make('
') var div = make('
') div.click() this.server.respond() div.innerHTML.should.equal('Clicked!') }) it('The `closest` modifier can be used in the hx-include selector', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') params.i2.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) make('
' + '
') var btn = byId('btn') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') }) it('The `this` modifier can be used in the hx-include selector', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') params.i2.should.equal('test') xhr.respond(200, {}, 'Clicked!') }) make('
' + '
') var btn = byId('btn') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') }) it('Multiple extended selectors can be used in hx-include', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') params.i2.should.equal('foo') params.i3.should.equal('bar') params.i4.should.equal('test2') xhr.respond(200, {}, 'Clicked!') }) make('' + '
' + '' + '' + '' + '
' + '') var btn = byId('btn') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') }) it('hx-include processes extended selector in between standard selectors', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') should.equal(params.i2, undefined) params.i3.should.equal('bar') params.i4.should.equal('test2') xhr.respond(200, {}, 'Clicked!') }) make('' + '
' + '' + '' + '' + '
' + '') var btn = byId('btn') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') }) it('hx-include processes nested standard selectors correctly', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) params.i1.should.equal('test') params.i2.should.equal('foo') params.i3.should.equal('bar') should.equal(params.i4, undefined) should.equal(params.i5, undefined) xhr.respond(200, {}, 'Clicked!') }) make('' + '
' + '' + '' + '' + '' + '
' + '') var btn = byId('btn') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') }) it('hx-include processes wrapped next/previous selectors correctly', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) should.equal(params.i1, undefined) params.i2.should.equal('foo') params.i3.should.equal('bar') should.equal(params.i4, undefined) should.equal(params.i5, undefined) xhr.respond(200, {}, 'Clicked!') }) make('' + '
' + '' + '' + '' + '
' + '' + '') var btn = byId('btn') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') }) it('hx-include processes wrapped closest selector correctly', function() { this.server.respondWith('POST', '/include', function(xhr) { var params = getParameters(xhr) should.equal(params.i1, undefined) params.i2.should.equal('bar') xhr.respond(200, {}, 'Clicked!') }) make('
' + '' + '
' + '' + '' + '
' + '
') var btn = byId('btn') btn.click() this.server.respond() btn.innerHTML.should.equal('Clicked!') }) })