@vida-global/core 1.4.6 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/config/newrelic-config.js +118 -0
- package/index.js +9 -5
- package/lib/activeRecord/baseRecord.js +49 -3
- package/lib/apm/agent.js +22 -0
- package/lib/apm/index.js +54 -0
- package/lib/apm/utils.js +43 -0
- package/lib/http/client.js +16 -2
- package/lib/jobQueue/README.md +63 -0
- package/lib/jobQueue/abstractJob.js +103 -0
- package/lib/jobQueue/abstractJobComponent.js +37 -0
- package/lib/jobQueue/index.js +10 -0
- package/lib/jobQueue/jobImporter.js +19 -0
- package/lib/jobQueue/queue.js +161 -0
- package/lib/jobQueue/worker.js +273 -0
- package/lib/logger/README.md +1 -1
- package/lib/logger/index.js +33 -15
- package/lib/logger/serverMiddleware.js +14 -12
- package/lib/redis/redisClient.js +32 -24
- package/lib/server/controllerImporter.js +9 -47
- package/lib/server/server.js +30 -13
- package/lib/server/serverController.js +100 -23
- package/lib/utils/abstractAutoImporter.js +64 -0
- package/package.json +4 -2
- package/test/activeRecord/baseRecord.test.js +129 -0
- package/test/activeRecord/db/connection.test.js +4 -1
- package/test/activeRecord/db/connectionConfiguration.test.js +9 -3
- package/test/activeRecord/helpers/baseRecordMocks.js +6 -4
- package/test/activeRecord/helpers/connection.js +0 -3
- package/test/activeRecord/helpers/connectionConfiguration.js +0 -8
- package/test/apm/agent.test.js +56 -0
- package/test/apm/utils.test.js +121 -0
- package/test/helpers/env.js +33 -0
- package/test/http/client.test.js +3 -3
- package/test/jobQueue/abstractJob.test.js +307 -0
- package/test/jobQueue/abstractJobComponent.test.js +110 -0
- package/test/jobQueue/helpers/abstractJob.js +26 -0
- package/test/jobQueue/helpers/apmMock.js +20 -0
- package/test/jobQueue/helpers/bullmqMock.js +67 -0
- package/test/jobQueue/helpers/env.js +29 -0
- package/test/jobQueue/helpers/fixtureJobs/notAJob.js +8 -0
- package/test/jobQueue/helpers/fixtureJobs/testJobA.js +14 -0
- package/test/jobQueue/helpers/fixtureJobs/testJobB.js +14 -0
- package/test/jobQueue/helpers/loggerMock.js +43 -0
- package/test/jobQueue/helpers/worker.js +38 -0
- package/test/jobQueue/queue.test.js +320 -0
- package/test/jobQueue/worker.test.js +526 -0
- package/test/logger/index.test.js +61 -0
- package/test/logger/serverMiddleware.test.js +6 -7
- package/test/server/serverController.test.js +226 -10
|
@@ -127,6 +127,224 @@ describe('VidaServerController', () => {
|
|
|
127
127
|
});
|
|
128
128
|
|
|
129
129
|
|
|
130
|
+
describe('#hasParam', () => {
|
|
131
|
+
let controller;
|
|
132
|
+
beforeEach(() => {
|
|
133
|
+
const params = {foo: 'bar', empty: '', falsy: false, nully: null};
|
|
134
|
+
controller = new FooController({params}, {});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it ('returns true when the named key exists in params', () => {
|
|
138
|
+
expect(controller.hasParam('foo')).toBe(true);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it ('returns true when the value is an empty string', () => {
|
|
142
|
+
expect(controller.hasParam('empty')).toBe(true);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it ('returns true when the value is null', () => {
|
|
146
|
+
expect(controller.hasParam('nully')).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it ('returns true when the value is false', () => {
|
|
150
|
+
expect(controller.hasParam('falsy')).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it ('returns false when the named key is not in params', () => {
|
|
154
|
+
expect(controller.hasParam('nope')).toBe(false);
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
describe('#coerceString', () => {
|
|
160
|
+
const controller = new FooController({}, {});
|
|
161
|
+
|
|
162
|
+
it ('returns the string when passed a non-empty string', () => {
|
|
163
|
+
const value = TestHelpers.Faker.Text.randomString();
|
|
164
|
+
expect(controller.coerceString(value)).toBe(value);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it ('trims surrounding whitespace', () => {
|
|
168
|
+
const value = TestHelpers.Faker.Text.randomString();
|
|
169
|
+
expect(controller.coerceString(` ${value} `)).toBe(value);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it ('returns the fallback for an empty string', () => {
|
|
173
|
+
const fallback = TestHelpers.Faker.Text.randomString();
|
|
174
|
+
expect(controller.coerceString('', {fallback})).toBe(fallback);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it ('returns the fallback for a whitespace-only string', () => {
|
|
178
|
+
const fallback = TestHelpers.Faker.Text.randomString();
|
|
179
|
+
expect(controller.coerceString(' ', {fallback})).toBe(fallback);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it.each([
|
|
183
|
+
[null],
|
|
184
|
+
[undefined],
|
|
185
|
+
[123],
|
|
186
|
+
[true],
|
|
187
|
+
[false],
|
|
188
|
+
[{}],
|
|
189
|
+
[[]],
|
|
190
|
+
])('returns the fallback for non-string input (%p)', (input) => {
|
|
191
|
+
const fallback = TestHelpers.Faker.Text.randomString();
|
|
192
|
+
expect(controller.coerceString(input, {fallback})).toBe(fallback);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it ('defaults the fallback to an empty string when no options are given', () => {
|
|
196
|
+
expect(controller.coerceString(null)).toBe('');
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it ('defaults the fallback to an empty string for empty input when no options are given', () => {
|
|
200
|
+
expect(controller.coerceString(' ')).toBe('');
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
describe('#coerceBoolean', () => {
|
|
206
|
+
const controller = new FooController({}, {});
|
|
207
|
+
|
|
208
|
+
it ('returns true when passed boolean true', () => {
|
|
209
|
+
expect(controller.coerceBoolean(true)).toBe(true);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it ('returns false when passed boolean false', () => {
|
|
213
|
+
expect(controller.coerceBoolean(false)).toBe(false);
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it.each([
|
|
217
|
+
['true'],
|
|
218
|
+
['TRUE'],
|
|
219
|
+
['1'],
|
|
220
|
+
['yes'],
|
|
221
|
+
['on'],
|
|
222
|
+
[' ON '],
|
|
223
|
+
])('coerces "%s" to true', (input) => {
|
|
224
|
+
expect(controller.coerceBoolean(input)).toBe(true);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it.each([
|
|
228
|
+
['false'],
|
|
229
|
+
['FALSE'],
|
|
230
|
+
['0'],
|
|
231
|
+
['no'],
|
|
232
|
+
['off'],
|
|
233
|
+
[' off '],
|
|
234
|
+
])('coerces "%s" to false', (input) => {
|
|
235
|
+
expect(controller.coerceBoolean(input)).toBe(false);
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
it ('returns the fallback for an unrecognized string', () => {
|
|
239
|
+
const fallback = TestHelpers.Faker.Text.randomString();
|
|
240
|
+
expect(controller.coerceBoolean('maybe', {fallback})).toBe(fallback);
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
it ('returns the fallback for an empty/whitespace string', () => {
|
|
244
|
+
const fallback = TestHelpers.Faker.Text.randomString();
|
|
245
|
+
expect(controller.coerceBoolean(' ', {fallback})).toBe(fallback);
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
it.each([
|
|
249
|
+
[null],
|
|
250
|
+
[undefined],
|
|
251
|
+
[123],
|
|
252
|
+
[{}],
|
|
253
|
+
[[]],
|
|
254
|
+
])('returns the fallback for non-string, non-boolean input (%p)', (input) => {
|
|
255
|
+
const fallback = TestHelpers.Faker.Text.randomString();
|
|
256
|
+
expect(controller.coerceBoolean(input, {fallback})).toBe(fallback);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
it ('defaults the fallback to undefined when no options are given', () => {
|
|
260
|
+
expect(controller.coerceBoolean('maybe')).toBe(undefined);
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
describe('#coerceInteger', () => {
|
|
266
|
+
const controller = new FooController({}, {});
|
|
267
|
+
|
|
268
|
+
it ('returns the fallback for null', () => {
|
|
269
|
+
const fallback = TestHelpers.Faker.Text.randomString();
|
|
270
|
+
expect(controller.coerceInteger(null, {fallback})).toBe(fallback);
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
it ('returns the fallback for undefined', () => {
|
|
274
|
+
const fallback = TestHelpers.Faker.Text.randomString();
|
|
275
|
+
expect(controller.coerceInteger(undefined, {fallback})).toBe(fallback);
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it.each([
|
|
279
|
+
[''],
|
|
280
|
+
[' '],
|
|
281
|
+
])('returns the fallback for empty/whitespace string (%p)', (input) => {
|
|
282
|
+
const fallback = TestHelpers.Faker.Text.randomString();
|
|
283
|
+
expect(controller.coerceInteger(input, {fallback})).toBe(fallback);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
it ('returns the fallback for a non-numeric string', () => {
|
|
287
|
+
const fallback = TestHelpers.Faker.Text.randomString();
|
|
288
|
+
expect(controller.coerceInteger('abc', {fallback})).toBe(fallback);
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
it ('parses an integer string to an integer', () => {
|
|
292
|
+
expect(controller.coerceInteger('42')).toBe(42);
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
it ('floors a decimal string value', () => {
|
|
296
|
+
expect(controller.coerceInteger('3.7')).toBe(3);
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it ('accepts an integer value directly', () => {
|
|
300
|
+
expect(controller.coerceInteger(42)).toBe(42);
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it ('floors a decimal numeric value', () => {
|
|
304
|
+
expect(controller.coerceInteger(3.7)).toBe(3);
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
it ('clamps to min when the value is below min', () => {
|
|
308
|
+
expect(controller.coerceInteger(1, {min: 5})).toBe(5);
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
it ('clamps to max when the value is above max', () => {
|
|
312
|
+
expect(controller.coerceInteger(100, {max: 50})).toBe(50);
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
it ('returns the fallback when nonNegative is set and the value is negative', () => {
|
|
316
|
+
const fallback = TestHelpers.Faker.Text.randomString();
|
|
317
|
+
expect(controller.coerceInteger(-3, {nonNegative: true, fallback})).toBe(fallback);
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
describe('#coerceObject', () => {
|
|
323
|
+
const controller = new FooController({}, {});
|
|
324
|
+
|
|
325
|
+
it ('returns a plain object unchanged', () => {
|
|
326
|
+
const input = {foo: TestHelpers.Faker.Text.randomString()};
|
|
327
|
+
expect(controller.coerceObject(input)).toBe(input);
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
it.each([
|
|
331
|
+
[null],
|
|
332
|
+
[undefined],
|
|
333
|
+
[[1, 2]],
|
|
334
|
+
['string'],
|
|
335
|
+
[42],
|
|
336
|
+
[true],
|
|
337
|
+
])('returns the fallback for non-plain-object input (%p)', (input) => {
|
|
338
|
+
const fallback = {foo: TestHelpers.Faker.Text.randomString()};
|
|
339
|
+
expect(controller.coerceObject(input, {fallback})).toBe(fallback);
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
it ('defaults the fallback to an empty object', () => {
|
|
343
|
+
expect(controller.coerceObject(null)).toEqual({});
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
|
|
130
348
|
describe('.validateParameters', () => {
|
|
131
349
|
const paramName1 = TestHelpers.Faker.Text.randomString();
|
|
132
350
|
const paramName2 = TestHelpers.Faker.Text.randomString();
|
|
@@ -739,17 +957,15 @@ describe('VidaServerController', () => {
|
|
|
739
957
|
|
|
740
958
|
|
|
741
959
|
describe('#logger', () => {
|
|
742
|
-
it ('
|
|
743
|
-
|
|
744
|
-
|
|
960
|
+
it ('returns a child of the passed logger, scoped to the request id', () => {
|
|
961
|
+
const childLogger = {};
|
|
962
|
+
const passedLogger = { child: jest.fn(() => childLogger) };
|
|
963
|
+
request.id = TestHelpers.Faker.Text.randomString();
|
|
964
|
+
|
|
965
|
+
const c = new FooController(request, response, passedLogger);
|
|
745
966
|
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
const id2 = TestHelpers.Faker.Text.randomString();
|
|
749
|
-
const controller1 = new FooController({ id: id1 }, response);
|
|
750
|
-
const controller2 = new FooController({ id: id2 }, response);
|
|
751
|
-
expect(controller1.logger.id).toBe(id1);
|
|
752
|
-
expect(controller2.logger.id).toBe(id2);
|
|
967
|
+
expect(passedLogger.child).toHaveBeenCalledWith(request.id);
|
|
968
|
+
expect(c.logger).toBe(childLogger);
|
|
753
969
|
});
|
|
754
970
|
});
|
|
755
971
|
|