htmx/www/static/test/core/internals.js
Alexander Petros d1288d202a
Remove old tests from the website (#1733)
The website used to host every past test suite, copied into the www
directory. We no longer need that on the website (and it makes the
codebase impossible to search) so I removed all the old tests and the
new tests are hosted simply at /test.

I also replaced the www.js script with a simpler www.sh one (since we no
longer need to do anything besides copying, really), which allowed me to
remove a node dependency that was only used in that script.
2023-09-19 11:07:24 -05:00

135 lines
5.7 KiB
JavaScript

describe("Core htmx internals Tests", function() {
beforeEach(function () {
this.server = makeServer();
clearWorkArea();
});
afterEach(function () {
this.server.restore();
clearWorkArea();
});
it("makeFragment works with janky stuff", function(){
htmx._("makeFragment")("<html></html>").tagName.should.equal("BODY");
htmx._("makeFragment")("<html><body></body></html>").tagName.should.equal("BODY");
//NB - the tag name should be the *parent* element hosting the HTML since we use the fragment children
// for the swap
htmx._("makeFragment")("<td></td>").tagName.should.equal("TR");
htmx._("makeFragment")("<thead></thead>").tagName.should.equal("TABLE");
htmx._("makeFragment")("<col></col>").tagName.should.equal("COLGROUP");
htmx._("makeFragment")("<tr></tr>").tagName.should.equal("TBODY");
})
it("makeFragment works with template wrapping", function(){
htmx.config.useTemplateFragments = true;
try {
htmx._("makeFragment")("<html></html>").children.length.should.equal(0);
htmx._("makeFragment")("<html><body></body></html>").children.length.should.equal(0);
var fragment = htmx._("makeFragment")("<td></td>");
fragment.firstElementChild.tagName.should.equal("TD");
fragment = htmx._("makeFragment")("<thead></thead>");
fragment.firstElementChild.tagName.should.equal("THEAD");
fragment = htmx._("makeFragment")("<col></col>");
fragment.firstElementChild.tagName.should.equal("COL");
fragment = htmx._("makeFragment")("<tr></tr>");
fragment.firstElementChild.tagName.should.equal("TR");
} finally {
htmx.config.useTemplateFragments = false;
}
})
it("makeFragment works with template wrapping and funky combos", function(){
htmx.config.useTemplateFragments = true;
try {
var fragment = htmx._("makeFragment")("<td></td><div></div>");
fragment.children[0].tagName.should.equal("TD");
fragment.children[1].tagName.should.equal("DIV");
} finally {
htmx.config.useTemplateFragments = false;
}
})
it("set header works with non-ASCII values", function(){
var xhr = new XMLHttpRequest();
xhr.open("GET", "/dummy");
htmx._("safelySetHeaderValue")(xhr, "Example", "привет");
// unfortunately I can't test the value :/
// https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
})
it("handles parseInterval correctly", function() {
chai.expect(htmx.parseInterval("1ms")).to.be.equal(1);
chai.expect(htmx.parseInterval("300ms")).to.be.equal(300);
chai.expect(htmx.parseInterval("1s")).to.be.equal(1000)
chai.expect(htmx.parseInterval("1.5s")).to.be.equal(1500)
chai.expect(htmx.parseInterval("2s")).to.be.equal(2000)
chai.expect(htmx.parseInterval(null)).to.be.undefined
chai.expect(htmx.parseInterval("")).to.be.undefined
chai.expect(htmx.parseInterval("undefined")).to.be.undefined
chai.expect(htmx.parseInterval("true")).to.be.undefined
chai.expect(htmx.parseInterval("false")).to.be.undefined
})
it("tokenizes correctly", function() {
chai.expect(htmx._("tokenizeString")("a,")).to.be.deep.equal(['a', ',']);
chai.expect(htmx._("tokenizeString")("aa,")).to.be.deep.equal(['aa', ',']);
chai.expect(htmx._("tokenizeString")("aa,aa")).to.be.deep.equal(['aa', ',', 'aa']);
chai.expect(htmx._("tokenizeString")("aa.aa")).to.be.deep.equal(['aa', '.', 'aa']);
})
it("tags respond correctly to shouldCancel", function() {
var anchorThatShouldCancel = make("<a href='/foo'></a>");
htmx._("shouldCancel")({type:'click'}, anchorThatShouldCancel).should.equal(true);
var anchorThatShouldCancel = make("<a href='#'></a>");
htmx._("shouldCancel")({type:'click'}, anchorThatShouldCancel).should.equal(true);
var anchorThatShouldNotCancel = make("<a href='#foo'></a>");
htmx._("shouldCancel")({type:'click'}, anchorThatShouldNotCancel).should.equal(false);
var form = make("<form></form>");
htmx._("shouldCancel")({type:'submit'}, form).should.equal(true);
var form = make("<form><input id='i1' type='submit'></form>");
var input = byId("i1");
htmx._("shouldCancel")({type:'click'}, input).should.equal(true);
var form = make("<form><button id='b1' type='submit'></form>");
var button = byId("b1");
htmx._("shouldCancel")({type:'click'}, button).should.equal(true);
})
it("unset properly unsets a given attribute", function(){
make("<div foo='1'><div foo='2'><div foo='unset' id='d1'></div></div></div>");
var div = byId("d1");
should.equal(undefined, htmx._("getClosestAttributeValue")(div, "foo"));
})
it("unset properly unsets a given attribute on a parent", function(){
make("<div foo='1'><div foo='unset'><div id='d1'></div></div></div>");
var div = byId("d1");
should.equal(undefined, htmx._("getClosestAttributeValue")(div, "foo"));
})
it("unset does not unset a value below it in the hierarchy", function(){
make("<div foo='unset'><div foo='2'><div id='d1'></div></div></div>");
var div = byId("d1");
should.equal("2", htmx._("getClosestAttributeValue")(div, "foo"));
})
it("encoding values respects enctype on forms", function(){
var form = make("<form enctype='multipart/form-data'></form>");
var value = htmx._("encodeParamsForBody")(null, form, {});
(value instanceof FormData).should.equal(true);
})
});