Merge branch 'v1.3-dev'
[websub-hub] / test / src / worker.js
index 32bd0656665bd854933240eb5323a440e1e438c5..7f99de178b884cdd852bc3a642c846936625948d 100644 (file)
@@ -1,8 +1,7 @@
-/* eslint-env mocha */
 'use strict';
 
-const assert = require('assert');
-const sinon = require('sinon'); // eslint-disable-line node/no-unpublished-require
+const assert = require('node:assert');
+const sinon = require('sinon');
 
 const Worker = require('../../src/worker');
 const Config = require('../../config');
@@ -131,6 +130,12 @@ describe('Worker', function () {
       stubCtx = {};
     });
     it('gets tasks', async function () {
+      /**
+       * In older versions, could just deepStrictEqual un-awaited promises for equality,
+       * but post 14 or so, async_id symbol properties are included in comparison, and
+       * in some executions of test suites these are somehow different in value so the test
+       * was failing.  So now we settle everything prior to comparison.
+       */
       const expected = [
         Promise.resolve('first'),
         Promise.reject('bad'),
@@ -138,7 +143,11 @@ describe('Worker', function () {
       ];
       worker.promiseGiver.resolves(expected);
       const result = await worker._getWork(stubCtx);
-      assert.deepStrictEqual(result, expected);
+
+      const expectedResolved = await Promise.allSettled(expected);
+      const resultResolved = await Promise.allSettled(result);
+      assert.deepStrictEqual(resultResolved, expectedResolved);
+
       assert.strictEqual(worker.inFlight.length, expected.length);
     });
     it('covers none wanted', async function () {
@@ -204,6 +213,18 @@ describe('Worker', function () {
       assert.strictEqual(worker._getWork.callCount, 0);
       assert.strictEqual(worker._recurr.callCount, 1);
     });
+    it('covers double invocation', async function () {
+      const snooze = async (ms) => new Promise((resolve) => setTimeout(resolve, ms));
+
+      this.slow(300);
+      worker.inFlight = [
+        Worker.watchedPromise(snooze(100)),
+      ];
+
+      await Promise.all([worker.process(), worker.process()]);
+      assert.strictEqual(worker._getWork.callCount, 2);
+      assert.strictEqual(worker._recurr.callCount, 1);
+    });
   }); // process
 
 }); // Worker