4 const assert
= require('assert');
5 const sinon
= require('sinon'); // eslint-disable-line node/no-unpublished-require
7 const Worker
= require('../../src/worker');
8 const Config
= require('../../config');
10 const stubLogger
= require('../stub-logger');
11 const stubDb
= require('../stub-db');
13 const noExpectedException
= 'did not get expected exception';
15 describe('Worker', function () {
20 beforeEach(function () {
21 config
= new Config('test');
22 promiseGiver
= sinon
.stub();
23 worker
= new Worker(stubLogger
, stubDb
, promiseGiver
, config
);
27 afterEach(function () {
31 describe('constructor', function () {
32 it('instantiates', function () {
36 it('requires a promiseGiver function', function () {
38 worker
= new Worker(stubLogger
, stubDb
, undefined, config
);
39 assert
.fail('should require function argument');
41 assert(e
instanceof TypeError
);
46 describe('start', function () {
47 it('starts without polling', function () {
48 config
.worker
.pollingEnabled
= false;
49 worker
= new Worker(stubLogger
, stubDb
, promiseGiver
, config
);
51 assert
.strictEqual(worker
.running
, false);
53 it('starts with polling', function () {
54 config
.worker
.pollingEnabled
= true;
55 worker
= new Worker(stubLogger
, stubDb
, promiseGiver
, config
);
56 sinon
.stub(worker
, '_recurr');
58 clearTimeout(worker
.nextTimeout
);
59 assert
.strictEqual(worker
.running
, true);
63 describe('stop', function () {
64 it('stops', function () {
65 worker
= new Worker(stubLogger
, stubDb
, promiseGiver
, config
);
68 assert
.strictEqual(worker
.running
, false);
69 assert
.strictEqual(worker
.nextTimeout
, undefined);
73 describe('watchedPromise', function () {
75 it('watches a resolvable promise', async
function () {
77 promise
= Promise
.resolve(res
);
78 const watched
= Worker
.watchedPromise(promise
);
79 const result
= await watched
;
80 assert
.strictEqual(result
, res
);
81 assert
.strictEqual(watched
.resolved
, res
);
82 assert(watched
.isSettled
);
84 it('watches a rejectable promise', async
function () {
85 const rej
= new Error('boo');
86 promise
= Promise
.reject(rej
);
87 const watched
= Worker
.watchedPromise(promise
);
90 assert
.fail(noExpectedException
);
92 assert
.deepStrictEqual(e
, rej
);
93 assert
.deepStrictEqual(watched
.rejected
, rej
);
94 assert(watched
.isSettled
);
97 it('covers wrapped promise', async
function () {
99 promise
= Promise
.resolve(res
);
100 const watched
= Worker
.watchedPromise(promise
);
101 const rewatched
= Worker
.watchedPromise(watched
);
102 const result
= await rewatched
;
103 assert
.strictEqual(result
, res
);
104 assert
.strictEqual(rewatched
.resolved
, res
);
105 assert(rewatched
.isSettled
);
107 }); // watchedPromise
109 describe('_handleWatchedList', function () {
111 beforeEach(function () {
112 handler
= sinon
.stub();
114 it('handled resolveds', function () {
116 { isSettled: false, resolved: undefined, rejected: undefined },
117 { isSettled: true, resolved: 'value', rejected: undefined },
118 { isSettled: true, resolved: undefined, rejected: 'error' },
119 { isSettled: false, resolved: undefined, rejected: undefined },
121 const result
= worker
._handleWatchedList(handler
);
122 assert
.strictEqual(result
, 2);
123 assert
.strictEqual(worker
.inFlight
.length
, 2);
124 assert
.strictEqual(handler
.callCount
, 2);
126 }); // _handleWatchedList
128 describe('_getWork', function () {
130 beforeEach(function () {
133 it('gets tasks', async
function () {
135 * In older versions, could just deepStrictEqual un-awaited promises for equality,
136 * but post 14 or so, async_id symbol properties are included in comparison, and
137 * in some executions of test suites these are somehow different in value so the test
138 * was failing. So now we settle everything prior to comparison.
141 Promise
.resolve('first'),
142 Promise
.reject('bad'),
143 Promise
.resolve('second'),
145 worker
.promiseGiver
.resolves(expected
);
146 const result
= await worker
._getWork(stubCtx
);
148 const expectedResolved
= await Promise
.allSettled(expected
);
149 const resultResolved
= await Promise
.allSettled(result
);
150 assert
.deepStrictEqual(resultResolved
, expectedResolved
);
152 assert
.strictEqual(worker
.inFlight
.length
, expected
.length
);
154 it('covers none wanted', async
function () {
155 worker
.concurrency
= 3;
157 Promise
.resolve('first'),
158 Promise
.reject('bad'),
159 Promise
.resolve('second'),
161 const result
= await worker
._getWork(stubCtx
);
162 assert(!worker
.promiseGiver
.called
);
163 assert
.deepStrictEqual(result
, []);
167 describe('_watchedHandler', function () {
168 it('covers resolved', function () {
169 worker
._watchedHandler('resolved', undefined);
171 it('covers rejected', function () {
172 worker
._watchedHandler(undefined, 'rejected');
174 }); // _watchedHandler
176 describe('_recurr', function () {
177 it('covers', function (done
) {
178 worker
.recurrSleepMs
= 10;
179 this.slow(worker
.recurrSleepMs
* 3);
180 sinon
.stub(worker
, 'process').callsFake(done
);
181 worker
.running
= true;
184 it('covers not running', function () {
185 worker
.running
= false;
190 describe('process', function () {
191 beforeEach(function () {
192 sinon
.stub(worker
, '_getWork');
193 sinon
.stub(worker
, '_recurr');
195 it('covers', async
function () {
197 Worker
.watchedPromise(Promise
.resolve('one')),
198 Worker
.watchedPromise(Promise
.reject('foo')),
200 await worker
.process();
201 assert
.strictEqual(worker
._getWork
.callCount
, 2);
202 assert
.strictEqual(worker
._recurr
.callCount
, 1);
204 it('covers no work', async
function () {
205 await worker
.process();
206 assert
.strictEqual(worker
._getWork
.callCount
, 1);
207 assert
.strictEqual(worker
._recurr
.callCount
, 1);
209 it('covers error', async
function () {
210 const expected
= new Error('blah');
211 stubDb
.context
.restore();
212 sinon
.stub(stubDb
, 'context').rejects(expected
);
213 await worker
.process();
214 assert
.strictEqual(worker
._getWork
.callCount
, 0);
215 assert
.strictEqual(worker
._recurr
.callCount
, 1);
217 it('covers double invocation', async
function () {
218 const snooze
= async (ms
) => new Promise((resolve
) => setTimeout(resolve
, ms
));
222 Worker
.watchedPromise(snooze(100)),
225 await Promise
.all([worker
.process(), worker
.process()]);
226 assert
.strictEqual(worker
._getWork
.callCount
, 2);
227 assert
.strictEqual(worker
._recurr
.callCount
, 1);