describe("xhr-requires-server", { skipIfBrowser: true }, () => { let testHost = null; beforeEach(() => { return new Promise((resolve, reject) => { portfinder.getPort((err, port) => { if (err) { reject(err); return; } http.createServer((req, res) => { res.writeHead(200, [["date", "0"]]); res.end("<body></body>"); }) .listen(port); testHost = "http://127.0.0.1:" + port; resolve(); }); }); }); specify("Getting a non-file URL should not fail for getAllResponseHeaders", t => { // From https://github.com/tmpvar/jsdom/pull/1183 const window = jsdom.jsdom(undefined, { url: testHost + "/TestPath/get-headers" }).defaultView; const xhr = new window.XMLHttpRequest(); xhr.onload = () => { assert.doesNotThrow(() => { assert.strictEqual( xhr.getAllResponseHeaders(), "date: 0\r\nconnection: keep-alive\r\ntransfer-encoding: chunked" ); }); t.done(); }; xhr.open("GET", testHost + "/TestPath/get-headers", true); xhr.send(); }, { async: true }); });
describe("class-list", () => { beforeEach(() => { const doc = jsdom.jsdom(); el = doc.createElement("p"); window = doc.defaultView; }); specify("classList is a DOMTokenList", () => { // when element has no class assert.equal(el.classList.constructor, window.DOMTokenList); // when element has a class el.className = "foo"; assert.equal(el.classList.constructor, window.DOMTokenList); }); specify(".length returns number of tokens", () => { assert.equal(el.classList.length, 0); el.className = "foo"; assert.equal(el.classList.length, 1); el.className = "foo foo"; assert.equal(el.classList.length, 1); el.className = "foo foo bar"; assert.equal(el.classList.length, 2); }); specify(".item(index) returns expected token", () => { el.className = "foo bar"; assert.equal(el.classList.item(0), "foo"); assert.equal(el.classList.item(1), "bar"); // when provided index equal to or greater than length, return null assert.equal(el.classList.item(2), null); // when provided index negative, return null assert.equal(el.classList.item(-1), null); assert.equal(el.classList.item(-2), null); }); specify("[index] returns expected token", () => { el.className = "foo bar"; assert.equal(el.classList[0], "foo"); assert.equal(el.classList[1], "bar"); // when provided index equal to or greater than length, return undefined assert.equal(el.classList[2], undefined); }); specify(".contains(token) returns whether token exists", () => { el.className = "foo bar"; // token exists assert.ok(el.classList.contains("foo")); assert.ok(el.classList.contains("bar")); // token does not exist assert.equal(el.classList.contains("baz"), false); }); specify(".add(tokens...) adds provided tokens", () => { // add zero tokens el.classList.add(); assert.equal(el.className, ""); assert.equal(el.classList.length, 0); // add one token el.classList.add("foo"); assert.equal(el.className, "foo"); assert.equal(el.classList[0], "foo"); // add one token twice el.classList.add("foo", "foo"); assert.equal(el.className, "foo"); assert.equal(el.classList[0], "foo"); // add two distinct tokens el.className = ""; el.classList.add("foo", "bar"); assert.equal(el.className, "foo bar"); assert.equal(el.classList[0], "foo"); assert.equal(el.classList[1], "bar"); }); specify(".add() throws if a token is empty", () => { function block() { el.classList.add("foo", ""); } assert.throwsDomException(block, el.ownerDocument, "SyntaxError"); }); specify(".add() throws if a token contains whitespace", () => { function block() { el.classList.add(" foo", "bar"); } assert.throwsDomException(block, el.ownerDocument, "InvalidCharacterError"); }); specify(".remove(tokens...) removes provided tokens", () => { // remove exactly all tokens el.className = "foo bar"; el.classList.remove("bar", "foo"); assert.equal(el.className, ""); assert.equal(el.classList.length, 0); // remove more tokens than exist el.className = "foo bar"; el.classList.remove("bar"); assert.equal(el.className, "foo"); assert.equal(el.classList[0], "foo"); // remove some of the tokens el.className = "foo"; el.classList.remove("foo", "bar"); assert.equal(el.className, ""); assert.equal(el.classList.length, 0); // remove one token twice el.className = "foo bar"; el.classList.remove("bar", "bar"); assert.equal(el.className, "foo"); assert.equal(el.classList[0], "foo"); // remove repeated token el.className = "foo foo"; el.classList.remove("foo"); assert.equal(el.className, ""); assert.equal(el.classList.length, 0); }); specify(".remove() throws if a token is empty", () => { function block() { el.classList.remove("foo", ""); } assert.throwsDomException(block, el.ownerDocument, "SyntaxError"); }); specify(".remove() throws if a token contains whitespace", () => { function block() { el.classList.remove(" foo", "bar"); } assert.throwsDomException(block, el.ownerDocument, "InvalidCharacterError"); }); specify(".toggle(token) toggles specified token", () => { // toggle existing token el.className = "foo"; el.classList.toggle("foo"); assert.equal(el.className, ""); assert.equal(el.classList.length, 0); // toggle token not present el.className = ""; el.classList.toggle("foo"); assert.equal(el.className, "foo"); assert.equal(el.classList[0], "foo"); }); specify(".toggle(token, true) adds token", () => { // add token already present el.className = "foo"; el.classList.toggle("foo", true); assert.equal(el.className, "foo"); assert.equal(el.classList[0], "foo"); // add token not present el.className = ""; el.classList.toggle("foo", true); assert.equal(el.className, "foo"); assert.equal(el.classList[0], "foo"); }); specify(".toggle(token, false) removes token", () => { // remove existing token el.className = "foo"; el.classList.toggle("foo", false); assert.equal(el.className, ""); assert.equal(el.classList.length, 0); // remove a token that does not exist el.className = ""; el.classList.toggle("foo", false); assert.equal(el.className, ""); assert.equal(el.classList.length, 0); }); specify(".toggle(token) returns whether token exists", () => { // token toggled off el.className = "foo"; assert.equal(el.classList.toggle("foo"), false); // token toggled on el.className = ""; assert.equal(el.classList.toggle("foo"), true); }); specify(".toggle() throws if a token is empty", () => { function block() { el.classList.toggle(""); } assert.throwsDomException(block, el.ownerDocument, "SyntaxError"); }); specify(".toggle() throws if a token contains whitespace", () => { function block() { el.classList.toggle(" foo"); } assert.throwsDomException(block, el.ownerDocument, "InvalidCharacterError"); }); specify("accessing classList should not remove duplicates", () => { el.className = "a a"; /* eslint-disable no-unused-expressions */ el.classList; /* eslint-enable no-unused-expressions */ assert.equal(el.className, "a a"); assert.equal(el.classList.toString(), "a a"); }); specify(".toString() should return empty string when empty", () => { assert.equal(el.classList.toString(), ""); }); specify("classList should return same object", () => { const { classList } = el; assert.equal(classList, el.classList); el.className = "foo foo"; assert.equal(classList, el.classList); }); specify("length should be readonly", () => { const { classList } = el; assert.equal(classList.length, 0); assert.throws(() => { classList.length = "an apple"; }, TypeError); }); });