node-libtidy
Version:
Node bindings to the HTML Tidy library
314 lines (280 loc) • 10 kB
JavaScript
;
var chai = require("chai");
chai.use(require("chai-subset"));
var expect = chai.expect;
var libtidy = require("../");
var TidyDoc = libtidy.TidyDoc;
describe("TidyDoc:", function() {
var testDoc1 = Buffer('<!DOCTYPE html>\n<html><head></head>\n' +
'<body><p>foo</p></body></html>');
var testDoc2 = Buffer('<!DOCTYPE html>\n<html><head></head>\n' +
'<body><form><ul><li></form></ul></li>');
describe("construction:", function() {
it("as constructor", function() {
var doc = new TidyDoc();
expect(doc).instanceof(TidyDoc);
expect(doc.optGet("input-xml")).equal(false);
});
it("as function", function() {
var doc = TidyDoc();
expect(doc).instanceof(TidyDoc);
expect(doc.optGet("input-xml")).equal(false);
});
});
describe("basic synchroneous operation:", function() {
it("parse buffer", function() {
var messages =
"line 2 column 7 - Warning: inserting missing 'title' element\n";
var doc = new TidyDoc();
expect(doc.getErrorLog()).equal("");
var res = doc.parseBufferSync(testDoc1);
expect(doc.getErrorLog()).equal(messages);
expect(res).to.equal(messages);
});
it("clean and repair", function() {
// Can there be any output during clean and repair?
var messages = "";
var doc = new TidyDoc();
doc.parseBufferSync(testDoc1);
var res = doc.cleanAndRepairSync();
expect(doc.getErrorLog()).equal(messages);
expect(res).to.equal(messages);
});
it("diagnostics", function() {
var messages =
'Info: Document content looks like HTML5\n' +
'Tidy found 1 warning and 0 errors!\n\n';
var doc = new TidyDoc();
doc.parseBufferSync(testDoc1);
doc.cleanAndRepairSync();
var res = doc.runDiagnosticsSync();
expect(doc.getErrorLog()).equal(messages);
expect(res).equal(messages);
});
it("save to buffer", function() {
var doc = new TidyDoc();
doc.parseBufferSync(testDoc1);
doc.cleanAndRepairSync();
doc.runDiagnosticsSync();
var res = doc.saveBufferSync();
expect(doc.getErrorLog()).equal("");
expect(Buffer.isBuffer(res)).ok;
expect(res.toString()).to.match(/<title>.*<\/title>/);
});
it("report errors in diagnostics", function() {
var messages =
'Info: Document content looks like HTML5\n' +
'Tidy found 5 warnings and 2 errors!\n\n' +
'This document has errors that must be fixed before\n' +
'using HTML Tidy to generate a tidied up version.\n\n';
var doc = new TidyDoc();
doc.parseBufferSync(testDoc2);
doc.cleanAndRepairSync();
var res = doc.runDiagnosticsSync();
expect(doc.getErrorLog()).equal(messages);
expect(res).equal(messages);
});
it("will not produce output in case of an error", function() {
var doc = new TidyDoc();
doc.parseBufferSync(testDoc2);
doc.cleanAndRepairSync();
doc.runDiagnosticsSync();
var res = doc.saveBufferSync();
expect(doc.getErrorLog()).equal("");
expect(Buffer.isBuffer(res)).ok;
expect(res).to.have.length(0);
});
it("can produce output despite errors", function() {
var doc = new TidyDoc();
doc.parseBufferSync(testDoc2);
doc.cleanAndRepairSync();
doc.runDiagnosticsSync();
expect(doc.optGet("force-output")).to.be.false;
doc.optSet("force-output", true);
expect(doc.optGet("force-output")).to.be.true;
var res = doc.saveBufferSync();
expect(doc.getErrorLog()).equal("");
expect(res).to.have.length.above(100);
});
});
describe("basic asynchroneous operation using callback:", function() {
it("parse buffer", function(done) {
var messages =
"line 2 column 7 - Warning: inserting missing 'title' element\n";
var doc = new TidyDoc();
doc.parseBuffer(testDoc1, function(err, res) {
expect(err).to.be.null;
expect(res).to.not.contain.key("output");
expect(res).to.containSubset({
errlog: messages,
});
expect(doc.getErrorLog()).equal(messages);
done();
});
});
it("clean and repair", function(done) {
// Can there be any output during clean and repair?
var messages = "";
var doc = new TidyDoc();
doc.parseBufferSync(testDoc1);
doc.cleanAndRepair(function(err, res) {
expect(err).to.be.null;
expect(res).to.not.contain.key("output");
expect(res).to.containSubset({
errlog: messages,
});
expect(doc.getErrorLog()).equal(messages);
done();
});
});
it("diagnostics", function(done) {
var messages =
'Info: Document content looks like HTML5\n' +
'Tidy found 1 warning and 0 errors!\n\n';
var doc = new TidyDoc();
doc.parseBufferSync(testDoc1);
doc.cleanAndRepairSync();
doc.runDiagnostics(function(err, res) {
expect(err).to.be.null;
expect(res).to.not.contain.key("output");
expect(res).to.containSubset({
errlog: messages,
});
expect(doc.getErrorLog()).equal(messages);
done();
});
});
it("save to buffer", function(done) {
var doc = new TidyDoc();
doc.parseBufferSync(testDoc1);
doc.cleanAndRepairSync();
doc.runDiagnosticsSync();
doc.saveBuffer(function(err, res) {
expect(err).to.be.null;
expect(res).to.contain.key("output");
expect(res).to.containSubset({
errlog: "",
});
expect(Buffer.isBuffer(res.output)).ok;
expect(res.output.toString()).to.match(/<title>.*<\/title>/);
expect(doc.getErrorLog()).equal("");
done();
});
});
it("will not produce output in case of an error", function(done) {
var doc = new TidyDoc();
doc.parseBufferSync(testDoc2);
doc.cleanAndRepairSync();
doc.runDiagnosticsSync();
var res = doc.saveBufferSync();
doc.saveBuffer(function(err, res) {
expect(err).to.be.null;
expect(res).to.contain.key("output");
expect(res).to.containSubset({
errlog: "",
output: null,
});
expect(doc.getErrorLog()).equal("");
done();
});
});
it("all in one go", function(done) {
var doc = new TidyDoc();
doc.tidyBuffer(testDoc1, function(err, res) {
expect(err).to.be.null;
expect(res).to.contain.key("output");
expect(res).to.contain.key("errlog");
expect(res.errlog).to.match(/inserting missing/);
expect(res.errlog).to.match(/looks like HTML5/);
expect(res.errlog).to.match(/Tidy found/);
expect(Buffer.isBuffer(res.output)).ok;
expect(res.output.toString()).to.match(/<title>.*<\/title>/);
done();
});
});
});
describe("basic asynchroneous operation using promise:", function() {
it("parse buffer", function() {
var messages =
"line 2 column 7 - Warning: inserting missing 'title' element\n";
var doc = new TidyDoc();
return doc.parseBuffer(testDoc1).then(function(res) {
expect(res).to.not.contain.key("output");
expect(res).to.containSubset({
errlog: messages,
});
expect(doc.getErrorLog()).equal(messages);
});
});
it("clean and repair", function() {
// Can there be any output during clean and repair?
var messages = "";
var doc = new TidyDoc();
doc.parseBufferSync(testDoc1);
return doc.cleanAndRepair().then(function(res) {
expect(res).to.not.contain.key("output");
expect(res).to.containSubset({
errlog: messages,
});
expect(doc.getErrorLog()).equal(messages);
});
});
it("diagnostics", function() {
var messages =
'Info: Document content looks like HTML5\n' +
'Tidy found 1 warning and 0 errors!\n\n';
var doc = new TidyDoc();
doc.parseBufferSync(testDoc1);
doc.cleanAndRepairSync();
return doc.runDiagnostics().then(function(res) {
expect(res).to.not.contain.key("output");
expect(res).to.containSubset({
errlog: messages,
});
expect(doc.getErrorLog()).equal(messages);
});
});
it("save to buffer", function() {
var doc = new TidyDoc();
doc.parseBufferSync(testDoc1);
doc.cleanAndRepairSync();
doc.runDiagnosticsSync();
return doc.saveBuffer().then(function(res) {
expect(res).to.contain.key("output");
expect(res).to.containSubset({
errlog: "",
});
expect(Buffer.isBuffer(res.output)).ok;
expect(res.output.toString()).to.match(/<title>.*<\/title>/);
expect(doc.getErrorLog()).equal("");
});
});
it("will not produce output in case of an error", function() {
var doc = new TidyDoc();
doc.parseBufferSync(testDoc2);
doc.cleanAndRepairSync();
doc.runDiagnosticsSync();
var res = doc.saveBufferSync();
return doc.saveBuffer().then(function(res) {
expect(res).to.contain.key("output");
expect(res).to.containSubset({
errlog: "",
output: null,
});
expect(doc.getErrorLog()).equal("");
});
});
it("all in one go", function() {
var doc = new TidyDoc();
return doc.tidyBuffer(testDoc1).then(function(res) {
expect(res).to.contain.key("output");
expect(res).to.contain.key("errlog");
expect(res.errlog).to.match(/inserting missing/);
expect(res.errlog).to.match(/looks like HTML5/);
expect(res.errlog).to.match(/Tidy found/);
expect(Buffer.isBuffer(res.output)).ok;
expect(res.output.toString()).to.match(/<title>.*<\/title>/);
});
});
});
});