@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.
Files changed (68) hide show
  1. package/dist/src/helpers.d.ts +2 -2
  2. package/dist/src/helpers.js +2 -2
  3. package/dist/src/index.cjs +267 -215
  4. package/dist/src/integration.js +8 -8
  5. package/dist/src/middlewares/correlationId.d.ts +2 -2
  6. package/dist/src/middlewares/correlationId.js +3 -3
  7. package/dist/src/middlewares/credentials.d.ts +2 -2
  8. package/dist/src/middlewares/credentials.js +3 -3
  9. package/dist/src/middlewares/errors.d.ts +2 -2
  10. package/dist/src/middlewares/errors.js +3 -3
  11. package/dist/src/middlewares/filters.d.ts +2 -2
  12. package/dist/src/middlewares/filters.js +4 -4
  13. package/dist/src/middlewares/finish.d.ts +2 -2
  14. package/dist/src/middlewares/finish.js +3 -3
  15. package/dist/src/middlewares/logger.d.ts +2 -2
  16. package/dist/src/middlewares/logger.js +3 -3
  17. package/dist/src/middlewares/notFound.d.ts +2 -2
  18. package/dist/src/middlewares/notFound.js +3 -3
  19. package/dist/src/middlewares/secrets.d.ts +2 -2
  20. package/dist/src/middlewares/secrets.js +3 -3
  21. package/dist/src/middlewares/selects.d.ts +2 -2
  22. package/dist/src/middlewares/selects.js +3 -3
  23. package/dist/src/middlewares/signal.d.ts +2 -2
  24. package/dist/src/middlewares/signal.js +3 -3
  25. package/dist/src/middlewares/{requestStartTime.d.ts → start.d.ts} +2 -2
  26. package/dist/src/middlewares/{requestStartTime.js → start.js} +3 -3
  27. package/dist/src/resources/logger.d.ts +2 -1
  28. package/dist/src/resources/logger.js +59 -7
  29. package/dist/test/middlewares/correlationId.test.js +3 -3
  30. package/dist/test/middlewares/credentials.test.js +4 -4
  31. package/dist/test/middlewares/errors.test.js +4 -4
  32. package/dist/test/middlewares/filters.test.js +20 -12
  33. package/dist/test/middlewares/finish.test.js +4 -4
  34. package/dist/test/middlewares/logger.test.js +5 -5
  35. package/dist/test/middlewares/notFound.test.js +2 -2
  36. package/dist/test/middlewares/secrets.test.js +3 -3
  37. package/dist/test/middlewares/selects.test.js +3 -3
  38. package/dist/test/middlewares/signal.test.js +3 -3
  39. package/dist/test/middlewares/start.test.d.ts +1 -0
  40. package/dist/test/middlewares/start.test.js +11 -0
  41. package/dist/test/resources/logger.test.js +71 -45
  42. package/package.json +1 -1
  43. package/src/helpers.ts +2 -2
  44. package/src/integration.ts +8 -8
  45. package/src/middlewares/correlationId.ts +3 -3
  46. package/src/middlewares/credentials.ts +3 -3
  47. package/src/middlewares/errors.ts +3 -3
  48. package/src/middlewares/filters.ts +4 -4
  49. package/src/middlewares/finish.ts +3 -3
  50. package/src/middlewares/logger.ts +3 -3
  51. package/src/middlewares/notFound.ts +3 -3
  52. package/src/middlewares/secrets.ts +3 -3
  53. package/src/middlewares/selects.ts +3 -3
  54. package/src/middlewares/signal.ts +3 -3
  55. package/src/middlewares/{requestStartTime.ts → start.ts} +3 -3
  56. package/src/resources/logger.ts +66 -8
  57. package/test/middlewares/correlationId.test.ts +3 -3
  58. package/test/middlewares/credentials.test.ts +4 -4
  59. package/test/middlewares/errors.test.ts +4 -4
  60. package/test/middlewares/filters.test.ts +31 -12
  61. package/test/middlewares/finish.test.ts +4 -4
  62. package/test/middlewares/logger.test.ts +5 -5
  63. package/test/middlewares/notFound.test.ts +2 -2
  64. package/test/middlewares/secrets.test.ts +3 -3
  65. package/test/middlewares/selects.test.ts +3 -3
  66. package/test/middlewares/signal.test.ts +3 -3
  67. package/test/middlewares/start.test.ts +14 -0
  68. 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 middleware from '../../src/middlewares/filters.js';
5
+ import extractFilters from '../../src/middlewares/filters.js';
6
6
 
7
7
  describe('filters middleware', () => {
8
- it('data', () => {
9
- const request = { query: { filter: 'status=active|pending,createdAt>2022-01-01,email!!' } } as express.Request<
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
- middleware(request, response, () => {});
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!!%2C%3Fbaz%3D!%3Equx' } } as express.Request<
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
- middleware(request, response, () => {});
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
- middleware(request, response, () => {});
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 middleware from '../../src/middlewares/finish.js';
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
- middleware(request, response, () => {});
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
- middleware(request, response, () => {});
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
- middleware(request, response, () => {});
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 middleware from '../../src/middlewares/logger.js';
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
- middleware(request, response, () => {});
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
- middleware(request, response, () => {});
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
- middleware(request, response, () => {});
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
- middleware(request, response, () => {});
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 middleware from '../../src/middlewares/notFound.js';
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
- middleware({ path: 'unknownPath' } as express.Request, response, () => {
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 middleware from '../../src/middlewares/secrets.js';
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
- middleware(request, response, () => {});
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(() => middleware(request, response, () => {}), BadRequestError);
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 middleware from '../../src/middlewares/selects.js';
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
- middleware(request, response, () => {});
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
- middleware(request, response, () => {});
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 middleware from '../../src/middlewares/signal.js';
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
- middleware(request, response, () => {});
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
- middleware(request, response, () => {});
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
- assert.deepEqual(logSpy.mock.calls[0]?.arguments, [
45
- JSON.stringify({ correlation_id: '123456789', message: 'test', status: 'log' }),
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
- assert.deepEqual(errorSpy.mock.calls[0]?.arguments, [
53
- JSON.stringify({ correlation_id: '123456789', message: 'test', status: 'error' }),
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
- assert.deepEqual(warnSpy.mock.calls[0]?.arguments, [
61
- JSON.stringify({ correlation_id: '123456789', message: 'test', status: 'warn' }),
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
- assert.deepEqual(infoSpy.mock.calls[0]?.arguments, [
69
- JSON.stringify({ correlation_id: '123456789', message: 'test', status: 'info' }),
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
- assert.deepEqual(debugSpy.mock.calls[0]?.arguments, [
77
- JSON.stringify({ correlation_id: '123456789', message: 'test', status: 'debug' }),
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
- assert.deepEqual(logSpy.mock.calls[0]?.arguments, [
90
- JSON.stringify({
91
- correlation_id: '123456789',
92
- http: { method: 'GET' },
93
- error: { code: '200', message: 'Page Not Found' },
94
- message: 'test',
95
- status: 'log',
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
- assert.deepEqual(logSpy.mock.calls[0]?.arguments, [
109
- JSON.stringify({
110
- correlation_id: '123456789',
111
- http: { status_code: 200 },
112
- message: 'test',
113
- status: 'log',
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
- assert.deepEqual(logSpy.mock.calls[0]?.arguments, [
127
- JSON.stringify({
128
- correlation_id: '123456789',
129
- http: { method: 'GET', status_code: 200 },
130
- error_context: { error_code: 200, error_message: 'Page Not Found' },
131
- message: 'test',
132
- status: 'log',
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
  });