@util.js/jquery
Version:
JavaScript utility methods for jQuery
121 lines (113 loc) • 4.4 kB
JavaScript
"use strict";
const { expect } = require("chai");
const jQueryUtils = require("..");
const { JSDOM } = require("jsdom");
const promises = require("@util.js/promises");
describe("JQueryUtils", () => {
describe("#loadjQuery(params[, callback])", () => {
it("should successfully load jQuery and return a Promise", () => {
const dom = new JSDOM(
`<html><body><script></script></body></html>`,
{ resources: "usable", runScripts: "dangerously" }
);
const window = dom.window;
global.document = window.document;
return jQueryUtils.loadjQuery({ window }).then(($) => {
expect(window.document.body.innerHTML).to.eql(
'<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script><script></script>'
);
expect($.fn.jquery).to.eql("3.4.1");
});
});
it("should successfully load jQuery when src is specified", () => {
const dom = new JSDOM(
`<html><body><script></script></body></html>`,
{ resources: "usable", runScripts: "dangerously" }
);
const window = dom.window;
global.document = window.document;
return jQueryUtils
.loadjQuery({
src: "https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js",
window,
})
.then(($) => {
expect(window.document.body.innerHTML).to.eql(
'<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script><script></script>'
);
expect($.fn.jquery).to.eql("3.1.0");
});
});
it("should successfully load jQuery and notify a callback", (callback) => {
const dom = new JSDOM(
`<html><body><script></script></body></html>`,
{ resources: "usable", runScripts: "dangerously" }
);
const window = dom.window;
global.document = window.document;
return jQueryUtils.loadjQuery({ window }, (error, $) => {
if (error) return callback(error);
try {
expect(window.document.body.innerHTML).to.eql(
'<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script><script></script>'
);
expect($.fn.jquery).to.eql("3.4.1");
callback();
} catch (err) {
callback(err);
}
});
});
it("should throw an error when params is undefined, null, or params has an invalid window object", () => {
const a = jQueryUtils
.loadjQuery()
.then(($) =>
expect.fail("We expected the function to throw a TypeError.")
)
.catch((error) => expect(error).to.be.an.instanceof(TypeError));
const b = jQueryUtils
.loadjQuery(null)
.then(($) =>
expect.fail("We expected the function to throw a TypeError.")
)
.catch((error) => expect(error).to.be.an.instanceof(TypeError));
const c = jQueryUtils
.loadjQuery({ window: {} })
.then(($) =>
expect.fail("We expected the function to throw a TypeError.")
)
.catch((error) => expect(error).to.be.an.instanceof(TypeError));
return promises.all([a, b, c]);
});
it("should handle hijacking of the src parameter", () => {
const dom = new JSDOM(
`<html><body><script></script></body></html>`
);
const window = dom.window;
jQueryUtils.loadjQuery({
src: '"></script><p>Intruder Code</p><br style="',
window,
});
expect(window.document.body.innerHTML).to.eql(
'<script src=""></script><p>Intruder Code</p><br style=""></script><script></script>'
);
});
it("should handle failure gracefully", () => {
const dom = new JSDOM(
`<html><body><script></script></body></html>`,
{ resources: "usable", runScripts: "dangerously" }
);
const window = dom.window;
global.document = window.document;
return jQueryUtils
.loadjQuery({
src: "https://ajax.googleapis.com/ajax/libs/mootools/1.6.0/mootools.min.js",
window,
})
.then(($) =>
expect.fail("We expected the function to throw a TypeError.")
)
.catch((error) => expect(error).to.be.an.instanceof(Error));
});
});
});