rework html linting
[squeep-html-template-helper] / test / lib / template-helper.js
index c0cd94851343de6a757fd7912ed85b72b7a4a6c7..ec7ab5da605315edb2cee3647c938b696944c8f7 100644 (file)
@@ -3,14 +3,12 @@
 
 const assert = require('assert');
 const th = require('../../lib/template-helper');
-const lint = require('html-minifier-lint').lint; // eslint-disable-line node/no-unpublished-require
 const stubLogger = require('../stub-logger');
 
-function lintHtml(html) {
-  const result = lint(html);
-  stubLogger.debug('validHtml', '', { result, html });
-  assert(!result);
-}
+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;
@@ -18,9 +16,21 @@ describe('Template Helper', function () {
   beforeEach(function () {
     pagePathLevel = 2;
     ctx = {};
-    options = {};
+    options = {
+      pageTitle: 'Test Page',
+    };
   });
 
+  describe('initContext', function () {
+    it('covers', function () {
+      th.initContext(ctx);
+      assert(ctx.errors);
+      assert(ctx.notifications);
+      assert(Array.isArray(ctx.errors));
+      assert(Array.isArray(ctx.notifications));
+    });
+  }); // initContext
+
   describe('dateOrNot', function () {
     let date, otherwise;
     beforeEach(function () {
@@ -56,6 +66,11 @@ describe('Template Helper', function () {
       const result = th.dateFormat(undefined, undefined, undefined, expected);
       assert.strictEqual(result, expected);
     });
+    it('handles invalid date', function () {
+      const expected = 'otherwise';
+      const result = th.dateFormat(new Date('bad date'), undefined, undefined, expected);
+      assert.strictEqual(result, expected);
+    });
     it('renders Infinity', function () {
       const expected = 'end of time';
       const result = th.dateFormat(Infinity, expected);
@@ -78,6 +93,26 @@ describe('Template Helper', function () {
     });
   }); // dateFormat
 
+  describe('timeElement', function () {
+    it('renders a date', function () {
+      const when = new Date('2022-09-11T21:17:56.872Z');
+      const expected = '<time datetime="2022-09-11T21:17:56.872Z">Sep 11, 2022, 2:17:56 PM PDT</time>';
+      const result = th.timeElement(when);
+      assert.strictEqual(result, expected);
+    });
+    it('covers title', function () {
+      const when = new Date('2022-09-11T21:17:56.872Z');
+      const expected = '<time title="a date" datetime="2022-09-11T21:17:56.872Z">Sep 11, 2022, 2:17:56 PM PDT</time>';
+      const result = th.timeElement(when, { title: 'a date' });
+      assert.strictEqual(result, expected);
+    });
+    it('covers other', function () {
+      const expected = '<time>Mar 27, 2022, 3:28:05 PM PDT</time>';
+      const result = th.timeElement(1648420085049);
+      assert.strictEqual(result, expected);
+    });
+  }); // timeElement
+
   describe('secondsToPeriod', function () {
     it('covers seconds', function () {
       const result = th.secondsToPeriod(45);
@@ -166,6 +201,13 @@ describe('Template Helper', function () {
     });
   }); // LI
 
+  describe('indented', function () {
+    it('covers', function () {
+      const result = th.indented(2, ['foo', 'bar']);
+      result.forEach((r) => assert(r.startsWith('\t\t')));
+    });
+  }); // indented
+
   describe('htmlBody', function () {
     it('covers no main', function () {
       const result = th.htmlBody(pagePathLevel, ctx, options);
@@ -224,43 +266,43 @@ describe('Template Helper', function () {
     beforeEach(function () {
       main = [];
     });
-    it('covers', function () {
+    it('covers', async function () {
       const result = th.htmlPage(pagePathLevel, ctx, options, main);
-      lintHtml(result);
+      await htmlLint(result);
       assert(result);
     });
-    it('covers defaults', function () {
+    it('covers defaults', async function () {
       const result = th.htmlPage(pagePathLevel, ctx, options, main);
-      lintHtml(result);
+      await htmlLint(result);
       assert(result);
     });
-    it('covers user', function () {
+    it('covers user', async function () {
       ctx.session = {
         authenticatedProfile: 'https://user.example.com/',
       };
       const result = th.htmlPage(pagePathLevel, ctx, options, main);
-      lintHtml(result);
+      await htmlLint(result);
       assert(result);
     });
-    it('covers user at root path', function () {
+    it('covers user at root path', async function () {
       ctx.session = {
         authenticatedIdentifier: 'user',
       };
       pagePathLevel = 0;
       const result = th.htmlPage(pagePathLevel, ctx, options, main);
-      lintHtml(result);
+      await htmlLint(result);
       assert(result);
     });
-    it('covers logout redirect', function () {
+    it('covers logout redirect', async function () {
       ctx.session = {
         authenticatedIdentifier: 'user',
       };
       ctx.url = 'https://app.example.com/this_page';
       const result = th.htmlPage(pagePathLevel, ctx, options, main);
-      lintHtml(result);
+      await htmlLint(result);
       assert(result);
     });
-    it('covers existing navLinks', function () {
+    it('covers existing navLinks', async function () {
       ctx.session = {
         authenticatedIdentifier: 'user',
       };
@@ -269,7 +311,7 @@ describe('Template Helper', function () {
         href: 'link',
       }];
       const result = th.htmlPage(pagePathLevel, ctx, options);
-      lintHtml(result);
+      await htmlLint(result);
       assert(result);
     });
   }); // htmlPage