const assert = require('assert');
const th = require('../../lib/template-helper');
const stubLogger = require('../stub-logger');
-const LintHtml = require('../lint-html');
-const lintHtml = new LintHtml(stubLogger);
+const { makeHtmlLint } = require('../lint-html');
+const { HtmlValidate } = require('html-validate');
+const htmlValidate = new HtmlValidate();
+const htmlLint = makeHtmlLint(stubLogger, htmlValidate);
describe('Template Helper', function () {
let ctx, options, pagePathLevel;
});
it('covers', async function () {
const result = th.htmlPage(pagePathLevel, ctx, options, main);
- await lintHtml.lint(result);
+ await htmlLint(result);
assert(result);
});
it('covers defaults', async function () {
const result = th.htmlPage(pagePathLevel, ctx, options, main);
- await lintHtml.lint(result);
+ await htmlLint(result);
assert(result);
});
it('covers user', async function () {
authenticatedProfile: 'https://user.example.com/',
};
const result = th.htmlPage(pagePathLevel, ctx, options, main);
- await lintHtml.lint(result);
+ await htmlLint(result);
assert(result);
});
it('covers user at root path', async function () {
};
pagePathLevel = 0;
const result = th.htmlPage(pagePathLevel, ctx, options, main);
- await lintHtml.lint(result);
+ await htmlLint(result);
assert(result);
});
it('covers logout redirect', async function () {
};
ctx.url = 'https://app.example.com/this_page';
const result = th.htmlPage(pagePathLevel, ctx, options, main);
- await lintHtml.lint(result);
+ await htmlLint(result);
assert(result);
});
it('covers existing navLinks', async function () {
href: 'link',
}];
const result = th.htmlPage(pagePathLevel, ctx, options);
- await lintHtml.lint(result);
+ await htmlLint(result);
assert(result);
});
}); // htmlPage
'use strict';
/**
- * A brief wrapper around html-validate
+ * A brief assertion wrapper around html-validate.
*/
const assert = require('node:assert');
-const { HtmlValidate } = require('html-validate'); // eslint-disable-line node/no-unpublished-require
-const stubLogger = require('./stub-logger');
-class LintHtml {
- constructor(logger, ...args) {
- this.logger = logger;
- this.htmlValidate = new HtmlValidate(...args);
- }
-
- async lint(html) {
- const ruleViolations = [];
- const report = await this.htmlValidate.validateString(html);
- report.results.forEach((m) => {
- ruleViolations.push(m.ruleId);
- stubLogger?.debug('LintHtml', 'message', m);
- })
- assert(report.valid, '' + ruleViolations.join(', '));
+/**
+ * Given an instance of html-validate, returns a function which asserts validity of some HTML.
+ * @param {ConsoleLike} logger
+ * @param {HtmlValidate} htmlValidate
+ * @returns {(html: String) => Promise<void>}
+ */
+function makeHtmlLint(logger, htmlValidate) {
+ function note(violations, message) {
+ violations.push(message.ruleId);
+ logger.debug('HtmlLint', message);
}
+ return async function HtmlLint(html) {
+ const violations = [];
+ const report = await htmlValidate.validateString(html);
+ report.results.forEach((r) => {
+ if (Array.isArray(r)) {
+ result.forEach((m) => {
+ note(violations, m);
+ });
+ } else {
+ note(violations, r);
+ }
+ });
+ assert(report.valid, 'HTML violations: ' + violations.join(', '));
+ };
}
-module.exports = LintHtml;
\ No newline at end of file
+module.exports = {
+ makeHtmlLint,
+};
\ No newline at end of file