@unito/integration-sdk 1.0.26 → 1.0.28
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/dist/src/helpers.d.ts +2 -2
- package/dist/src/helpers.js +2 -2
- package/dist/src/index.cjs +267 -215
- package/dist/src/integration.js +8 -8
- package/dist/src/middlewares/correlationId.d.ts +2 -2
- package/dist/src/middlewares/correlationId.js +3 -3
- package/dist/src/middlewares/credentials.d.ts +2 -2
- package/dist/src/middlewares/credentials.js +3 -3
- package/dist/src/middlewares/errors.d.ts +2 -2
- package/dist/src/middlewares/errors.js +3 -3
- package/dist/src/middlewares/filters.d.ts +2 -2
- package/dist/src/middlewares/filters.js +4 -4
- package/dist/src/middlewares/finish.d.ts +2 -2
- package/dist/src/middlewares/finish.js +3 -3
- package/dist/src/middlewares/logger.d.ts +2 -2
- package/dist/src/middlewares/logger.js +3 -3
- package/dist/src/middlewares/notFound.d.ts +2 -2
- package/dist/src/middlewares/notFound.js +3 -3
- package/dist/src/middlewares/secrets.d.ts +2 -2
- package/dist/src/middlewares/secrets.js +3 -3
- package/dist/src/middlewares/selects.d.ts +2 -2
- package/dist/src/middlewares/selects.js +3 -3
- package/dist/src/middlewares/signal.d.ts +2 -2
- package/dist/src/middlewares/signal.js +3 -3
- package/dist/src/middlewares/{requestStartTime.d.ts → start.d.ts} +2 -2
- package/dist/src/middlewares/{requestStartTime.js → start.js} +3 -3
- package/dist/src/resources/logger.d.ts +2 -1
- package/dist/src/resources/logger.js +59 -7
- package/dist/test/middlewares/correlationId.test.js +3 -3
- package/dist/test/middlewares/credentials.test.js +4 -4
- package/dist/test/middlewares/errors.test.js +4 -4
- package/dist/test/middlewares/filters.test.js +20 -12
- package/dist/test/middlewares/finish.test.js +4 -4
- package/dist/test/middlewares/logger.test.js +5 -5
- package/dist/test/middlewares/notFound.test.js +2 -2
- package/dist/test/middlewares/secrets.test.js +3 -3
- package/dist/test/middlewares/selects.test.js +3 -3
- package/dist/test/middlewares/signal.test.js +3 -3
- package/dist/test/middlewares/start.test.d.ts +1 -0
- package/dist/test/middlewares/start.test.js +11 -0
- package/dist/test/resources/logger.test.js +71 -45
- package/package.json +1 -1
- package/src/helpers.ts +2 -2
- package/src/integration.ts +8 -8
- package/src/middlewares/correlationId.ts +3 -3
- package/src/middlewares/credentials.ts +3 -3
- package/src/middlewares/errors.ts +3 -3
- package/src/middlewares/filters.ts +4 -4
- package/src/middlewares/finish.ts +3 -3
- package/src/middlewares/logger.ts +3 -3
- package/src/middlewares/notFound.ts +3 -3
- package/src/middlewares/secrets.ts +3 -3
- package/src/middlewares/selects.ts +3 -3
- package/src/middlewares/signal.ts +3 -3
- package/src/middlewares/{requestStartTime.ts → start.ts} +3 -3
- package/src/resources/logger.ts +66 -8
- package/test/middlewares/correlationId.test.ts +3 -3
- package/test/middlewares/credentials.test.ts +4 -4
- package/test/middlewares/errors.test.ts +4 -4
- package/test/middlewares/filters.test.ts +31 -12
- package/test/middlewares/finish.test.ts +4 -4
- package/test/middlewares/logger.test.ts +5 -5
- package/test/middlewares/notFound.test.ts +2 -2
- package/test/middlewares/secrets.test.ts +3 -3
- package/test/middlewares/selects.test.ts +3 -3
- package/test/middlewares/signal.test.ts +3 -3
- package/test/middlewares/start.test.ts +14 -0
- package/test/resources/logger.test.ts +82 -47
|
@@ -2,32 +2,51 @@ import { OperatorType } from '@unito/integration-api';
|
|
|
2
2
|
import express from 'express';
|
|
3
3
|
import assert from 'node:assert/strict';
|
|
4
4
|
import { describe, it } from 'node:test';
|
|
5
|
-
import
|
|
5
|
+
import extractFilters from '../../src/middlewares/filters.js';
|
|
6
6
|
|
|
7
7
|
describe('filters middleware', () => {
|
|
8
|
-
it('
|
|
9
|
-
|
|
8
|
+
it('properly parse operators', () => {
|
|
9
|
+
Object.values(OperatorType).forEach(operator => {
|
|
10
|
+
const request = {
|
|
11
|
+
query: { filter: `aKey${operator}value` },
|
|
12
|
+
} as express.Request<
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
14
|
+
any,
|
|
15
|
+
object,
|
|
16
|
+
object,
|
|
17
|
+
{ filter: string }
|
|
18
|
+
>;
|
|
19
|
+
|
|
20
|
+
const response = { locals: {} } as express.Response;
|
|
21
|
+
|
|
22
|
+
extractFilters(request, response, () => {});
|
|
23
|
+
|
|
24
|
+
assert.deepEqual(response.locals, {
|
|
25
|
+
filters: [{ field: 'aKey', operator, values: ['value'] }],
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const request = {
|
|
30
|
+
query: { filter: `aKey!!` },
|
|
31
|
+
} as express.Request<
|
|
10
32
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
33
|
any,
|
|
12
34
|
object,
|
|
13
35
|
object,
|
|
14
36
|
{ filter: string }
|
|
15
37
|
>;
|
|
38
|
+
|
|
16
39
|
const response = { locals: {} } as express.Response;
|
|
17
40
|
|
|
18
|
-
|
|
41
|
+
extractFilters(request, response, () => {});
|
|
19
42
|
|
|
20
43
|
assert.deepEqual(response.locals, {
|
|
21
|
-
filters: [
|
|
22
|
-
{ field: 'status', operator: OperatorType.EQUAL, values: ['active', 'pending'] },
|
|
23
|
-
{ field: 'createdAt', operator: OperatorType.GREATER_THAN, values: ['2022-01-01'] },
|
|
24
|
-
{ field: 'email', operator: OperatorType.IS_NOT_NULL, values: [] },
|
|
25
|
-
],
|
|
44
|
+
filters: [{ field: 'aKey', operator: OperatorType.IS_NULL, values: [] }],
|
|
26
45
|
});
|
|
27
46
|
});
|
|
28
47
|
|
|
29
48
|
it('decodes URI components', () => {
|
|
30
|
-
const request = { query: { filter: 'status=foo%2Cbar
|
|
49
|
+
const request = { query: { filter: 'status=foo%2Cbar%21%21%2C%3Fbaz%3D!%3Equx' } } as express.Request<
|
|
31
50
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
51
|
any,
|
|
33
52
|
object,
|
|
@@ -36,7 +55,7 @@ describe('filters middleware', () => {
|
|
|
36
55
|
>;
|
|
37
56
|
const response = { locals: {} } as express.Response;
|
|
38
57
|
|
|
39
|
-
|
|
58
|
+
extractFilters(request, response, () => {});
|
|
40
59
|
|
|
41
60
|
assert.deepEqual(response.locals, {
|
|
42
61
|
filters: [{ field: 'status', operator: OperatorType.EQUAL, values: ['foo,bar!!,?baz=!>qux'] }],
|
|
@@ -47,7 +66,7 @@ describe('filters middleware', () => {
|
|
|
47
66
|
const request = { query: {} } as express.Request;
|
|
48
67
|
const response = { locals: {} } as express.Response;
|
|
49
68
|
|
|
50
|
-
|
|
69
|
+
extractFilters(request, response, () => {});
|
|
51
70
|
|
|
52
71
|
assert.deepEqual(response.locals, {
|
|
53
72
|
filters: [],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import onFinish from '../../src/middlewares/finish.js';
|
|
5
5
|
|
|
6
6
|
describe('finish middleware', () => {
|
|
7
7
|
it('logs info', () => {
|
|
@@ -24,7 +24,7 @@ describe('finish middleware', () => {
|
|
|
24
24
|
statusCode: 200,
|
|
25
25
|
} as express.Response;
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
onFinish(request, response, () => {});
|
|
28
28
|
eventHandler();
|
|
29
29
|
|
|
30
30
|
assert.equal(expected, 'works!');
|
|
@@ -50,7 +50,7 @@ describe('finish middleware', () => {
|
|
|
50
50
|
statusCode: 500,
|
|
51
51
|
} as express.Response;
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
onFinish(request, response, () => {});
|
|
54
54
|
eventHandler();
|
|
55
55
|
|
|
56
56
|
assert.equal(expected, 'works!');
|
|
@@ -76,7 +76,7 @@ describe('finish middleware', () => {
|
|
|
76
76
|
statusCode: 200,
|
|
77
77
|
} as express.Response;
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
onFinish(request, response, () => {});
|
|
80
80
|
eventHandler();
|
|
81
81
|
|
|
82
82
|
assert.equal(expected, '');
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import injectLogger from '../../src/middlewares/logger.js';
|
|
5
5
|
|
|
6
6
|
describe('logger middleware', () => {
|
|
7
7
|
it('initializes', () => {
|
|
8
8
|
const request = { header: (_key: string) => undefined } as express.Request;
|
|
9
9
|
const response = { locals: {} } as express.Response;
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
injectLogger(request, response, () => {});
|
|
12
12
|
|
|
13
13
|
assert.deepEqual(response.locals.logger.getMetadata(), {
|
|
14
14
|
correlation_id: undefined,
|
|
@@ -19,7 +19,7 @@ describe('logger middleware', () => {
|
|
|
19
19
|
const request = { header: (_key: string) => undefined } as express.Request;
|
|
20
20
|
const response = { locals: { correlationId: '123' } } as express.Response;
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
injectLogger(request, response, () => {});
|
|
23
23
|
|
|
24
24
|
assert.deepEqual(response.locals.logger.getMetadata(), {
|
|
25
25
|
correlation_id: '123',
|
|
@@ -34,7 +34,7 @@ describe('logger middleware', () => {
|
|
|
34
34
|
const request = { header: (_key: string) => additional } as express.Request;
|
|
35
35
|
const response = { locals: { correlationId: '123' } } as express.Response;
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
injectLogger(request, response, () => {});
|
|
38
38
|
|
|
39
39
|
assert.deepEqual(response.locals.logger.getMetadata(), {
|
|
40
40
|
correlation_id: '123',
|
|
@@ -46,7 +46,7 @@ describe('logger middleware', () => {
|
|
|
46
46
|
const request = { header: (_key: string) => 'nope' } as express.Request;
|
|
47
47
|
const response = { locals: { correlationId: '123' } } as express.Response;
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
injectLogger(request, response, () => {});
|
|
50
50
|
|
|
51
51
|
assert.deepEqual(response.locals.logger.getMetadata(), {
|
|
52
52
|
correlation_id: '123',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import notFound from '../../src/middlewares/notFound.js';
|
|
5
5
|
|
|
6
6
|
describe('notFound middleware', () => {
|
|
7
7
|
it('respond with error without calling next', () => {
|
|
@@ -21,7 +21,7 @@ describe('notFound middleware', () => {
|
|
|
21
21
|
},
|
|
22
22
|
locals: { logger: { error: () => undefined } },
|
|
23
23
|
} as unknown as express.Response;
|
|
24
|
-
|
|
24
|
+
notFound({ path: 'unknownPath' } as express.Request, response, () => {
|
|
25
25
|
throw new Error('next should not be called');
|
|
26
26
|
});
|
|
27
27
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import extractSecrets from '../../src/middlewares/secrets.js';
|
|
5
5
|
import { BadRequestError } from '../../src/httpErrors.js';
|
|
6
6
|
|
|
7
7
|
describe('secrets middleware', () => {
|
|
@@ -15,7 +15,7 @@ describe('secrets middleware', () => {
|
|
|
15
15
|
const request = { header: (_key: string) => secrets } as express.Request;
|
|
16
16
|
const response = { locals: {} } as express.Response;
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
extractSecrets(request, response, () => {});
|
|
19
19
|
|
|
20
20
|
assert.deepEqual(response.locals, {
|
|
21
21
|
secrets: {
|
|
@@ -28,7 +28,7 @@ describe('secrets middleware', () => {
|
|
|
28
28
|
const request = { header: (_key: string) => 'nope' } as express.Request;
|
|
29
29
|
const response = { locals: {} } as express.Response;
|
|
30
30
|
|
|
31
|
-
assert.throws(() =>
|
|
31
|
+
assert.throws(() => extractSecrets(request, response, () => {}), BadRequestError);
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
it('undefined', () => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import extractSelects from '../../src/middlewares/selects.js';
|
|
5
5
|
|
|
6
6
|
describe('selects middleware', () => {
|
|
7
7
|
it('data', () => {
|
|
@@ -14,7 +14,7 @@ describe('selects middleware', () => {
|
|
|
14
14
|
>;
|
|
15
15
|
const response = { locals: {} } as express.Response;
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
extractSelects(request, response, () => {});
|
|
18
18
|
|
|
19
19
|
assert.deepEqual(response.locals, {
|
|
20
20
|
selects: ['foo', 'bar.spam', 'baz'],
|
|
@@ -25,7 +25,7 @@ describe('selects middleware', () => {
|
|
|
25
25
|
const request = { query: {} } as express.Request;
|
|
26
26
|
const response = { locals: {} } as express.Response;
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
extractSelects(request, response, () => {});
|
|
29
29
|
|
|
30
30
|
assert.deepEqual(response.locals, {
|
|
31
31
|
selects: [],
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
2
|
import assert from 'node:assert/strict';
|
|
3
3
|
import { describe, it } from 'node:test';
|
|
4
|
-
import
|
|
4
|
+
import extractOperationDeadline from '../../src/middlewares/signal.js';
|
|
5
5
|
|
|
6
6
|
describe('signal middleware', () => {
|
|
7
7
|
it('uses header', () => {
|
|
@@ -10,7 +10,7 @@ describe('signal middleware', () => {
|
|
|
10
10
|
const request = { header: (_key: string) => deadline } as unknown as express.Request;
|
|
11
11
|
const response = { locals: {} } as express.Response;
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
extractOperationDeadline(request, response, () => {});
|
|
14
14
|
|
|
15
15
|
assert.ok(response.locals.signal instanceof AbortSignal);
|
|
16
16
|
assert.equal(response.locals.signal.aborted, false);
|
|
@@ -20,7 +20,7 @@ describe('signal middleware', () => {
|
|
|
20
20
|
const request = { header: (_key: string) => undefined } as unknown as express.Request;
|
|
21
21
|
const response = { locals: {} } as express.Response;
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
extractOperationDeadline(request, response, () => {});
|
|
24
24
|
|
|
25
25
|
assert.ok(response.locals.signal instanceof AbortSignal);
|
|
26
26
|
assert.equal(response.locals.signal.aborted, false);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { describe, it } from 'node:test';
|
|
4
|
+
import start from '../../src/middlewares/start.js';
|
|
5
|
+
|
|
6
|
+
describe('start middleware', () => {
|
|
7
|
+
it('adds request start time to locals', () => {
|
|
8
|
+
const request = {} as express.Request;
|
|
9
|
+
const response = { locals: {} } as express.Response;
|
|
10
|
+
|
|
11
|
+
start(request, response, () => {});
|
|
12
|
+
assert.ok(response.locals.requestStartTime);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
@@ -41,96 +41,131 @@ describe('Logger', () => {
|
|
|
41
41
|
assert.strictEqual(logSpy.mock.calls.length, 0);
|
|
42
42
|
logger.log('test');
|
|
43
43
|
assert.strictEqual(logSpy.mock.calls.length, 1);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
]);
|
|
44
|
+
let actual = JSON.parse(logSpy.mock.calls[0]?.arguments[0]);
|
|
45
|
+
assert.ok(actual['date']);
|
|
46
|
+
assert.equal(actual['correlation_id'], '123456789');
|
|
47
|
+
assert.equal(actual['message'], 'test');
|
|
48
|
+
assert.equal(actual['status'], 'log');
|
|
47
49
|
|
|
48
50
|
const errorSpy = testContext.mock.method(global.console, 'error', () => {});
|
|
49
51
|
assert.strictEqual(errorSpy.mock.calls.length, 0);
|
|
50
52
|
logger.error('test');
|
|
51
53
|
assert.strictEqual(errorSpy.mock.calls.length, 1);
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
]);
|
|
54
|
+
actual = JSON.parse(errorSpy.mock.calls[0]?.arguments[0]);
|
|
55
|
+
assert.ok(actual['date']);
|
|
56
|
+
assert.equal(actual['correlation_id'], '123456789');
|
|
57
|
+
assert.equal(actual['message'], 'test');
|
|
58
|
+
assert.equal(actual['status'], 'error');
|
|
55
59
|
|
|
56
60
|
const warnSpy = testContext.mock.method(global.console, 'warn', () => {});
|
|
57
61
|
assert.strictEqual(warnSpy.mock.calls.length, 0);
|
|
58
62
|
logger.warn('test');
|
|
59
63
|
assert.strictEqual(warnSpy.mock.calls.length, 1);
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
]);
|
|
64
|
+
actual = JSON.parse(warnSpy.mock.calls[0]?.arguments[0]);
|
|
65
|
+
assert.ok(actual['date']);
|
|
66
|
+
assert.equal(actual['correlation_id'], '123456789');
|
|
67
|
+
assert.equal(actual['message'], 'test');
|
|
68
|
+
assert.equal(actual['status'], 'warn');
|
|
63
69
|
|
|
64
70
|
const infoSpy = testContext.mock.method(global.console, 'info', () => {});
|
|
65
71
|
assert.strictEqual(infoSpy.mock.calls.length, 0);
|
|
66
72
|
logger.info('test');
|
|
67
73
|
assert.strictEqual(infoSpy.mock.calls.length, 1);
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
]);
|
|
74
|
+
actual = JSON.parse(infoSpy.mock.calls[0]?.arguments[0]);
|
|
75
|
+
assert.ok(actual['date']);
|
|
76
|
+
assert.equal(actual['correlation_id'], '123456789');
|
|
77
|
+
assert.equal(actual['message'], 'test');
|
|
78
|
+
assert.equal(actual['status'], 'info');
|
|
71
79
|
|
|
72
80
|
const debugSpy = testContext.mock.method(global.console, 'debug', () => {});
|
|
73
81
|
assert.strictEqual(debugSpy.mock.calls.length, 0);
|
|
74
82
|
logger.debug('test');
|
|
75
83
|
assert.strictEqual(debugSpy.mock.calls.length, 1);
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
]);
|
|
84
|
+
actual = JSON.parse(debugSpy.mock.calls[0]?.arguments[0]);
|
|
85
|
+
assert.ok(actual['date']);
|
|
86
|
+
assert.equal(actual['correlation_id'], '123456789');
|
|
87
|
+
assert.equal(actual['message'], 'test');
|
|
88
|
+
assert.equal(actual['status'], 'debug');
|
|
79
89
|
});
|
|
80
90
|
|
|
81
91
|
it('merges message payload with metadata', testContext => {
|
|
82
|
-
const metadata = { correlation_id: '123456789', http: { method: 'GET' } };
|
|
83
|
-
const logger = new Logger(metadata);
|
|
84
|
-
|
|
85
92
|
const logSpy = testContext.mock.method(global.console, 'log', () => {});
|
|
86
93
|
assert.strictEqual(logSpy.mock.calls.length, 0);
|
|
94
|
+
|
|
95
|
+
const metadata = { correlation_id: '123456789', http: { method: 'GET' } };
|
|
96
|
+
const logger = new Logger(metadata);
|
|
87
97
|
logger.log('test', { error: { code: '200', message: 'Page Not Found' } });
|
|
88
98
|
assert.strictEqual(logSpy.mock.calls.length, 1);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
]);
|
|
99
|
+
|
|
100
|
+
const actual = JSON.parse(logSpy.mock.calls[0]?.arguments[0]);
|
|
101
|
+
|
|
102
|
+
assert.ok(actual['date']);
|
|
103
|
+
assert.equal(actual['correlation_id'], '123456789');
|
|
104
|
+
assert.equal(actual['message'], 'test');
|
|
105
|
+
assert.equal(actual['status'], 'log');
|
|
106
|
+
assert.deepEqual(actual['http'], { method: 'GET' });
|
|
107
|
+
assert.deepEqual(actual['error'], { code: '200', message: 'Page Not Found' });
|
|
98
108
|
});
|
|
99
109
|
|
|
100
110
|
it('overwrites conflicting metadata keys (1st level) with message payload', testContext => {
|
|
101
|
-
const metadata = { correlation_id: '123456789', http: { method: 'GET' } };
|
|
102
|
-
const logger = new Logger(metadata);
|
|
103
|
-
|
|
104
111
|
const logSpy = testContext.mock.method(global.console, 'log', () => {});
|
|
105
112
|
assert.strictEqual(logSpy.mock.calls.length, 0);
|
|
113
|
+
|
|
114
|
+
const metadata = { correlation_id: '123456789', http: { method: 'GET' } };
|
|
115
|
+
const logger = new Logger(metadata);
|
|
106
116
|
logger.log('test', { http: { status_code: 200 } });
|
|
107
117
|
assert.strictEqual(logSpy.mock.calls.length, 1);
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
]);
|
|
118
|
+
|
|
119
|
+
const actual = JSON.parse(logSpy.mock.calls[0]?.arguments[0]);
|
|
120
|
+
|
|
121
|
+
assert.ok(actual['date']);
|
|
122
|
+
assert.equal(actual['correlation_id'], '123456789');
|
|
123
|
+
assert.equal(actual['message'], 'test');
|
|
124
|
+
assert.equal(actual['status'], 'log');
|
|
125
|
+
assert.deepEqual(actual['http'], { status_code: 200 });
|
|
116
126
|
});
|
|
117
127
|
|
|
118
128
|
it('snakify keys of Message and Metadata', testContext => {
|
|
129
|
+
const logSpy = testContext.mock.method(global.console, 'log', () => {});
|
|
130
|
+
assert.strictEqual(logSpy.mock.calls.length, 0);
|
|
131
|
+
|
|
119
132
|
const metadata = { correlationId: '123456789', http: { method: 'GET', statusCode: 200 } };
|
|
120
133
|
const logger = new Logger(metadata);
|
|
134
|
+
logger.log('test', { errorContext: { errorCode: 200, errorMessage: 'Page Not Found' } });
|
|
135
|
+
assert.strictEqual(logSpy.mock.calls.length, 1);
|
|
121
136
|
|
|
137
|
+
const actual = JSON.parse(logSpy.mock.calls[0]?.arguments[0]);
|
|
138
|
+
|
|
139
|
+
assert.ok(actual['date']);
|
|
140
|
+
assert.equal(actual['correlation_id'], '123456789');
|
|
141
|
+
assert.equal(actual['message'], 'test');
|
|
142
|
+
assert.equal(actual['status'], 'log');
|
|
143
|
+
assert.deepEqual(actual['http'], { method: 'GET', status_code: 200 });
|
|
144
|
+
assert.deepEqual(actual['error_context'], { error_code: 200, error_message: 'Page Not Found' });
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('prunes sensitive Metadata', testContext => {
|
|
122
148
|
const logSpy = testContext.mock.method(global.console, 'log', () => {});
|
|
123
149
|
assert.strictEqual(logSpy.mock.calls.length, 0);
|
|
150
|
+
|
|
151
|
+
const metadata = {
|
|
152
|
+
correlationId: '123456789',
|
|
153
|
+
http: { method: 'GET', statusCode: 200, jwt: 'deepSecret' },
|
|
154
|
+
user: { contact: { email: 'deep_deep_deep@email.address', firstName: 'should be snakify then hidden' } },
|
|
155
|
+
access_token: 'secret',
|
|
156
|
+
};
|
|
157
|
+
const logger = new Logger(metadata);
|
|
124
158
|
logger.log('test', { errorContext: { errorCode: 200, errorMessage: 'Page Not Found' } });
|
|
125
159
|
assert.strictEqual(logSpy.mock.calls.length, 1);
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
]);
|
|
160
|
+
|
|
161
|
+
const actual = JSON.parse(logSpy.mock.calls[0]?.arguments[0]);
|
|
162
|
+
assert.ok(actual['date']);
|
|
163
|
+
assert.equal(actual['correlation_id'], '123456789');
|
|
164
|
+
assert.equal(actual['message'], 'test');
|
|
165
|
+
assert.equal(actual['status'], 'log');
|
|
166
|
+
assert.equal(actual['has_sensitive_attribute'], true);
|
|
167
|
+
assert.equal(actual['access_token'], '[REDACTED]');
|
|
168
|
+
assert.deepEqual(actual['http'], { method: 'GET', status_code: 200, jwt: '[REDACTED]' });
|
|
169
|
+
assert.deepEqual(actual['user']['contact'], { email: '[REDACTED]', first_name: '[REDACTED]' });
|
|
135
170
|
});
|
|
136
171
|
});
|