describe("hx-swap attribute", function(){ beforeEach(function() { this.server = makeServer(); clearWorkArea(); }); afterEach(function() { this.server.restore(); clearWorkArea(); }); it('swap innerHTML properly', function() { this.server.respondWith("GET", "/test", 'Click Me'); this.server.respondWith("GET", "/test2", "Clicked!"); var div = make('
') div.click(); this.server.respond(); div.innerHTML.should.equal('Click Me'); var a = div.querySelector('a'); a.click(); this.server.respond(); a.innerHTML.should.equal('Clicked!'); }); it('swap outerHTML properly', function() { this.server.respondWith("GET", "/test", 'Click Me'); this.server.respondWith("GET", "/test2", "Clicked!"); var div = make('
') div.click(); should.equal(byId("d1"), div); this.server.respond(); should.equal(byId("d1"), null); byId("a1").click(); this.server.respond(); byId("a1").innerHTML.should.equal('Clicked!'); }); it('swap beforebegin properly', function() { var i = 0; this.server.respondWith("GET", "/test", function(xhr){ i++; xhr.respond(200, {}, '' + i + ''); }); this.server.respondWith("GET", "/test2", "*"); var div = make('
*
') var parent = div.parentElement; div.click(); this.server.respond(); div.innerText.should.equal("*"); removeWhiteSpace(parent.innerText).should.equal("1*"); byId("a1").click(); this.server.respond(); removeWhiteSpace(parent.innerText).should.equal("**"); div.click(); this.server.respond(); div.innerText.should.equal("*"); removeWhiteSpace(parent.innerText).should.equal("*2*"); byId("a2").click(); this.server.respond(); removeWhiteSpace(parent.innerText).should.equal("***"); }); it('swap afterbegin properly', function() { var i = 0; this.server.respondWith("GET", "/test", function(xhr){ i++; xhr.respond(200, {}, "" + i); }); var div = make('
*
') div.click(); this.server.respond(); div.innerText.should.equal("1*"); div.click(); this.server.respond(); div.innerText.should.equal("21*"); div.click(); this.server.respond(); div.innerText.should.equal("321*"); }); it('swap afterbegin properly with no initial content', function() { var i = 0; this.server.respondWith("GET", "/test", function(xhr){ i++; xhr.respond(200, {}, "" + i); }); var div = make('
') div.click(); this.server.respond(); div.innerText.should.equal("1"); div.click(); this.server.respond(); div.innerText.should.equal("21"); div.click(); this.server.respond(); div.innerText.should.equal("321"); }); it('swap afterend properly', function() { var i = 0; this.server.respondWith("GET", "/test", function(xhr){ i++; xhr.respond(200, {}, '' + i + ''); }); this.server.respondWith("GET", "/test2", "*"); var div = make('
*
') var parent = div.parentElement; div.click(); this.server.respond(); div.innerText.should.equal("*"); removeWhiteSpace(parent.innerText).should.equal("*1"); byId("a1").click(); this.server.respond(); removeWhiteSpace(parent.innerText).should.equal("**"); div.click(); this.server.respond(); div.innerText.should.equal("*"); removeWhiteSpace(parent.innerText).should.equal("*2*"); byId("a2").click(); this.server.respond(); removeWhiteSpace(parent.innerText).should.equal("***"); }); it('handles beforeend properly', function() { var i = 0; this.server.respondWith("GET", "/test", function(xhr){ i++; xhr.respond(200, {}, "" + i); }); var div = make('
*
') div.click(); this.server.respond(); div.innerText.should.equal("*1"); div.click(); this.server.respond(); div.innerText.should.equal("*12"); div.click(); this.server.respond(); div.innerText.should.equal("*123"); }); it('handles beforeend properly with no initial content', function() { var i = 0; this.server.respondWith("GET", "/test", function(xhr){ i++; xhr.respond(200, {}, "" + i); }); var div = make('
') div.click(); this.server.respond(); div.innerText.should.equal("1"); div.click(); this.server.respond(); div.innerText.should.equal("12"); div.click(); this.server.respond(); div.innerText.should.equal("123"); }); it('properly parses various swap specifications', function(){ var swapSpec = htmx._("getSwapSpecification"); // internal function for swap spec swapSpec(make("
")).swapStyle.should.equal("innerHTML") swapSpec(make("
")).swapStyle.should.equal("innerHTML") swapSpec(make("
")).swapDelay.should.equal(0) swapSpec(make("
")).settleDelay.should.equal(0) // set to 0 in tests swapSpec(make("
")).swapDelay.should.equal(10) swapSpec(make("
")).settleDelay.should.equal(10) swapSpec(make("
")).swapDelay.should.equal(10) swapSpec(make("
")).settleDelay.should.equal(11) swapSpec(make("
")).swapDelay.should.equal(10) swapSpec(make("
")).settleDelay.should.equal(11) swapSpec(make("
")).settleDelay.should.equal(11) swapSpec(make("
")).settleDelay.should.equal(11) swapSpec(make("
")).swapStyle.should.equal("innerHTML") swapSpec(make("
")).swapDelay.should.equal(10) swapSpec(make("
")).swapStyle.should.equal("innerHTML") swapSpec(make("
")).settleDelay.should.equal(10) swapSpec(make("
")).swapStyle.should.equal("innerHTML") swapSpec(make("
")).swapDelay.should.equal(10) swapSpec(make("
")).settleDelay.should.equal(11) swapSpec(make("
")).swapStyle.should.equal("innerHTML") swapSpec(make("
")).swapDelay.should.equal(10) swapSpec(make("
")).settleDelay.should.equal(11) swapSpec(make("
")).swapStyle.should.equal("customstyle") }) it('works with a swap delay', function(done) { this.server.respondWith("GET", "/test", "Clicked!"); var div = make("
"); div.click(); this.server.respond(); div.innerText.should.equal(""); setTimeout(function () { div.innerText.should.equal("Clicked!"); done(); }, 30); }); it('works with a settle delay', function(done) { this.server.respondWith("GET", "/test", "
"); var div = make("
"); div.click(); this.server.respond(); div.classList.contains('foo').should.equal(false); setTimeout(function () { byId('d1').classList.contains('foo').should.equal(true); done(); }, 30); }); it('swap outerHTML properly w/ data-* prefix', function() { this.server.respondWith("GET", "/test", 'Click Me'); this.server.respondWith("GET", "/test2", "Clicked!"); var div = make('
') div.click(); should.equal(byId("d1"), div); this.server.respond(); should.equal(byId("d1"), null); byId("a1").click(); this.server.respond(); byId("a1").innerHTML.should.equal('Clicked!'); }); it('swap none works properly', function() { this.server.respondWith("GET", "/test", 'Ooops, swapped'); var div = make('
Foo
') div.click(); this.server.respond(); div.innerHTML.should.equal('Foo'); }); it('swap outerHTML does not trigger htmx:afterSwap on original element', function() { this.server.respondWith("GET", "/test", 'Clicked!'); var div = make('
') div.addEventListener("htmx:afterSwap", function(){ count++; }) div.click(); var count = 0; should.equal(byId("d1"), div); this.server.respond(); should.equal(byId("d1"), null); count.should.equal(0); }); it('swap delete works properly', function() { this.server.respondWith("GET", "/test", 'Oops, deleted!'); var div = make('
Foo
') div.click(); this.server.respond(); should.equal(byId("d1"), null); }); it('in presence of bad swap spec, it uses the default swap strategy', function() { var initialSwapStyle = htmx.config.defaultSwapStyle; htmx.config.defaultSwapStyle = "outerHTML"; try { this.server.respondWith("GET", "/test", "Clicked!"); var div = make('
') var b1 = byId("b1"); b1.click(); this.server.respond(); div.innerHTML.should.equal('Clicked!'); } finally { htmx.config.defaultSwapStyle = initialSwapStyle; } }); it('hx-swap ignoreTitle works', function() { window.document.title = "Test Title"; this.server.respondWith("GET", "/test", function (xhr) { xhr.respond(200, {}, "htmx rocks!Clicked!"); }); var btn = make('') btn.click(); this.server.respond(); btn.innerText.should.equal("Clicked!"); window.document.title.should.equal("Test Title"); }); })