mancha
Version:
Javscript HTML rendering engine
87 lines • 3.4 kB
JavaScript
import * as chai from "chai";
import chaiAsPromised from "chai-as-promised";
import { DomUtils } from "htmlparser2";
import { hasProperty } from "./dome.js";
export function innerHTML(elem) {
if (hasProperty(elem, "innerHTML"))
return elem.innerHTML;
else
return DomUtils.getInnerHTML(elem);
}
export function setInnerHTML(elem, html) {
// tsec-disable-next-line
elem.innerHTML = html;
}
// Custom recursive textContent that skips <template> tags for domhandler nodes.
export function getTextContent(node) {
if (hasProperty(node, "textContent"))
return node.textContent;
const n = node;
if (n.type === "text")
return n.data || null;
if (node.type === "tag" && node.name === "template")
return "";
if (node.children)
return node.children?.map(getTextContent).join("") ?? "";
return "";
}
export const isNode = typeof process !== "undefined" && process.versions != null && process.versions.node != null;
export async function setupGlobalTestEnvironment() {
// Set up global test environment for DOM manipulation.
// Fall back to JSDOM for DOM manipulation during testing.
if (!globalThis.window) {
// Import JSDOM dynamically, because it's not available in browser context.
const jsdomName = "jsdom";
const { JSDOM } = await import(jsdomName);
const dom = new JSDOM(``, { url: "http://localhost/" });
// Types.
globalThis.Document = globalThis.Document || dom.window.Document;
globalThis.DocumentFragment = globalThis.DocumentFragment || dom.window.DocumentFragment;
// Objects and Classes.
globalThis.window = globalThis.window || dom.window;
globalThis.document = globalThis.document || dom.window.document;
globalThis.DOMParser = globalThis.DOMParser || dom.window.DOMParser;
globalThis.XMLSerializer = globalThis.XMLSerializer || dom.window.XMLSerializer;
globalThis.PopStateEvent = globalThis.PopStateEvent || dom.window.PopStateEvent;
}
}
export function createFragment(html) {
// Use DOMParser to avoid tsec innerHTML violation and unify Node/Browser behavior.
const parser = new DOMParser();
const doc = parser.parseFromString(html, "text/html");
const fragment = document.createDocumentFragment();
// Move nodes to fragment
while (doc.body.firstChild) {
fragment.appendChild(doc.body.firstChild);
}
return fragment;
}
// Map the assert methods using Chai.
chai.use(chaiAsPromised);
export const assert = {
equal: (actual, expected, message) => {
chai.expect(actual, message).to.equal(expected);
},
deepEqual: (actual, expected, message) => {
chai.expect(actual, message).to.deep.equal(expected);
},
notEqual: (actual, expected, message) => {
chai.expect(actual, message).to.not.equal(expected);
},
greaterEqual: (actual, expected, message) => {
chai.expect(actual, message).to.be.gte(expected);
},
ok: (value, message) => {
chai.expect(value, message).to.be.ok;
},
fail: (message) => {
throw new Error(message);
},
throws: (fn, message) => {
chai.expect(fn, message).to.throw();
},
rejects: async (p, message) => {
await chai.expect(p, message).to.eventually.be.rejected;
},
};
//# sourceMappingURL=test_utils.js.map