Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions test/client/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ var clientParser = require('../../lib/html-to-dom-client');
var helpers = require('../helpers');

describe('client parser', function () {
helpers.throwsError(clientParser, assert);
helpers.runTests(htmlCases, clientParser, serverParser, assert);
helpers.throwErrors(assert, clientParser);
helpers.runTests(assert, clientParser, serverParser, htmlCases);

describe('performance', function () {
it('executes 1000 times in less than 50ms', function () {
Expand Down
2 changes: 1 addition & 1 deletion test/helpers/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module.exports = {
runTests: require('./run-tests'),
throwsError: require('./throws-error')
throwErrors: require('./throw-errors')
};
18 changes: 3 additions & 15 deletions test/helpers/run-tests.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,12 @@
/**
* Runs tests.
*
* @param {Function} assert - Assert.
* @param {Object} testCases - Test cases.
* @param {Function} expectedParser - Expected parser.
* @param {Function} actualParser - Actual parser.
* @param {Function} [assert] - Assertion module.
* @param {Function} expectedParser - Expected parser.
*/
function runTests(testCases, expectedParser, actualParser, assert) {
if (typeof assert !== 'function') {
assert = require('assert');
}

if (typeof expectedParser !== 'function') {
throw new TypeError('Missing or invalid expected parser');
}

if (typeof actualParser !== 'function') {
throw new TypeError('Missing or invalid actual parser');
}

function runTests(assert, actualParser, expectedParser, testCases) {
// enable `decodeEntities` for both parsers
// because entities are decoded on the browser
var parserOptions = { decodeEntities: true };
Expand Down
14 changes: 5 additions & 9 deletions test/helpers/throws-error.js → test/helpers/throw-errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,17 @@ var values = [
/**
* Calls parser with invalid arguments.
*
* @param {Function} parser - The parser.
* @param {Function} [assert] - The assertion module.
* @param {Function} assert - Assert.
* @param {Function} expectedParser - Expected parser.
*/
function throwsError(parser, assert) {
if (typeof assert !== 'function') {
assert = require('assert');
}

function throwErrors(assert, expectedParser) {
values.forEach(function (value) {
it('throws error for argument: ' + value, function () {
assert.throws(function () {
parser(value);
expectedParser(value);
}, TypeError);
});
});
}

module.exports = throwsError;
module.exports = throwErrors;
80 changes: 37 additions & 43 deletions test/server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,69 +2,63 @@ const { expect } = require('chai');
const sinon = require('sinon');
const mock = require('mock-require');

let parser;
let ParserSpy;
let parserEndSpy;
let DomHandlerSpy;

const html = '<html>';
const dom = [
{
type: 'tag',
name: 'html',
attribs: {},
children: [],
next: null,
prev: null,
parent: null
}
];

function clearRequireCache() {
Object.keys(require.cache).forEach(function (key) {
function resetModules() {
Object.keys(require.cache).forEach(key => {
delete require.cache[key];
});
}

const parserEnd = sinon.spy();
const Parser = sinon.spy(function () {
this.end = parserEnd;
});

const DomHandler = sinon.spy(function () {
this.dom = [
{
type: 'tag',
name: 'html',
attribs: {},
children: [],
next: null,
prev: null,
parent: null
}
];
});

const html = '<html>';

describe('server parser', () => {
// before
parserEndSpy = sinon.spy();
ParserSpy = sinon.spy(function () {
this.end = parserEndSpy;
});
DomHandlerSpy = sinon.spy(function () {
this.dom = dom;
});

// tests
mock('htmlparser2/lib/Parser', ParserSpy);
mock('domhandler', DomHandlerSpy);
parser = require('../..');
mock('htmlparser2/lib/Parser', Parser);
mock('domhandler', DomHandler);
const parse = require('../..');

it('calls `domhandler` and `htmlparser2/lib/Parser`', () => {
parser(html);
expect(DomHandlerSpy.called).to.equal(true);
expect(ParserSpy.called).to.equal(true);
expect(parserEndSpy.called).to.equal(true);
parse(html);
expect(DomHandler.called).to.equal(true);
expect(Parser.called).to.equal(true);
expect(parserEnd.called).to.equal(true);
});

it('passes options to `domhandler` and arguments to `htmlparser2/lib/Parser`', () => {
const options = { decodeEntities: true };
parser(html, options);
expect(DomHandlerSpy.calledWith(options)).to.equal(true);
expect(ParserSpy.calledWith(DomHandlerSpy, options));
parse(html, options);
expect(DomHandler.calledWith(options)).to.equal(true);
expect(Parser.calledWith(DomHandler, options));
});

it('passes html to `htmlparser2/lib/Parser` end', () => {
parser(html);
expect(parserEndSpy.calledWith(html)).to.equal(true);
parse(html);
expect(parserEnd.calledWith(html)).to.equal(true);
});

it('returns `domhandler` dom', () => {
expect(parser(html)).to.equal(DomHandlerSpy.lastCall.returnValue.dom);
expect(parse(html)).to.equal(DomHandler.lastCall.returnValue.dom);
});

// after
mock.stopAll();
clearRequireCache();
resetModules();
});
20 changes: 10 additions & 10 deletions test/server/server.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const { assert } = require('chai');
const htmlparser = require('htmlparser2');
const cases = require('../cases');
const { runTests, throwsError } = require('../helpers');
const { runTests, throwErrors } = require('../helpers');
const { CASE_SENSITIVE_TAG_NAMES } = require('../../lib/constants');

/**
Expand All @@ -20,25 +20,25 @@ function testCaseSensitiveTags(parser) {

describe('server parser', () => {
// before
const parser = require('../..');
const serverParser = require('../..');

// tests
throwsError(parser);
runTests(cases.html, parser, htmlparser.parseDOM);
runTests(cases.svg, parser, htmlparser.parseDOM);
throwErrors(assert, serverParser);
runTests(assert, serverParser, htmlparser.parseDOM, cases.html);
runTests(assert, serverParser, htmlparser.parseDOM, cases.svg);
});

describe('client parser in jsdom', () => {
// before
const jsdomify = require('jsdomify').default;
jsdomify.create();
const parser = require('../../lib/html-to-dom-client');
const clientParser = require('../../lib/html-to-dom-client');

// tests
throwsError(parser);
runTests(cases.html, parser, htmlparser.parseDOM);
runTests(cases.svg, parser, htmlparser.parseDOM);
testCaseSensitiveTags(parser);
throwErrors(assert, clientParser);
runTests(assert, clientParser, htmlparser.parseDOM, cases.html);
runTests(assert, clientParser, htmlparser.parseDOM, cases.svg);
testCaseSensitiveTags(clientParser);

// after
jsdomify.destroy();
Expand Down